buu-[RoarCTF 2019]Easy Calc

buu-[RoarCTF 2019]Easy Calc

转载自 https://www.cnblogs.com/c0d1/p/14876384.html

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

img

查看一下源代码

发现了一串代码

img

.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传数字行

img

给num传字母则不行

img

应该是waf的原因

然后就不会了。。

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

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

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

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

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

试试看能不能行

img

成功绕过了

接下来就是执行命令了

img

忘记前面过滤掉“/"了

可以使用chr(47)来绕过

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

成功了

img

发现了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

img

EOF

img

本文作者c0d1
本文链接https://www.cnblogs.com/c0d1/p/14876384.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

posted @ 2021-11-24 15:30  sherlson  阅读(66)  评论(0)    收藏  举报