某通用系统0day审计过程

news2024/9/21 22:45:40

前言

代码审计篇章都是自己跟几个师傅们一起审计的1day或者0day(当然都是小公司较为简单),禁止未经允许进行转载,发布到博客的用意主要是想跟师傅们能够交流下审计的思路,毕竟审计的思路也是有说法的,或者是相互源码共享也OK,本次审计的目标是一套也是各大高校使用的通用系统,已经提交相关SRC平台进行修复

路由分析

直接看登录接口

图片

路由为 /setting.php/index/login

找对应源码

图片

第一个接口setting对应Application下的文件

第二个接口Index对应Setting下的Controller文件名字

第三个接口为Controller的方法名字

代码审计

上传

Application\Admin\Controller\UploadController.class.php

在这个路径下继承了一个upload控制器父类

图片

所以调用的接口如下

图片

实例化了一个UploadFile()对象然后给他的属性赋值

重点关注以下代码

$upload->exts = array('jpg', 'gif', 'png', 'jpeg'); // 设置附件上传类型

发现这里会调用UploadFile()的魔术方法 跟进

    public function __set($name,$value){
        if(isset($this->config[$name])) {
            $this->config[$name]    =   $value;
        }
    }

这里其实就是问题的本身,要是传进来的在config里头不存在则返回空,那么我们去看一下config的设置

    private $config =   array(
        'maxSize'           =>  -1,    // 上传文件的最大值
        'supportMulti'      =>  true,    // 是否支持多文件上传
        'allowExts'         =>  array(),    // 允许上传的文件后缀 留空不作后缀检查
        'allowTypes'        =>  array(),    // 允许上传的文件类型 留空不做检查
        'thumb'             =>  false,    // 使用对上传图片进行缩略图处理
        'imageClassPath'    =>  'ORG.Util.Image',    // 图库类包路径
        'thumbMaxWidth'     =>  '',// 缩略图最大宽度
        'thumbMaxHeight'    =>  '',// 缩略图最大高度
        'thumbPrefix'       =>  'thumb_',// 缩略图前缀
        'thumbSuffix'       =>  '',
        'thumbPath'         =>  '',// 缩略图保存路径
        'thumbFile'         =>  '',// 缩略图文件名
        'thumbExt'          =>  '',// 缩略图扩展名    
        'thumbRemoveOrigin' =>  false,// 是否移除原图
        'thumbType'         =>  0, // 缩略图生成方式 1 按设置大小截取 0 按原图等比例缩略
        'zipImages'         =>  false,// 压缩图片文件上传
        'autoSub'           =>  false,// 启用子目录保存文件
        'subType'           =>  'hash',// 子目录创建方式 可以使用hash date custom
        'subDir'            =>  '', // 子目录名称 subType为custom方式后有效
        'dateFormat'        =>  'Ymd',
        'hashLevel'         =>  1, // hash的目录层次
        'savePath'          =>  '',// 上传文件保存路径
        'autoCheck'         =>  true, // 是否自动检查附件
        'uploadReplace'     =>  false,// 存在同名是否覆盖
        'saveRule'          =>  'uniqid',// 上传文件命名规则
        'hashType'          =>  'md5_file',// 上传文件Hash规则函数名
        );

emmm根本没有 exts 所以说后缀根本没有检测,可以从从调用的upload中查看

断到一个叫自动检查附件

图片

步进一下进入check函数存在检查文件类型

图片

再次跟进一下checkExt发现是一个很强的校验白名单

    private function checkExt($ext) {
        if(!empty($this->allowExts))
            return in_array(strtolower($ext),$this->allowExts,true);
        return true;
    }

但是重点是他并没有赋值进去

图片

在这进行反向验证,讲前面的属性修改为在config里头的内容

图片

再次进行断点跟到最后面的config的地方发现成功修改

图片

所以这套系统只要存在 $upload->exts = 这个的上传接口 就存在任意文件上传

