知识点
- 伪协议读取文件
- 深入研究preg_replace与代码执行
/e模式的preg_replace,有一个远程代码执行漏洞:/e 修正符使 preg_replace() 将 replacement 参数(第二个参数,字符串)当作 PHP 代码执行(其实php双引号都能导致代码执行的)。
题解
先读取next.php的源码(与上题方法一样)
preg_replace('/(' . $regex . ')/ei', 'strtolower("\\1")', $value);
\\1
其实就是\1
,\1
表示取出正则匹配后的第一个括号内的字符(\2
也就是取出第二项)
接下来就要想办法调用getFlag()
并传入cmd参数
构造payload
next.php?\S*=${getFlag()}&cmd=system('cat /flag');
1、用$
包裹,是为了${val}
的val能够当成变量执行
2、使用的模式是\S
而不是.
是因为在PHP中,对于传入的非法的 $_GET 数组参数名,会将其转换成下划线