出差学习中。。。
0x01 WooYun-2014-61361
先输入1,看下情况。 输入1'。 报错了,至少是可以报错注入了。继续尝试1 and 1=1,发现有waf过滤了。 继续尝试1=1,无报错。 猜测是将and过滤了,尝试使用大小写、内联注释、替换前后空格的方法均会被过滤,尝试编码绕过,使用urlencode就直接成功了。 其余过程不贴了,直接贴最后的数据。
0x02 源码分析
WooYun
-2014-61361 Source
<?php
if(isset($_GET['Submit'])){
inject_check(strtolower($_SERVER['QUERY_STRING']));
$id = $_GET['id'];
$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 inject_check($str) {
$check=preg_match('/select|order|insert|update|eval|document|delete|injection|jection|link|and|or|from|union|into|load_file|outfile|<script>/',$str);
if($check){
echo "<script>alert('Filtered!!!');window.history.go(-1);</script>";
exit();
}else{
return $str;
}
}
?>
可以看到,是先检查ID参数是否合法,然后直接带入SQL语句再执行的,由于用的preg_match函数匹配里面的关键字,所以这里直接用urlencode就可以绕过了。