图片

SQL(绕redis缓存)

直接看前台控制器了

找到这个路由存在sql的问题

图片

在这个代码里头,可以发现 $count 跟 $listJson 是关键

$count的设置是为了不频繁查询,所以这里只要设置随机伪造的PHPSESSID就可以了

$listJson 的设置就尤为关键了 if (!$listJson) 这里的语句是 我的redis去查phone就是要查不到 为null才能执行下面的sql语句,所以phone就是要不存在的手机号才行,所以就直接随机phone就可以了,但是他在后续的代码中把这跟手机号给设置进了redis

图片

所以必须要把这跟phone随机化来绕redis的缓存才能进行正常注入

SSRF

这里全局搜索curl_exec( emm感觉是这里 确实是可控的

\Application\Course\Controller\DocumentController.class.php

图片

从逻辑上来看

$_SERVER['HTTP_AUTHORIZATION'] 跟 $_SERVER['HTTP_X_OSS_PUB_KEY_URL'] 这两个值都得存在 他就不会进行403的跳转 那么这两个都是我们可控的只要在header头加入即可,之后就会将我们传入的base64编码的值进行解码后给到curl进行直接curl执行

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
X-Oss-Pub-Key-Url: aHR0cDovL2RxM2JlMC5kbnNsb2cuY24=

远程测了一下也是完全没问题的

图片

加入后返回两百

图片

最终也是测出了SSRF

图片

更多网络安全优质免费学习资料与干货教程加

送渗透工具、技术文档、书籍,面试题、视频(基础到进阶。环境搭建,HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等)、应急响应笔记、学习路线。

申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,

所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

51单片机之动态数码管显示

一、硬件介绍 LED数码管是一种由多个发光二极管(LED)封装在一起,形成“8”字型的显示器件。它广泛用于仪表、时钟、车站、家电等场合,用于显示数字、字母或符号。 通过控制点亮a b c d e f g dp来显示数字,本实验开发板…

最长的一帧学习(待补)

文章目录 一、osgViewer:: ViewerBase:: frame()1.osgViewer:: View:: init()2.osgViewer::Viewer::realize(),窗口和场景的“设置”工作part1 GraphicsContextpart1.1 通过阅读osgViewer::View::setUpViewInWindow()了解osg最基础的操作 part2 DisplaySettingspart…

《机器学习by周志华》学习笔记-决策树-03

1、连续值处理 到目前为止,我们在决策树01、02中仅讨论了基于离散属性来生成决策树,而现实任务中常会遇到连续属性,所以在本章的学习中,我们将会讨论如何在决策树学习中使用连续属性。 1.1、概念 取值范围是连续的实数值或者整数值的属性就是「连续属性」,与离散属性相对…

Java全栈开发知识图谱(概要)

Java全栈开发知识图谱 基础知识 Java基础 语法面向对象编程(OOP)异常处理集合框架并发编程JVM原理 下列的只是图谱来源与网路 ,仅作为学习笔记使用,侵删。 数据结构和算法 常用数据结构(数组、链表、栈、队列、树等…

通过提示词越狱解锁学习提示词的新姿势

一、什么是提示词越狱 提示词越狱是一种针对语言模型的攻击方法,攻击者通过设计特定的提示词或查询,诱导模型生成不当或有害的内容。这类攻击通常利用模型的脆弱性,绕过其内置的安全机制。通过巧妙的措辞或特殊的结构,攻击者能够…

【ML】为什么multi-lingual bert 有跨语言的能力?M-BERT有什么特点

【ML】为什么multi-lingual bert 有跨语言的能力? 1. Multi-lingual BERT的跨语言能力解析1.1 什么是Multi-lingual BERT?1.2 为什么Multi-lingual BERT有跨语言的能力?1.3 结论 2. 数据量减少对BERT识别能力的影响及Multi-lingual BERT的跨…

删除git中的.idea

删除git中的.idea 1. 修改 .gitignore 文件内容,添加 .idea echo .idea >> ./gitignore2. 删除本地暂存区的 .idea [git rm命令用于从Git仓库中删除文件或目录, 而--cached选项告诉Git仅删除Git索引中的.idea目录,并不会删除本地文件系…

【大数据】重塑时代的核心技术及其发展历程

🐇明明跟你说过:个人主页 🏅个人专栏:《大数据前沿:技术与应用并进》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是大数据 2、大数据技术诞生的背景 二、大…

Java并发编程(七)—ThreadLocal的原理及应用详解

目录 一、ThreadLocal的原理 1、ThreadLocal对象 2、ThreadLocalMap 3、Thread 对象 4、get() 和 set() 方法 5、内存管理 二、ThreadLcoal的应用 三、ThreadLocal扩展问题 四、总结 ThreadLocal 类在 Java 中提供了一种机制,可以在每个线程中存储独立的变…

【Python】基础语法介绍

目录 一、标识符和关键字 二、注释 三、缩进 四、输入和输出 五、字符串操作 六、基本数据类型 七、复合数据类型 7.1 列表 7.2 元组 7.3 字典 7.4 集合 八、数据类型转换 九、运算符 8.1 算术运算符 8.2 比较运算符 8.3 赋值运算符 8.4 位运算符 8.5 逻辑运…

网络编程day1

一、思维导图 网络基础

wordpress全局自适应网址导航整站打包源码,含主题和数据库

wordpress全局自适应网址导航整站打包源码,含主题和数据库。直接恢复就可以使用了。 这个是自适应的布局设计,体验还不错。用网址导航是可以的。 代码免费下载:百度网盘

golang for range time.Ticker 和 time.Timer时间通道使用示例 - 每隔指定时间执行一次,执行指定时长后退出执行

golang中的 ticker和timer时间通道除了可以使用for select case语句来执行外, 还可以使用 for range语句来执行ticker或者timer时间通道。 for range time.Ticker 和 time.Timer时间通道使用示例 下面的示例演示了time.Ticker 和 time.Timer的区别和使用演示。 Ti…

《向量数据库指南》——向量数据库技术积累与商业机会

一豪:Charles提到了一个关键点,就是RAG技术结合模型对非结构化数据的理解和搜索能力,甚至可以很好地架接在传统结构化数据的解决方案中。作为向量数据库的核心技术点,对数据本身特别是非结构化数据的向量化、精炼和压缩,我相信Zilliz等公司有很多独门技巧和技术积累。随着…

UE基础 —— 编辑器界面

菜单栏 UE中每个编辑器都有一个菜单栏,部分菜单会出现在所有编辑器窗口中,如File、Window、Help,其他则是其编辑器特有的; 主工具栏 UE中部分最常用的工具和命令的快捷方式; 1,保存按钮(ctrls&a…

NIO线程模型

NIO线程模型主要涉及以下几个方面: 一、基本概念 NIO(New Input/Output)是Java的一种新的输入输出模型,也被称为非阻塞IO。其核心特点是数据读写操作均是非阻塞的,即在进行读写操作时,若数据未准备好&…

Python第三方库——mrjob的介绍

一、简介 mrjob 是一个强大的 Python 库,它允许开发者以 Pythonic 的方式编写 MapReduce 作业,并在多种环境下运行这些作业,包括本地机器、Hadoop 集群、Amazon Elastic MapReduce (EMR) 和 Google Cloud Dataproc。通过使用 mrjob&#xff…

ARTS Week 37

Algorithm 本周的算法题为 1232. 缀点成线 给定一个数组 coordinates ,其中 coordinates[i] [x, y] , [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上。 示例 1:输入:coordinates …

8月9日笔记

8月9日笔记 什么是代理? “代理”通常指的是“网络代理”,它是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。代理服务器作为中间人…

【中项】系统集成项目管理工程师-第11章 项目范围管理-11.3定义范围

前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…