标题: preg_replace很危险:任意执行代码
作者: 老虎会游泳 @Ta
时间: 2011-10-06
preg_replace有一个专用的模式修饰符e,它的作用是将匹配结果作为php代码执行,并把返回值作为最终结果替换匹配内容。
例:
preg_replace('/$/e', 'urlencode("老虎会游泳")', $str);
它的作用是给$str末尾添加一些urlencode之后的字符串,这没什么。
但是这个呢:
preg_replace('/$/e', 'unlink("index.php")', $str);
怎么样?冒冷汗不?
继续,如果把unlink()换成eval(),我们不就能执行任何代码了吗?
还记得不?虎绿林的txt文本编辑器和html编辑器都提供preg正则替换的功能,两个鲜活的WebShell啊。
解决方法:对“查找”字符串进行正则替换:
$cz=preg_replace('/^(.)(.*)\\1(.*)e(.*)$/', '\\1\\2\\1\\3\\4', $_GET['cz']); //过滤模式修饰符e
echo preg_replace($cz, $_GET['th'], $str); //从理论上来说,用户已经无法使用e来当WebShell了。
最后,大家在给用户提供某些功能时一定要小心啊!如果不看手册,我不知道什么时候才会发现这个BUG。
[隐藏样式|查看源码]