Problem: [BJDCTF 2020]ZJCTF,不过如此
思路
-
解题大致思路
-
这里看别人写的wp很潦草只说了使用/S*={$getflag()}&cmd=phpinfo();
我找了好几个博客大佬的文章才找到一个说的详细且清楚的
-
https://www.cnblogs.com/l0vehzzz/p/16415836.html这里将这位博客大佬的文章网址放这里,大家自行观看
-
我将其中的一部分复制过来仅供参考:
这里的漏洞出在e模式下的preg_replace可以让第二个参数'替换字符串'当作代码执行,但是这里第二个参数是不可变的,但因为有这种特殊的情况,正则表达式模式或部分模式两边添加圆括号会将相关匹配存储到一个临时缓存区,并且从1开始排序,而strtolower("\1")正好表达的就是匹配区的第一个(\1=\1),从而我们如果匹配可以,则可以将函数实现。
比如我们传入 ?.*={${phpinfo()}}
原句:preg_replace('/(' . re . ')/ei','strtolower("\\1")',str); 就变成preg_replace('/(' .* ')/ei','strtolower("\1")',{${phpinfo()}});
又因为$_GET传入首字母是非法字符时候会把 .(点号)改成下划线,因此得将.换成\s
所有payload:?\S*=${getFlag()}&cmd=system('ls /');
虽然还是不知道为什么要换成S但已经可以懂一部分了
EXP
- 具体攻击代码
-
/next.php?\S*=${getflag()}&cmd=system('cat /flag');
总结
- 对该题的考点总结
