干完活回来被隔离,周末只能学习了,也就有了这篇文章,可能这个CMS选的不是特别好,第一个洞分析的不是很nice,但是很尽力了…
环境
damicms,为了兼容更多的用户,所以建议使用php5来进行搭建,最新的版本支持php7,用php7时能够进入到安装界面完成安装,但是界面无法显示也没有报错信息,需要更换php版本
远程代码执行
根据github上的issue,确定了代码触发点为整个cms中使用的模板文件,为了便于触发issue中用的是head.html
,在任意页面都能够触发写入的恶意代码。
抓包确认调用的方法
Admin/Lib/Action/TplAction.class.php#89
通过stripos
来限制文件的后缀,该函数不区分大小写,所以大小写没办法绕过;之后用htmlspecialchars_decode
将文件内容中特殊的HTML实体转换回普通字符;stripslashes
反引用字符串,会去除转义反斜杠;接着调用write_file
方法,跟进
Admin/Common/common.php#45
,清除了文件的缓存,之后就会将内容写入到文件当中,并未对内容进行任何的校验
常规思路来看,这里写入的只是html文件,审过的cms这一类head.html文件只能够解析html标签,最多就是能够构造一个存储型XSS罢了,这里居然能够解析php,那就需要去找一下为什么。全局搜索来看一下有包含或者其他方式用到head.html的地方
Web/Lib/Action/PublicAction.class.php#70
跟进调用assign
类中的方法
这里会调用Think
类中的instance
方法实例化View
类,然后赋值给$view
参数,那么上面调用的也就是View
视图类中的assign
方法,跟进,发现只是对模板变量进行了赋值
在视图类中有一个display
方法用于加载模板和进行页面的输出,这个方法应该才是写入的恶意代码的触发点
直接跟进display
方法中调用到的类中fetch
方法,根据注释会进行模板解析并且获取其中的内容
这里根据注释会使用PHP原生模板,$content
不为空,根据三元运算符,会进行内容的拼接,猜测最终的触发点就是这里,通过eval
会使得写入的恶意代码能够被执行。
任意文件读取
传入的id参数,去除首尾空白字符,再会进行一个替换,之后会调用dami_url_replace
方法,跟进
Admin/Common/common.php#94
根据issue,跟进具体的调用方法
Admin/Lib/Action/TplAction.class.php#76
这里上面调用该方法的时候只有传入经过处理的id参数,所以$order默认为asc
,这里会对获取到的id参数值进行替换,所以给定的poc中会那么构造文件路径
|=》/
@=》=
#=》&
接着调用read_file方法,直接读取文件内容,再后面的代码部分就不用去看了,最终肯定是调用视图类中的方法进行文件内容的打印输出
function read_file($11)
{
return @file_get_contents($11);
}
poc
?s=Tpl/Add&id=C:|windows|win.ini
任意文件删除
Admin/Lib/Action/TplAction.class.php#119
有任意文件读取一般都会有任意文件删除漏洞的存在,可以看到代码部分,前面的任意文件读取中已经分析过了是怎么处理获取到的$id
参数的,所以这里只需要指定需要删除的文件路径就可以了,这里我在根目录下创建了一个1.php
文件,下面就进行一下删除操作
总述
这几个漏洞都需要后台权限,可能会觉得比较鸡肋,但是这个cms实际上它的管理员权限是能够进行获取的,默认的 damiCMS 管理员用户的 cookie:
在BkGOp9578O_1535522538 = czoxOiIxIjs%3D
时,管理员的登录会被更新
BkGOp9578O_
是COOKIE_PREFIX默认情况下,1533522538
很明显是时间戳,该cookie会保持 3小时登录状态,这意味着我们可以得到管理员用户的cookie,只需枚举最多 10800 次即可获得权限,可以在这个基础上来进行上面几个漏洞的利用。
最新版的在这里:https://www.damicms.com/Down# ,v7.0.0,联系了技术支持最新版已经修复漏洞了。
- 本文作者: joker
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/937
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!