本文由红日安全成员: 七月火 编写,如有不当,还望斧正。
最近发现 dedecms 的 nday后台getshell ,于是打算还原一下。根据日志显示,攻击者访问了 dede/ad_add.php 文件后,转而访问 plus/ad_js.php 文件,提交的 payload 为 plus/adjs.php?nocache=1&aid=1&=whoami 。
DedeCMS V5.7 SP2正式版下载:http://updatenew.dedecms.com/base-v57/package/DedeCMS-V5.7-UTF8-SP2.tar.gz
我们先来看一下 dede/ad_add.php 文件。可以看到这是一个增加广告的页面,如下图:
实际上,它在后台的位置对应如下:
接下来,笔者使用 TheFolderSpy 软件对网站文件进行监控,这样能让我们快速的发现发生修改的文件,从而提高审计效率。 TheFolderSpy 设置如下:
然后,在如下4个位置分别填入一些标识信息,以便后续判断到底是哪一处发生问题。填写信息如下:
点击确定添加广告后,发现 TheFolderSpy 软件并没有监测到有文件内容被修改。于是我们继续访问 plus/adjs.php?nocache=1&aid=1&=whoami ,发现生成了一个 data\cache\myad-1.htm 文件,并且我们在上图第三个框中填写的 phpinfo();3 被写入了该文件。如下图所示:
我们可以观察到该文件路径为 data\cache ,那么应该是个缓存文件,而且文件后缀为 htm 。由于攻击者通过访问 plus/ad_js.php 页面能 getshell ,那么很有可能是程序在某处将这个缓存文件给包含了。接下来我们对 plus/ad_js.php 文件进行详细分析。
plus/ad_js.php 文件代码如下:
这里关注 第9行 和 第15行 ,可以清晰的看到程序包含了我们之前监控到生成的 htm 文件,第12-14行 主要是对要写入 htm 文件的内容进行处理,具体代码如下:
仔细观察这段代码,程序将从数据库中 dede_myad 查询的结果存在 $row 变量中(上图第3行),然后将表 dede_myad 中的 normbody 或 expbody 字段的值作为 $adbody 写入缓存文件 $cacheFile ,并在最后 include $cacheFile; 。而 第16-18行 只是对 $adbody 内容进行简单的处理。我们再从数据库中,查看 dede_myad 表的内容,如下图:
可以看到 normbody 或 expbody 字段,对应的就是我们刚刚填写的第3个和第4个标识信息。我们现在再来看看 normbody 或 expbody 字段的值是如何写入的。再次回到 dede/ad_add.php 文件,针对刚刚填写的广告内容发起提交,抓包如下:
然后我们再看 dede/ad_add.php 文件代码:
此时整个漏洞发生的流程便十分清晰了,程序将来自用户的数据 $normbody['htmlcode'] 仅仅只是用 addslashes 函数处理,并没有对代码进行分析,然后便直接存储在数据库 dede_myad 表的 normbody 字段,导致用户可以将PHP代码存储在数据库中。如果攻击者此时访问 plus/ad_js.php 文件,则调用 normbody 字段并写入缓存文件,最终利用文件包含该getshell。
在明白了上述分析流程,想利用该漏洞便十分简单。我们在广告内容处插入 --><?php phpinfo();?><!--
然后访问如下链接( 这里的aid值为第几个广告 ):
http://localhost/dedecms/plus/ad_js.php?nocache=1&aid=3
本文从代码审计的角度,对漏洞进行详细分析,借助文件监控软件迅速定位漏洞所在。或许大家可以利用这种方式,发现更多的后台 getshell 利用姿势,期待大家挖掘。最后,希望大家多多交流,共同进步。如果大家有什么好的代码审计技巧,还望不吝分享,感谢大家的阅读。