hate_php
打开以后,是一段php代码
1 |
|
开始解读:
GET方式接受code
若code非空,则$code = $_GET['code'];
preg_match(,)前一个参数是个正则表达式,后一个为要验证的字符串
正则表达式"/[A-Za-z0-9_$@]+/"
的意思是:A到Z,a到z,0到9,加上”_””$””@”这几个字符。
凡是有这些字符的code直接die
然后才会php运行code(eval)
如果没有后面那几个字符的限制,可以尝试“异或绕过”
然后通过$
拼接指令(比如上例的构造phpinfo())
也可以尝试“取反绕过”
?code=$=~%98%9A%8B%B9%93%9E%98;$();
(上面的url都是一些不可见字符,但是取反(~)后却是:“getFlag”)
所以这里只能用“通配符”
这里首先要说明,linux的所有指令都存储在文件夹里
比如常用的“cat”指令
也可以用/bin/cat来代替
然后就是linux的指令以及文件,可以用通配符*和?来代替
前者可代替不限字数的字符,后者代替一个字符
(但是代替有个前提,搜索结果唯一或可以同时操作)
所以/bin/cat 可以用/***/***代替
然后就是盲猜flag在/flag文件夹下
构造payload:code=?><?=`/???/??? /????`?>
(就算不猜,也可以猜字符位数然后试?的个数,还有文件的层数)
搜索得到flag
参考:https://www.cnblogs.com/v01cano/p/11736722.html
还有这个大神:https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html#glob
还有这个是整理的最全的,附带例题:https://xz.aliyun.com/t/8107#toc-11