记一次完整的PHP代码审计——yccms v3.4审计
一、环境搭建与使用工具
(一)环境搭建
打开源码查看安装要求

PHP 5.4+,Mysql 5.0.*,直接使用phpstudy配置即可
查看源码目录结构,发现是mvc模式的,那么我们重点关注的就是controller、public、model下的文件


(二)使用工具
集成网站环境搭建:phpstudy
代码静态扫描:Fortify、seay源码审计系统
代码调试:phpstorm
抓包:BurpSuite
- 浏览器测试插件:Hackbar
二、静态代码扫描
Fortify的扫描情况

再使用seay源码审计系统扫描一下,方便后面代码函数跟进

三、代码审计过程
(一)代码执行
public/class目录下的Factory.class.php文件,文件类名为Factory

使用setModel方法调用self::getA()方法获取a参数进行跳转检查操作,通过file_exists()函数判断文件路径是否存在,然后通过eval()函数实例化a参数执行代码
这里想要利用eval()执行代码,则必须绕过file_exists()函数的检查,该函数允许路径中存在特殊字符,且遇到
/../的时候会返回到上级目录,可以利用以下形式尝试绕过?a=Factory();phpinfo();//../

成功绕过。发现eval函数中存在对a参数的实例化,把前面的执行代码phpinfo()改成
system('whoami')后,出现报错,报错信息中出现了一个实例化路径config/run.inc.php
在项目中搜索Factory,找到的唯一的有效实例化也是config/run.inc.php

config/run.inc.php文件无法直接访问,继续找包含了这个文件的其他可用文件,找到admin/index.php、config/count.php、search/index.php三个文件,也就是说需要通过这三个文件对Factory()进行实例化调用才可以利用此处的代码执行漏洞。由于index.php是默认的首页文件,所以通过admin/index.php进行利用时可以省略index.php

构造webshell,使用蚁剑尝试连接成功
?a=Factory();@eval($_POST[1]);//../

(二)无需登录任意文件文件删除
seay中提示controller目录下有三处文件删除,但是只有PicAction.class.php文件中没有对路径获取文件名进行校验,另外三个都存在对文件路径或文件名的校验

先看controller/PicAction.class.php,查看代码如下,发现是一处删除图片的功能点,且没有检验文件路径和文件名

先随便传张图片上去,或者放一张图片到upload目录下,到后台的图片管理抓个包看一下

数据包如下,body部分的参数为
pid[1]=xxx.png&send=删除选中图片
在网站根目录下新建一个1.txt文件,浏览器中退出管理员账号,hackbar构造poc尝试删除该文件


执行后发现网站根目录下的1.txt文件被删除了

(三)无需登录任意文章删除
第二处文件删除在controller/ArticleAction.class.php,查看代码如下,以get方法接收id参数,先连接数据库查找该id是否存在,若存在则删除该id所对应的文章,因此这里无法删除任意文件,只能删除文章

还是先退出登录,使用hackbar构造poc测试,尝试删除id为2446的文章

登录后台查看,发现id为2446的文章确实被删除了

(四)任意文件上传一
public/class/LogoUpload.class.php文件,查看代码

先到后台查看一下这处上传点

尝试前台不登陆访问上传点,发现可以直接访问

尝试上传一个webshell,先正常选择上传一个png图片,然后burpsuite抓包修改成一句话木马再发送,如下

再查看源码,发现LogoUpload.class.php文件中还有一个上传后的校验,重命名文件名为logo,验证上传目录,校验文件类型是否为png图片

根据上述规则,上传的shell.php文件应该被重命名为了logo.php,找到logo上传目录view/index/images/,发现里面有一个logo.php文件,使用蚁剑尝试连接成功

(五)任意文件上传二
第二处文件上传点public/class/FileUpload.class.php,查看代码如下,逻辑跟上面那一处上传差不多,但是文件名以时间+100到1000之间的随机数进行重命名

抓包测试一下

到uploads目录下看一下,发现多了一个20230221165059459.php文件,文件名被通过时间进行了重命名

尝试使用蚁剑连接成功,这一处上传点同样可以前台不登陆直接访问,不过有js校验

