为用户创造价值的开发公司

始终追求工匠精神,是您靠谱的H5开发、小程序开发、微信开发供应商

蓝畅首页 >> 动态

Thinkphp框架filter参数漏洞解析

时间:2019-05-24 00:00:00 | 来源:


   

漏洞介绍

CNNVD编号:CNNVD-201812-489

漏洞介绍链接

noneCms github issue

nonecms的作者通过升级 thinkphp 框架的版本把漏洞修复了

查看 thinkphp/library/think/App.php 这个文件的修改历史可以发现

更新框架前是5.1.0

const VERSION = '5.1.0';

更新框架后是5.1.31

const VERSION = '5.1.31 LTS';

漏洞修复

漏洞出现在 NoneCMS/thinkphp/library/think/route/dispatch/Url.php 文件中的parseUrl方法里

  1. // 解析模块

  2. $module=$this->app->config('app_multi_module') ? array_shift($path) : null;

  3. if($this->param['auto_search']){

  4. $controller=$this->autoFindController($module, $path);

  5. }else{

  6. // 解析控制器

  7. $controller=!empty($path) ? array_shift($path) : null;

  8. }

  9. // 解析操作

  10. $action=!empty($path) ? array_shift($path) : null;

  11. // 解析额外参数

  12. if($path){

  13. if($this->app['config']->get('url_param_type')){

  14. $var+=$path;

  15. }else{

  16. preg_replace_callback('/(w+)|([^|]+)/', function($match)use(&$var){

  17. $var[$match[1]]=strip_tags($match[2]);

  18. }, implode('|', $path));

  19. }

  20. }

为了修复漏洞,thinkphp官方添加了新的代码

  1. if($this->param['auto_search']){

  2. $controller=$this->autoFindController($module, $path);

  3. }else{

  4. // 解析控制器

  5. $controller=!empty($path) ? array_shift($path) : null;

  6. }

  7. /**** 加入了这段代码 ****

  8.        if ($controller && !preg_match('/^[A-Za-z](w|.)*$/', $controller)) {

  9.            throw new HttpException(404, 'controller not exists:' . $controller);

  10.        }

  11.        **** 加入了这段代码 ****/

  12. // 解析操作

  13. $action=!empty($path) ? array_shift($path) : null;

具体修改历史可以在以下链接找到

Url.php 修改历史

概括地说,就是把library/think/route/dispatch/Module.php 的代码移动到 library/think/route/dispatch/Url.php

$controller变量的校验代码经过多次改进之后,变成下面这个样子

  1. if($controller&&!preg_match('/^[A-Za-z][w|.]*$/', $controller)){

  2. thrownewHttpException(404, 'controller not exists:' . $controller);

  3. }

[A-Za-z][w|.]* 这个正则表达式的含义是 $controller 的第一个字符是字母A-Za-z。 [w|.] 匹配 a-zA-Z0-9_ 和 .。 例如可以匹配 a.b.abc123.., 所以严格来说, 这个正则表达式不是特别准确

漏洞运行

如果上面这段 $controller 变量的校验代码去掉并访问下面类似的链接,就会复现之前的漏洞。

   http://xxx.com/NoneCms/public/?s=index/thinkRequest/input&filter=phpinfo&data=1

这时候变量 $controller 等于 thinkRequest

当执行到文件 NoneCMS/thinkphp/library/think/Request.php 中的代码的时候, $filter = "phpinfo", $value = 1

  1. privatefunctionfilterValue(&$value, $key, $filters)

  2. {

  3. $default=array_pop($filters);

  4. foreach($filtersas$filter){

  5. if(is_callable($filter)){

  6. // 调用函数或者方法过滤

  7. $value=call_user_func($filter, $value);

等于执行了以下代码,这样php运行环境的敏感信息就泄露了。适当构造URL参数就可以实现更多攻击和破解操作。

  1. $filter="phpinfo";

  2. $value=1;

  3. call_user_func($filter, $value);

总结

  1. 调用call_user_func函数时,要进行参数校验。

  2. 对于 HTTP GET 请求里的参数尽可能使用严格的正则表达式进行校验。


本文转自:http://blog.hexccc.com

原文地址:http://blog.hexccc.com/thinkphp-filter-code-vulnerability/


本文地址:
更多内容推荐:
专栏最新阅读:
更多文章阅读请至:技术专栏
Tips: 为您提供 微信开发H5开发微信小程序开发微信定制开发网站开发小程序商城开发SEO网站优化视频后期制作等定制化开发服务