宽字节SQL注入原理

来源:互联网 发布:c语言编程步骤 编辑:程序博客网 时间:2024/05/17 06:03

0x01:
经典的SQL注入利用的是没有任何防范措施的PHP使用SQL查询语句时可以通过URL输入造成该语句恒成立,从而可以获得数据库中的其他信息。
举个例子:

    <?php        $name=$_GET['name'];        $conn=mysql_connect('localhost','root','root');        if($conn==null){exit("connect error !<br>");}        mysql_select_db("aaa",$conn);        $sql="select * from a1 where name='".$name."'";        $result=mysql_query($sql,$conn);        while($val=mysql_fetch_row($result)){            print_r($val);            print("<br>");        }      ?>  

在这里,可以输入:
(1) http://127.0.0.1/test/t1.php?name=a‘or ‘a’=’a

(2) http://127.0.0.1/test/t1.php?name=a‘or 1=1 – %20

(3) http://127.0.0.1/test/t1.php?name=a‘or 1=1 – %23
造成or与左右操作数组成的表达式成立,从而查到了包含name这一项的所有数据。

0x02:
如果使用转义符号对传入变量进行过滤的话,则经典的SQL注入语句就不能生效了。
这些转义函数包括:

addslashes() :
函数返回在预定义字符之前添加反斜杠的字符串。 预定义字符是:

单引号(')双引号(")反斜杠(\)NULL

mysql_real_escape_string() :
函数转义 SQL 语句中使用的字符串中的特殊字符。

下列字符受影响:

\x00\n\r\'"\x1a

mysql_real_escape_string() :
函数转义 SQL 语句中使用的字符串中的特殊字符。

下列字符受影响:

\x00\n\r\'"\x1a

如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。

这时候,我们就只能利用另一种被称为宽字节注入的方法进行注入了。

0x03:
宽字符是指多个字节宽度的编码,如UNICODE、GBK、BIG5等。转义函数在对这些编码进行转义时会丢掉转义字符“\”(将它转换为%5C),你可以在它前面再输入一个单字符编码与它组成一个新的多字符编码,使得转义实际上没有发生作用(转义就是要留下“\”防范注入的)。
举个例子:
输入……php?name=a%df’ or 1=1;%20%23
转义函数会将%df’改成%df\’,如果你的编码是GBK,%df\’就对应着%df%5c’,在GBK中,这两个字节%df%5c又对应着一个汉字“運”,也就是说\已经失去了作用,a%df’被认为是a運’,成功消除了转义函数的影响。

0x04:
总结一下,可以进行宽字节注入的条件有两个:
(1)需要设置宽节字符集。
(2)这个宽字节字符集第二个字符编码的%5c与第一个字符编码组成的多字符编码要有意义。

0x05:
举一个典型的宽字节注入例子:

<?php  $name=$_GET['name'];$name=addslashes($name);$conn = mysqli_connect('localhost', 'root', 'root', 'test');//连接MySQL服务if (!$conn) {    die('Could not connect to MySQL: ' . mysqli_connect_error()); } $conn->set_charset("GBK");@mysql_select_db("test",$conn);$sql="select * from user where username='".$name."'";$result=mysqli_query($conn,$sql);@$row = mysqli_fetch_assoc($result);echo "Hello ".$row['username']."</br>";echo "Your password is:".$row['password']."</br>";?>

若将这段代码保存为1.php,数据库如图设置:
这里写图片描述
则注入语句:
..php?name=a%df’ or 1=1; %20%23
得到结果:
这里写图片描述

原创粉丝点击