漏洞概要 关注数(66) 关注此漏洞
缺陷编号: WooYun-2014-70366
漏洞标题: qibocms全部开源系统 Getshell
相关厂商: 齐博CMS
漏洞作者: ′雨。
提交时间: 2014-07-31 10:37
公开时间: 2014-10-29 10:38
漏洞类型: SQL注射漏洞
危害等级: 高
自评Rank: 20
漏洞状态: 厂商已经确认
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org
Tags标签: 无
漏洞详情
披露状态:
2014-07-31: 细节已通知厂商并且等待厂商处理中
2014-08-01: 厂商已经确认,细节仅向厂商公开
2014-08-04: 细节向第三方安全合作伙伴开放(绿盟科技、唐朝安全巡航、无声信息)
2014-09-25: 细节向核心白帽子及相关领域专家公开
2014-10-05: 细节向普通白帽子公开
2014-10-15: 细节向实习白帽子公开
2014-10-29: 细节向公众公开
简要描述:
多研究研究了会 发现可以Getshell。
看了看qibo所有的开源系统 都存在这洞。
无需登录 Getshell。
之前一直在因为不能直接闭合而纠结。
找P神指点了指点 成功搞定。
用整站系统来演示一下把。
______________________________________________________________________
P.S. 狗哥 能否送我个邀请码/hx
详细说明:
全局过滤函数
看似修复得很完美 可是呢。
被匹配出
当像下图这样提交的时候 匹配的key是asd 那么就不会被匹配出 就不会被过滤。
在label_module.php中 这里无需登录任何
由于qibo是
所以这变量$label 可以直接控制。
然后循环出来 数组中的key 和 value 都直接写入到了缓存文件中。
这里由于value 全局的函数 会受到第一次转义 $value=addslashes($value);
这里又经过了第二次转义 那么就是a\\\'
"\$label['$key']=stripslashes('$value');\r\n"
写入时候的代码 就看有个stripslashes 其实是不会被执行的 而就是把stripslashes写入到文件当中。
这时候只有来利用key 由于在全局的过滤函数中没对key做addslashes(也不能做addslashes) 所以不会被转义 而且结合上面的 就直接绕过了。
当写入到文件中的时候是这样的。
key中直接含单引号 被匹配到然后退出了。
结合上面的方式绕过。
这时候写入的代码为 $label['asd'']=stripslashes('');
后面的stripslashes('') 为啥是空的了呢
如果不是空的还能利用转义符来搞。
因为我们这样提交index.php?label[asd'][asd]=asda' 这样的那么他的value是数组
就清空了。
一开始我一直在纠结如果闭合之前的这个[ 我就需要提交一个yu']# 类似这样的
可是写入的是数组中的key 如果要在key中写入]的话 那么就成了
http://**.**.**.**/qibov7/index.php?label[asd']][asd]=asda'
就成了[asd']] 这样 那么提交的] 和之前[ 闭合 然后key就还是asd'
然后就一直在这纠结这个问题。。
后面问了问P神 尼玛 瞬间给我解决。
P神给的['a'."${phpinfo()}".''] 利用双引号的二次解析来Getshell
那么就让我们的key为a'."${phpinfo()}".' 这个就行了 不含]
测试一下能不能执行
竟然报错了? 这里我们用一下错误抑制符
那么也就是['a'."${@phpinfo()}".''] 提交的key为a'."${@phpinfo()}".'
成功执行。
后面我再简化了一下其实是不需要用到双引号的二次解析的
[''.phpinfo().''] 提交的key为'.phpinfo().' 依旧可以直接执行
之前的思维一直就是想着去闭合。唉。
___________________________________________________________________________
内容可以搞定了 这里我们再来看一下文件名是咋来的
首先目录cache/label_cache/
再来看文件名
_".intval($ch)."_".intval($ch_pagetype)."_".intval($ch_module)."_".intval($ch_fid)."_".intval($city_id).'_'.substr(md5(getTpl("index",$chdb[main_tpl])),0,5).".php"
就是经过一系列的转整 除开$ch 为1 其他的那些变量 我们都没去定义 那么intval 后为0
那么就是index_1_0_0_0_0_substr(md5(getTpl("index",$chdb[main_tpl])),0,5).php
来看一下这个 getTpl("index",$chdb[main_tpl])
这个其实就是模版地址 网站的绝对路径+默认模版地址
这里用到了网站的绝对路径 所以我们要找一个可以泄漏绝对路径的。
会泄漏绝对路径的地方很多 我随便贴两处把
http://**.**.**.**/data/label_hf.php
http://**.**.**.**//do/fontimg.php
http://**.**.**.**//hack/gather/inc/show_system_fid.php
以为本地测试为例
D:\ApmServ\www\htdocs\qibov7\data\label_hf.php
那么网站的绝对路径就为 D:\ApmServ\www\htdocs\qibov7
再加上默认模版路径/template/default/index.htm
那就是 D:\ApmServ\www\htdocs\qibov7/template/default/index.htm
对这个进行md5一次 得到82e4a1041f04d2edb779e87b37623786
然后他这里是substr(md5(getTpl("index",$chdb[main_tpl])),0,5)取前5位
那么就是82e4a 再拼凑起来
那么就得到 cache/label_cache/index_1_0_0_0_0_82e4a.php
找文件的第二种方法
在windows iis下可以利用短文件名来猜解
如果windows apache的话 那就更简单了
直接cache/label_cache/index_~1.php
直接就可以了。
当然 5位 也可以尝试爆破一下嘛 哈哈。
漏洞证明:
见上面把。
修复方案:
这个我也不太清楚了 你们自己好好思考思考把。
这个文件 每个开源的系统中都有。
每个都要修改。
版权声明:转载请注明来源 ′雨。@乌云
漏洞回应
厂商回应:
危害等级:高
漏洞Rank:20
确认时间:2014-08-01 10:58
厂商回复:
老问题
最新状态:
暂无
漏洞评价:
对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值