漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2013-044824
漏洞标题:(新)程氏舞曲CMS 三步GETSHELL(实例演示+源码详析)
相关厂商:chshcms.com
漏洞作者: lxj616
提交时间:2013-12-04 10:52
修复时间:2014-03-01 10:53
公开时间:2014-03-01 10:53
漏洞类型:SQL注射漏洞
危害等级:高
自评Rank:20
漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
2013-12-04: 细节已通知厂商并且等待厂商处理中
2013-12-09: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2014-02-02: 细节向核心白帽子及相关领域专家公开
2014-02-12: 细节向普通白帽子公开
2014-02-22: 细节向实习白帽子公开
2014-03-01: 细节向公众公开
简要描述:
SQL绕过双重保险再注射+无需解MD5后台认证绕过(同时绕过了安装时写在config文件里的验证码)+后台GETSHELL 无论从技术难度还是危害讨论,均已到达最高RANK了吧
实例演示的站点为官方主页链接过去的 www.26yy.com
GETSHELL由于对服务器文件有影响,只在本机127.0.0.1演示
详细源码分析,漏洞证明截图各见下文相应区域
详细说明:
第一步:
分析:
本CMS使用自定义CS_Request过滤所有GET和POST
比如:
$id=CS_Request("id");
结论:本CMS使用addslashes对输入进行过滤
/user/member/skin_msg.php line:128
//漏洞出在防注射的检测上(第一句)
$row=$db->getrow("select * from ".Getdbname('xiaoxi')." where CS_ID='".$id."'");
if($row){
……
$db->query("update ".Getdbname('xiaoxi')." set CS_DID=1 where CS_ID=".$id." and cs_usera='".$cscms_name."'");
//正常情况下第一句语句执行如下,$row为true,继续执行第二句
直接mysql控制台语句执行是这样的
成功返回,因此可以继续
//但是在加入注入语句时,虽然没有引发注射,但是$row仍然为true
//因为单引号的作用是CAST VARCHAR TO INT,类似intval尽力从起始位置恢复一个整数,而不会报错终止,这样的话只要第一个数字正确存在,$row就会为true,语句将会继续执行
成功返回了!仍然会继续!
//到达第二个语句时由于id没有单引号保护,所以引发了注射(但是addslashes仍然起着作用,所以只能依靠盲注)
$db->query("update ".Getdbname('xiaoxi')." set CS_DID=1 where CS_ID=".$id." and cs_usera='".$cscms_name."'");
登陆网站注册用户(本CMS的主要功能都强制要求注册使用,因此开放注册是必须的!)
由于注射点在用户中心里面(外面可能也有,不过我分析的代码在用户中心里,所以就此演示了)
HAVIJ 一定记着 load cookie,SQLMAP记着 –cookie参数
参数:MYSQL-TIME-BASED INTEGER
请大家使用sqlmap,sqlmap示例在漏洞证明里对躺枪的26yy用了一下……
成功注射如下图
注意图中的CS_QUANX是有值的,只是Havij 格式 BUG 没显示出来,还是SQLMAP比较靠谱,不过在本次漏洞挖掘中,只需要显示的三项就够了(后来发现sqlmap能跑出来,大家都用sqlmap吧)
//注射可以获取数据库内容,尤其是CS_AdminPass,不过这样是不够的,因为即使你能解MD5,也过不了admin登录时的验证码(验证码安装时写死在config.php里面了,注射获取不到,虽然才4位,暴力的话有悖于原则)
第一步 注射 完毕
第二步:
每一个admin下面的文件都包含loginstate.php
看来是用来验证身份
/admin/loginstate.php 开头没几行
//伪造身份POC
//直接将前三项改为注射结果即可,$CS_Quanx应该固定为示例字符串即可无需改动
将提示出来的COOKIE分项添加进firefox即可,或者其他自己喜欢的方法均可
懒得做js脚本了,这个POC凑合着测试吧
提示:这里的CS_AdminPassWord为数据库pass的再次md5值,当初审代码时没注意,走了点弯路
设置好COOKIE直接进入后台即可,直接不登陆,访问图中后台url
第二步 绕过 进入后台 成功
第三步:
在模板-模板管理里面 选择 第一个默认自带模板 编辑
随便选一个进行编辑,能改扩展名(我选的第二个,呵呵,已经暴露了,上面图里我已经改完一个了)
//既然我目前用的是WINDOWS,不妨上个菜刀吧
第三步 GETSHELL 完成
到此分析完毕 下面是实站演示
漏洞证明:
修复方案:
1.SQL注入
(主要是分析中的第二句引发注射)
解决方式:把所有语句id之类的变量都带上单引号,然后再进SQL查询,而不能依赖某处的判断
2.后台绕过
解决方式:第一种方式可以全用SESSION,不允许使用用户可控的COOKIE,因为ADMIN是敏感操作,不需要什么十天半个月后还能自动登录的功能
第二种方式可以在加密算法中整合CONFIG.PHP中的验证码运算,这样可以保证验证码的作用不被绕过
3.后台GETSHELL
解决方式:强行把用户编辑的模板文件扩展名改为html
版权声明:转载请注明来源 lxj616@乌云
漏洞回应
厂商回应:
危害等级:无影响厂商忽略
忽略时间:2014-03-01 10:53
厂商回复:
最新状态:
暂无