漏洞详情:
ThinkPHP是一个免费开源用户数量非常多的一个PHP开发框架。ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由:$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths)); 导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
影响版本:
Thinkphp2.x系列以及ThinkPHP 3.0版本因为Lite模式下没有修复该漏洞,也存在这个漏洞。
漏洞分析:
漏洞原由是因为preg_replace的/e模式匹配路由导致的代码执行:$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));为了明白漏洞产生的原因,我们先了解下面几个知识点。
e和/e:
e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行; /e 为PHP专有参数,表示可执行模式
preg_replace()函数:
preg_replace()函数是一个替换函数,支持正则匹配。匹配规则是:('正则规则','替换字符','目标字符')也就是说如果传入的目标字符,符合正则规则的字符的话就替换这个字符。
如果说在正则规则用的是/e而不是e,那么当传入的目标字符,符合正则规则的的话