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

04-10 1009阅读

目录

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 ; 还有 上传文件,删除文件,安装文件,上传成功,上传失败等

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

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

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

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

emlog-模板文件上传

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

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

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

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

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

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

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

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

修改参数 tpl 即可更换模板

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

模板文件存放路径 

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

搜$_FILES

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

搜索上传

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

定位到文件 /admin/template.php

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

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

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

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

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

进入 emDirect() 函数

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

$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文件中的条目时,用于构建路径、创建目录结构或进行路径检查时非常有用。

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

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

如何利用?

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

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

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

test.php内部是一个后门

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

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

上传常规,出现 test 模板

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

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

emlog-插件文件上传

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

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

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

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

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

定位到 /admin/plugin.php

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

制作插件压缩包

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

上传成功

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

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

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

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

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

删除成功!

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

安装,双击运行即可

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

安装后的目录

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

控制中心在 /bin 目录下

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

Web目录

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

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

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

解决办法:

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

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

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

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

流程:找文件名->绕验证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 

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

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

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

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

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

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

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

经由上述分析,构造符合条件的文件上传:
  1. 设置P参数不为0
  2. 设置DEST_UID参数为1
  3. 设置UPLOAD_MODE参数为1,2,3
  4. 设置上传文件参数名为ATTACHMENT









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

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

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

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

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

txt 里面是后门代码 

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

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

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

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

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

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

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

但是又碰到一个问题

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

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

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]