0x01 WooYun-2014-52257
输入1'后有报错 尝试注释后,仍然报错 感觉是整形注入,尝试1 and 1=2和1 and 1=1,有明显变化,确实是整形注入。 联合查询时显示有waf了union select 1,2 删除union不行,继续删除select,这次有报错了。 加上union,也会出现报错。 猜测问题在select上,尝试用大小写,双写,替换空格,编码,内联注释等绕过。 发现替换空格就行了,直接拿数据,-1 union/**/select/**/1,concat_ws("^",user,password) from users 感觉就是针对了select这个关键字做的过滤。
0x02 源码分析
WooYun
-2014-52257 Source
<?php
if(isset($_GET['Submit'])){
$id = $_GET['id'];
$id = trim(strtolower($id));
$test = _do_query_safe($id);
if($test != 1)
{
die('SQLi detected!');
}
$getid = "SELECT first_name, last_name FROM users WHERE user_id = $id";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
$num = mysql_numrows($result);
$i = 0;
while ($i < $num) {
$first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,"last_name");
echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>';
$i++;
}
}
function _do_query_safe($sql) {
$sql = preg_replace('/\/\*.*\*\//','',$sql);
if(strstr($sql,"select"))
{
return -1;
}
return 1;
}
?>
看完源码,我发现我错的有点离谱(完全是蒙对的),,, 这里写的很清楚了,/*(任意字符)*/全都被过滤,所以我的payload中的/**/select/**/刚刚好满足了这个要求,和空格其实没啥关系,我这纯属运气好。。。正确的应该payload应该是-1 union/*!select*/1,concat_ws("^",user,password) from users这种内联注释的方法。