RoarCTF_2019_Easy Calc

[RoarCTF 2019]Easy Calc

0x00 过程

看见一个页面:

查看源代码,发现计算式会以num参数提交给calc.php,并且设置了waf:

访问下calc.php,可以看到高亮的源码:

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

很直接地告诉我们要利用eval函数达成命令执行,但是在之前会有一个黑名单的过滤。也就是说除了设置了waf,程序本身还有一层过滤。如果是waf被触发,会返回403:

这里可以利用php的一个特性:

1
2
3
4
//waf检测到num参数含有字符串,拒绝访问
http://node4.buuoj.cn:28058/calc.php?num=abcd
//waf检测不到num参数,放行
http://node4.buuoj.cn:28058/calc.php?+num=abcd

虽然我们将num参数前加了一个空格,但是在php解析过程中,会先把参数里的空格去掉,这样我们提交的参数值仍然可以走程序逻辑,这样就达到了一个绕waf的效果。

用chr字符拼接发现,system函数无法执行,这里使用var_dumpscandirfile_get_contents来命令执行。

scandir()函数返回指定目录中的文件和目录的数组。其中scandir(/)相当于ls /var_dump()相当于echo

var_dump(scandir(chr(47)))扫描根目录发现flag。

使用file_get_contents()拿到flag:


RoarCTF_2019_Easy Calc
https://k1nm0.com/2022/10/23/EasyCalc/
作者
K1nm0
发布于
2022年10月23日
许可协议