一、环境搭建与使用工具

(一)环境搭建

  1. 打开源码查看安装要求

  2. PHP 5.4+,Mysql 5.0.*,直接使用phpstudy配置即可

  3. 查看源码目录结构,发现是mvc模式的,那么我们重点关注的就是controller、public、model下的文件

(二)使用工具

  1. 集成网站环境搭建:phpstudy

  2. 代码静态扫描:Fortify、seay源码审计系统

  3. 代码调试:phpstorm

  4. 抓包:BurpSuite

  5. 浏览器测试插件:Hackbar

二、静态代码扫描

  1. Fortify的扫描情况

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

三、代码审计过程

(一)代码执行

  1. public/class目录下的Factory.class.php文件,文件类名为Factory

  2. 使用setModel方法调用self::getA()方法获取a参数进行跳转检查操作,通过file_exists()函数判断文件路径是否存在,然后通过eval()函数实例化a参数执行代码

  3. 这里想要利用eval()执行代码,则必须绕过file_exists()函数的检查,该函数允许路径中存在特殊字符,且遇到/../的时候会返回到上级目录,可以利用以下形式尝试绕过

     ?a=Factory();phpinfo();//../

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

  5. 在项目中搜索Factory,找到的唯一的有效实例化也是config/run.inc.php

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

  7. 构造webshell,使用蚁剑尝试连接成功

     ?a=Factory();@eval($_POST[1]);//../

(二)无需登录任意文件文件删除

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

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

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

    数据包如下,body部分的参数为pid[1]=xxx.png&send=删除选中图片

  4. 在网站根目录下新建一个1.txt文件,浏览器中退出管理员账号,hackbar构造poc尝试删除该文件

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

(三)无需登录任意文章删除

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

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

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

(四)任意文件上传一

  1. public/class/LogoUpload.class.php文件,查看代码

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

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

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

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

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

(五)任意文件上传二

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

  2. 抓包测试一下

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

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

(六)验证码复用漏洞

  1. 这个都不需要看代码,直接测就行,验证码不会变,可以重复使用

记一次完整的PHP代码审计——yccms v3.4审计的更多相关文章

  1. Query意图分析:记一次完整的机器学习过程(scikit learn library学习笔记)

    所谓学习问题,是指观察由n个样本组成的集合,并根据这些数据来预测未知数据的性质. 学习任务(一个二分类问题): 区分一个普通的互联网检索Query是否具有某个垂直领域的意图.假设现在有一个O2O领域的 ...

  2. 记一次完整的pc前端整站开发

    我所做的项目是一个线上的旅游平台,当然不是大家耳熟能详的那些旅游平台了,项目刚开始也没有必要去评价它的好坏,在这里我就不多说了~这是线上地址有兴趣的同学可以去看看(www.bookingctrip.c ...

  3. 记一次完整的java项目压力测试

    总结:通过这次压力测试,增加了对程序的理解:假定正常情况下方法执行时间为2秒,吞吐量为100/s,则并发为200/s:假设用户可接受范围为10s,那么并发量可以继续增加到1000/s,到这个时候一切还 ...

  4. Python+Selenium+Unittest+HTMLTestRunner生成测试报告+发送至邮箱,记一次完整的cnblog登录测试示例,

    测试思路:单个测试集.单个测试汇成多个测试集.运行测试集.生成测试报告.发送至邮箱. 第一步:建立单个测试集,以cnblog登录为例. 测试用例: cnblog的登录测试,简单分下面几种情况:(1)用 ...

  5. 记一次简单的PHP代码审计(SSRF案例)

    题目链接: http://oj.momomoxiaoxi.com:9090/ 用dirsearch对网址进行扫描,发现robots.txt 命令行: python3 dirsearch.py -u & ...

  6. 记一次完整的asp.net-mvc页面优化过程

    最近在重构一个以前团队开发留下的MVC项目,项目结构堪称混乱,问题多多,但今天说的是页面打开速度的问题.项目中包括web后台系统,几乎随便点一个页面都要盯着白屏等待2-5秒之久,体验很差.通过对页面性 ...

  7. 记一次完整的android源码截屏事件的捕获<标记砖>

    http://blog.csdn.net/buptgshengod/article/details/19911909?utm_source=tuicool&utm_medium=referra ...

  8. 五十:代码审计-PHP无框架项目SQL注入挖掘技巧

    代码审计教学计划: 审计项目漏洞Demo->审计思路->完整源码框架->验证并利用漏洞 代码审计教学内容: PHP,JAVA网站应用,引入框架类开发源码,相关审计工具及插件使用 代码 ...

  9. WinUI 3 踩坑记:前言

    WinUI 3 (Windows App SDK 于 2021 年 11 月发布了第一个正式版 v1.0.0 [1],最新版本是 v1.1.5 [2].我的基于 WinUI 3 的个人项目 寻空 从年 ...

  10. xdcms_3.0.1 | 代码审计

    这周的审计任务,这次审计 xdcms . 下面就开始审计之旅.                                                                     ...

随机推荐

  1. updog:一款局域网传输文件的软件

    前言 不知道你是否有过这样 的需求,在局域网传输文件,苦于没有好的软件支持,或者只能单向传输,updog可以完全解决这种问题 安装 pip3 install updog updog是python中的一 ...

  2. 大规模爬取(新浪为例子)网页之downloader、parser的封装(涉及编码等细节)

    import requests import cchardet import traceback from lxml import etree def downloader(url,timeout = ...

  3. windows下django项目创建流程

    一.创建djangoa项目 1.将python39\Scripts 加入系统环境变量. 2.django-admin startproject 项目名称 二.设置setting 1.语言设置zh-ha ...

  4. MassTransit 知多少 | 基于MassTransit Courier实现Saga 编排式分布式事务

    Saga 模式 Saga 最初出现在1987年Hector Garcaa-Molrna & Kenneth Salem发表的一篇名为<Sagas>的论文里.其核心思想是将长事务拆分 ...

  5. Apache Kafka 移除 ZK Proposals

    Zookeeper 和 KRaft 这里有一篇 Kafka 功能改进的 proposal 原文.要了解移除 ZK 的原因,可以仔细看看该文章.以下是对该文章的翻译. 动机 目前,Kafka 使用 Zo ...

  6. [seaborn] seaborn学习笔记12-绘图实例(4) Drawing example(4)

    文章目录 12 绘图实例(4) Drawing example(4) 1. Scatterplot with varying point sizes and hues(relplot) 2. Scat ...

  7. Android Volley 基本使用

    Android Volley 基本使用 本篇主要介绍 Google 给Android 平台提供的 Volley 一个 Http请求库 , 齐射! 1.概述 Volley是Google 提供的一个小巧的 ...

  8. 使用Logstash工具导入sqlserver数据到elasticSearch及elk分布式日志中心

    首先记下这个笔记,Logstash工具导入sqlserver数据到elasticSearch. 因为logstash使用java写的,我本地开发是win11,所以javade jdk必须要安装.具体安 ...

  9. liunx系统安装Redis详细步骤

    liunx系统安装Redis详细步骤 官网下载Redis安装包 使用工具将redis安装包拖入liunx系统 创建Redis存放目录 mkdir /usr/local/redis 解压到redis存放 ...

  10. 如何使用MASA.Blazor

    MASA.Blazor 是什么? 基于Material Design设计和BlazorComponent的交互能力提供标准的基础组件库.提供如布局.弹框标准.Loading.全局异常处理等标准场景的预 ...