记录 ThinkCMF 框架 X2.2.3 版本漏洞发现与解决

接到网警通知,说网站有安全漏洞,根据网警提供的检测报告,经过各种尝试,终于复现了,现在记录这一激动人心的时刻

网站是基于ThinkCMF框架搭建的,查看版本是X2.2.3,根据网警提供的检测报告在postman工具上操作复现漏洞情况

  • 使用POST方式请求首页链接地址
  • 使用form-data提交参数
  • 参数content=<php>die(assert('ev'.'a'.'l("'.'e'.'va'.'l(bas'.'e64_de'.'code(\"cGhwaW5mbygpOw==\"));;return 1;")'))</php>
  • 参数a=fetch

点击发送,看看结果,意不意外惊不惊喜!

居然打印出了phpinfo()

那找解决方法吧,升级框架肯定是不现实的,好歹是找了解决方案

原因是构造a参数的fetch方法和display方法导致了这个漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 加载模板和页面输出 可以返回输出内容
* @access public
* @param string $templateFile 模板文件名
* @param string $charset 模板输出字符集
* @param string $contentType 输出类型
* @param string $content 模板输出内容
* @return mixed
*/
public function display($templateFile = '', $charset = '', $contentType = '', $content = '', $prefix = '') {
parent::display($this->parseTemplate($templateFile), $charset, $contentType,$content,$prefix);
}

/**
* 获取输出页面内容
* 调用内置的模板引擎fetch方法,
* @access protected
* @param string $templateFile 指定要调用的模板文件
* 默认为空 由系统自动定位模板文件
* @param string $content 模板输出内容
* @param string $prefix 模板缓存前缀*
* @return string
*/
public function fetch($templateFile='',$content='',$prefix=''){
$templateFile = empty($content)?$this->parseTemplate($templateFile):'';
return parent::fetch($templateFile,$content,$prefix);
}

HomebaseController.class.phpAdminbaseController.class.php类中displayfetch函数修饰符改为protected

因为它的这两个方法是公用的,我们需要把它改为私用的,这样才可以不被前端的用户去任意的利用。

修复后,再次访问,解决了

坚持原创技术分享,您的支持将鼓励我继续创作!
0%