urldecode()二次解码引发注入

        PHP中常用过滤函数如addslashes()、mysql_real_escape_string()、mysql_escape_string()或者使用魔术引号GPC开关来防止注入,原理都是给单引号(’)、双引号(”)、反斜杠(\)和NULL等特殊字符前面加上反斜杠来进行转义。

        但是这些函数在遇到urldecode()函数时,就会因为二次解码引发注入。urldecode()函数是对已编码的URL进行解码。引发注入的原因其实很简单,PHP本身在处理提交的数据之前会进行一次解码,例如/test.php?id=1这个URL,我们构造字符串/test.php?id=1%2527,PHP第一次解码,%25解码成了%,于是url变成了/test.php?id=%27;然后urldecode()函数又进行了一次解码,%27解码成了’,于是最终URL变成了/test.php?id=1’,单引号引发了注入。rawurldecode()也会产生同样的问题,因此这两个函数需要慎用。

        例子如下:

<?php
	header("Content-Type: text/html; charset=utf-8");

	$conn = mysql_connect('localhost', 'root', 'root');
	mysql_select_db("test", $conn);
	//mysql_query("SET NAMES 'gbk'", $conn);

	$id = mysql_real_escape_string($_GET['id']);
	$id = urldecode($id);
	$sql = "select * from test where id='$id'";
	$query = mysql_query($sql, $conn);
	if($query == True)
	{
		$result = mysql_fetch_array($query);
		$user = $result["user"];
		$email = $result["email"];

		print_r('用户名: ' . $user . '<br />');
		print_r('邮  箱: ' . $email . '<br />');
		print_r('<br />SQL语句:' . $sql);
	}

	mysql_close($conn);
?>

因为mysql_real_escape_string()是在urldecode()之前,所以并不能过滤由于urldecode()产生的单引号。

        普通的注入会被转义掉:


于是构造URL编码引发注入:

 

可以使用sqlmap来跑这个注入,不过必须把payload构造好,如下:

sqlmap -u"http://localhost/test/1.php?id=1%2527" --random-agent -v 3


感觉以后黑盒测试跑SQL注入可以在URL后面加上%2527,说不定就能瞎猫遇上死耗子碰到二次解码引发注入的情况。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值