BUUCTF-web-[RoarCTF 2019]Easy Calc

BUUCTF-web-[RoarCTF 2019]Easy Calc_第1张图片有一段注释说这题有WAF,那肯定思路就是如何绕过WAF拿到flag了
BUUCTF-web-[RoarCTF 2019]Easy Calc_第2张图片进入题目是一个计算器,只能输入正常的数学计算式,字母什么的都输入不了,回显计算不出来,查看源码,发现是在calc.php里面计算的,而且提示说存在Waf,这些字母应该就是Waf过滤的,访问calc.php
BUUCTF-web-[RoarCTF 2019]Easy Calc_第3张图片

<?php
error_reporting(0);
if(!isset($_GET['num'])){
    show_source(__FILE__);
}else{
        $str = $_GET['num'];
        $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];//过滤了很多字符,num不能是字母
        foreach ($blacklist as $blackitem) {
                if (preg_match('/' . $blackitem . '/m', $str)) {
                        die("what are you want to do?");
                }
        }
        eval('echo '.$str.';');
}
?>

于是我们有了大概思路,传入num参数,再想办法绕过过滤,之后利用eval()函数即可
BUUCTF-web-[RoarCTF 2019]Easy Calc_第4张图片这里可以利用PHP字符串解析特性Bypass
具体文章可以参考,讲的很不错

https://www.freebuf.com/articles/web/213359.html

PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1.删除空白符
2.将某些字符转换为下划线(包括空格)
所以我们可以在num前加个空格绕过waf
BUUCTF-web-[RoarCTF 2019]Easy Calc_第5张图片页面正常返回了abc,说明成功绕过了num参数限制
BUUCTF-web-[RoarCTF 2019]Easy Calc_第6张图片这里要提到两个php函数
scandir():列出参数目录中的文件和目录
readfile():读取文件内容
利用scandir()找到flag在哪,再利用readfile()读取文件内容,从而得到flag
BUUCTF-web-[RoarCTF 2019]Easy Calc_第7张图片chr(47) ==> /,绕过过滤。
47对于ASCII码就是 “/”,因为我们要从根目录开始找flag所在文件
BUUCTF-web-[RoarCTF 2019]Easy Calc_第8张图片发现f1agg文件,于是进一步readfile()查看,一样还是要绕过过滤
BUUCTF-web-[RoarCTF 2019]Easy Calc_第9张图片也可以使用file_get_contents()这个函数
BUUCTF-web-[RoarCTF 2019]Easy Calc_第10张图片

你可能感兴趣的:(CTF)