buu-[RoarCTF 2019]Easy Calc

点开题目,发现只是一个计算框

 

 查看一下源代码

发现了一串代码

.ajax是指通过http请求加载远程数据

 

输入的算式会被传进calc.php文件中

 且提示网页存在waf(就是防火墙)

访问cala.php试试

有一串php代码

 1 <?php
 2 error_reporting(0);
 3 if(!isset($_GET['num'])){
 4     show_source(__FILE__);
 5 }else{
 6         $str = $_GET['num'];
 7         $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
 8         foreach ($blacklist as $blackitem) {
 9                 if (preg_match('/' . $blackitem . '/m', $str)) {
10                         die("what are you want to do?");
11                 }
12         }
13         eval('echo '.$str.';');
14 }
15 ?>

其中foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。

有两种语法

foreach (iterable_expression as $value)
    statement
foreach (iterable_expression as $key => $value)
    statement    

这里顺便记一下正则表达式匹配的几个参数

/i (忽略大小写)
/g (全文查找出现的所有匹配字符)
/m (多行查找)
/gi(全文查找、忽略大小写)
/ig(全文查找、忽略大小写)

给num传数字行

 

 给num传字母则不行

 

 应该是waf的原因

然后就不会了。。

查了一下,可以利用php的解析规则来绕过

就是当php进行解析的时候,如果变量前有空格,就会删去空格再进行解析

而前面的黑名单中就没有考虑到这个状况

我们就可以在num的前面加个空格来绕过

因为这是我们的变量名就是“ num”而不是“num”了

试试看能不能行

 

 成功绕过了

接下来就是执行命令了

 

 忘记前面过滤掉“/"了

可以使用chr(47)来绕过

chr()就是返回当前整数代表的ascii字符,而chr(47)就是/

成功了

 

 发现了flagg文件夹,猜测flag就在这里

访问看看

这个可以用file_get_contents() 函数来读取

构造payload:? num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)));

成功得到flag

 

posted @ 2021-06-11 20:02  c0d1  阅读(128)  评论(0)    收藏  举报