(六)验证码复用漏洞
这个都不需要看代码,直接测就行,验证码不会变,可以重复使用
记一次完整的PHP代码审计——yccms v3.4审计的更多相关文章
- Query意图分析:记一次完整的机器学习过程(scikit learn library学习笔记)
所谓学习问题,是指观察由n个样本组成的集合,并根据这些数据来预测未知数据的性质. 学习任务(一个二分类问题): 区分一个普通的互联网检索Query是否具有某个垂直领域的意图.假设现在有一个O2O领域的 ...
- 记一次完整的pc前端整站开发
我所做的项目是一个线上的旅游平台,当然不是大家耳熟能详的那些旅游平台了,项目刚开始也没有必要去评价它的好坏,在这里我就不多说了~这是线上地址有兴趣的同学可以去看看(www.bookingctrip.c ...
- 记一次完整的java项目压力测试
总结:通过这次压力测试,增加了对程序的理解:假定正常情况下方法执行时间为2秒,吞吐量为100/s,则并发为200/s:假设用户可接受范围为10s,那么并发量可以继续增加到1000/s,到这个时候一切还 ...
- Python+Selenium+Unittest+HTMLTestRunner生成测试报告+发送至邮箱,记一次完整的cnblog登录测试示例,
测试思路:单个测试集.单个测试汇成多个测试集.运行测试集.生成测试报告.发送至邮箱. 第一步:建立单个测试集,以cnblog登录为例. 测试用例: cnblog的登录测试,简单分下面几种情况:(1)用 ...
- 记一次简单的PHP代码审计(SSRF案例)
题目链接: http://oj.momomoxiaoxi.com:9090/ 用dirsearch对网址进行扫描,发现robots.txt 命令行: python3 dirsearch.py -u & ...
- 记一次完整的asp.net-mvc页面优化过程
最近在重构一个以前团队开发留下的MVC项目,项目结构堪称混乱,问题多多,但今天说的是页面打开速度的问题.项目中包括web后台系统,几乎随便点一个页面都要盯着白屏等待2-5秒之久,体验很差.通过对页面性 ...
- 记一次完整的android源码截屏事件的捕获<标记砖>
http://blog.csdn.net/buptgshengod/article/details/19911909?utm_source=tuicool&utm_medium=referra ...
- 五十:代码审计-PHP无框架项目SQL注入挖掘技巧
代码审计教学计划: 审计项目漏洞Demo->审计思路->完整源码框架->验证并利用漏洞 代码审计教学内容: PHP,JAVA网站应用,引入框架类开发源码,相关审计工具及插件使用 代码 ...
- WinUI 3 踩坑记:前言
WinUI 3 (Windows App SDK 于 2021 年 11 月发布了第一个正式版 v1.0.0 [1],最新版本是 v1.1.5 [2].我的基于 WinUI 3 的个人项目 寻空 从年 ...
- xdcms_3.0.1 | 代码审计
这周的审计任务,这次审计 xdcms . 下面就开始审计之旅. ...
随机推荐
- 写一个frida通杀脚本
1. 前言 过年对我来说和平常没什么区别,该干什么干什么. 之前没接触过 frida 这个工具,前几天用了一些时间学习了一下,相比于 xposed hook 框架,frida 相对于调试方面真的很方便 ...
- java 运用jxl 读取和输出Excel
文章结尾源码以及jxl包 1.输出excel: package JmExcel; import java.io.File; import java.io.FileOutputStream; impor ...
- MySQL进阶实战3,mysql索引详解,上篇
一.索引 索引是存储引擎用于快速查找记录的一种数据结构.我觉得数据库中最重要的知识点,就是索引. 存储引擎以不同的方式使用B-Tree索引,性能也各有不同,各有优劣.例如MyISAM使用前缀压缩技术使 ...
- 0停机迁移Nacos?Java字节码技术来帮忙
摘要:本文介绍如何将Spring Cloud应用从开源Consul无缝迁移至华为云Nacos. 本文分享自华为云社区<0停机迁移Nacos?Java字节码技术来帮忙>,作者:华为云PaaS ...
- 解决RockyLinux和Centos Stream 9中firefox无法播放HTML视频问题
如题在测试两种centos后续系统时,发现firefox无法播放HTML视频问题.经过一番折腾找到了解决的办法,具体解决如下: 首先下载VLC $sudo yum install vlc 而后重启浏览 ...
- Kafka相关面试题及答案
Kafka相关面试题及答案 1. Kafka中的ISR.AR又代表什么? ISR:与leader保持同步的follower集合 AR:分区的所有副本 2. Kafka中的HW.LEO等分别代表什么? ...
- uniapp小程序使用高德地图api实现路线规划
路线规划 简介 路线规划常用于出行路线的提前预览,我们提供4种类型的路线规划,分别为:驾车.步行.公交和骑行,满足各种的出行场景. 高德开放平台 本例是驾车路线规划功能和位置选择地图api:choos ...
- ABC238E Range Sums
简要题意 有一个长度为 \(N\) 的序列 \(a\),你知道 \(Q\) 个区间的和.求是否可以知道 \([1,n]\) 的和. \(1 \leq N,Q \leq 2 \times 10^5\) ...
- 【MySQL】MySQL8安装
1. MySQL8安装 安装环境 操作系统:CentOS7 MySQL版本:8.0.28 安装方式:二进制Generic 软件路径:/app/database 数据路径:/data/3306 日志路径 ...
- 半个前端新手入门Electron的过程
前言 先说几句废话,本人是一名 web 后端开发,主语言是 java,在学 Electron 之前,只会一点点 HTML和 JavaScript.本文讲的也是我学习 Electron 的过程,而非教程 ...