PHP项目类RCE及文件包含下载删除

3ad5b2ff0be8c5e5b52630b856f649f4

SQL注入

  • select,insert,update,mysql_query,mysqli

文件上传

  • $_FILES,type="file",上传,move_uploaded_file()

XSS跨站

  • print,print_r,echo,sprintf,die,var_dump,var_export

文件包含

  • include,include_once,require,require_once

代码执行

  • eval,assert,preg_replace,call_user_func,call_user_func_array

命令执行

  • system,exec,shell_exec,passthru,pcntl_exec,popen,proc_open

变量覆盖

  • extract(),parse_str(),importrequestvariables(),$$$$

反序列化

  • serialize(),unserialize(),__construct,__destruct

其他漏洞

  • unlink(),file_get_contents(),show_source(),file(),fopen()

通用关键字

  • $_GET,$_POST,$_REQUEST,$_FILES,$_SERVER
  • 功能点或关键字分析可能存在漏洞
  • 抓包或搜索关键字找到代码出处及对应文件
  • 追踪过滤或接受的数据函数,寻找触发此函数或代码的地方进行触发测试

文件包含跨站-搜索或应用-echo

Snipaste_2023-06-13_16-52-15

源代码全局搜索echo,这里发现很多,优先看非后台的文件,如果是后台的话就需要登录,先看不需要登录的一般这种都是出现在留言区或者其他类似的地方

首先找到这个contact.php这个文件

Snipaste_2023-06-13_17-19-49

Snipaste_2023-06-13_17-25-00

Snipaste_2023-06-13_17-25-42

Snipaste_2023-06-13_17-25-59

找到一个可以控制的变量$page,这个变量也加上了魔术引号的,但是魔术引号是用来过滤sql注入,跟xss用的尖括号没有太大关系,所以这里进行xss:

Snipaste_2023-06-13_17-28-37

文件包含漏洞,搜索关键字include

我这里访问files下面的带php后缀的文件,就可以正常解析,版本也没错,00截断也试过了,长度截断也用过了,就是不行

Snipaste_2023-06-13_16-48-58

下面是访问的是:1.txt.php文件,路径:/files

Snipaste_2023-06-13_17-30-12

earmusic-无框架-文件下载-搜索或应用功能-down 等

1
2
3
这里从会员中心的功能可能存在的漏洞:音乐下载存在文件下载漏洞;头像和音乐上传存在文件上传漏洞;个人信息修改可能存在SQL注入漏洞;日志,页脚可能存在XSS漏洞;查看调用的api可能存在一些其他漏洞;查看数据包传输格式等等
根据网站的功能,取猜测可能存在的漏洞:偏向社交,注入、XSS多一点;音乐下载,文件下载、上传漏洞多;
这里文件下载漏洞挖掘的两种思路:1.根据文件下载的功能测试2.搜索文件下载的相关函数和关键字然后抓包分析

首先创建一个普通用户,然后上传一个mp3的音频,点击下载按钮,进行抓包,这里是两个包的情况

Snipaste_2023-06-13_18-12-48

Snipaste_2023-06-13_18-14-53

Snipaste_2023-06-13_18-16-37

把两个url都访问一下,http://127.0.0.1/ear_music/template/default/source/audio.php?id=1,就是下载链接

然后根据这个下载地址定位到源代码中的位置:

Snipaste_2023-06-14_09-20-56

intval() 函数用于获取变量的整数值

Snipaste_2023-06-14_09-22-08

Snipaste_2023-06-14_09-23-54

后面就是将这个id值带入到数据库中进行,这里有魔术引号,不太好注入,所以这里不进行研究,带入到数据库之后,判断某个值是1还是2,如果是1就是vip,如果是2就是收费(猜测),我们上传的歌曲是3,所以可以下载,这里的in_grade,的值是写入到数据库中的所以不能修改,如果可以修改的话,那么就可以考虑将需要vip或者付费的歌曲修改成免费的

到数据库进行查找,这里发现上传音乐的音频地址,就是数据库的in_audio

Snipaste_2023-06-14_09-46-43

发现在上传音乐的地方,saferequest过滤传参,unescape函数解码经过url编码的编码的参数

checkrename函数检测文件是否存在(这里应该是文件上传的检测机制)

如果文件是添加,且符合匹配规则,就将file字符串中的tmp(这里应该是临时文件)替换为dir(也就是attachment的路径)

Snipaste_2023-06-14_09-53-42

Snipaste_2023-06-14_09-52-48

然后就是找ajax.php在哪里进行操作,通过前面的抓包,可以知道应该就是上传音乐的地方

Snipaste_2023-06-14_10-02-46

Snipaste_2023-06-14_10-03-05

Snipaste_2023-06-14_10-03-12

Snipaste_2023-06-14_10-03-51

Snipaste_2023-06-14_10-04-03

Snipaste_2023-06-14_10-04-15

但是下载的内容不对

然后是绝对路径的下载,我这里也可以下载,但是小迪的视屏中就是被过滤了,绕过的方法是可以用:/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
总结:

----通过应用分析或搜索关键词、关键函数判断可能存在文件下载操作

----抓包分析下载地址找到对应代码块,文件下载地址由$file 控制

----$file 从数据库查询语句得知,追踪那里可更新或更改此类数据

----尝试修改发现过滤,追踪过滤机制分析绕过,采用全路径地址绕过

#代码审计步骤

---功能点或关键字分析可能存在漏洞

---抓包或搜索关键字找到代码出处及对应文件

---追踪过滤或接受的数据函数,寻找触发此函数或代码的地方进行触发测试

一般在黑盒测试中很难挖掘到文件删除漏洞,因为很难探针到

PHP文件删除搜索关键字unlink,对应函数 del_file,查看调用此的地方

Snipaste_2023-06-14_10-30-47

Snipaste_2023-06-14_10-32-57

然后就要判断在哪里有调用del_file函数,先是全文搜索,然后在全局搜索

Snipaste_2023-06-14_10-39-43

Snipaste_2023-06-14_10-39-53

全文搜索这里调用这个函数的都是另外一个函数,所以,这里优先考虑直接调用的,所以全局搜索

Snipaste_2023-06-14_10-40-07

可以只有两个文件,一个admin暂时不考虑,下面这个就是上面全文搜索的结果

那么就先考虑全文搜索的结果,还是同样全文搜索和全局搜索,这里就不放截图了,都是没有被其他的调用,只是做了声明,全局搜索handle_upload函数,发现被调用一次,在upload函数中被调用过,然后在全局搜索,发现被调用的地方很多,所以这里就先跳过,直接看admin文件中直接调用的

Snipaste_2023-06-14_10-44-36

这里又被delfile函数包裹,所以这里在定位delfile函数

Snipaste_2023-06-14_10-53-18

Snipaste_2023-06-14_11-24-37

Snipaste_2023-06-14_11-24-46

Snipaste_2023-06-14_11-24-52

构造参数upload下的1.txt,成功删除!!!

Snipaste_2023-06-14_11-35-25

Snipaste_2023-06-14_11-37-33

Snipaste_2023-06-14_11-39-14

这个漏洞有点鸡肋,首先是需要你有admin的权限,不然删除不了

代码执行

找关键字:eval

Snipaste_2023-06-14_12-00-24

在eval中有一个$ifstr变量,在次定位matches变量,如下图:

Snipaste_2023-06-14_12-11-06

这是一个执行正则的函数:preg_match_all,第一个参数是匹配的规则,第二个参数是被匹配的对象,第三个参数是匹配出来的结果也就是matches,上面这里有一个public,说明这是一个对象

查看是哪里调用了这个对象,优先是非管理员的文件

Snipaste_2023-06-14_12-13-50

Snipaste_2023-06-14_13-51-07

zcontent变量又user_tql传递

这个漏洞在管理后台的模板管理,在client和admin都调用了对象,然后在一个模板中写入对应格式的一句话

我这里可能是版本问题还是什么原因,一直没有成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
---也就是,后台的模板文件被修改之后,前端的界面引用了这个模板,因此也会被修改

---代码执行漏洞产生在模板文件,而模板文件被调用的地方有两处,一处是后台的文件(模板管理),另外就是client文件,而client文件在index文件处被包含

---client文件调用ParserTemplate()对象,并且传参(我没有复现这个漏洞的原因,就是传参这里还是不太明白,也可能是CMS版本的文件,视频里面对于参数传递的过滤机制一笔带过,这里需要PHP基础取搞懂过滤机制,来找到功能点好构造payload)

---总之,就是修改后台模板,然后在前端根据传参的顺序和过滤机制构造payload。

---这里解析模板的时候,会将HTML的PHP代码进行识别,进行执行

---漏洞的价值:利用rce漏洞获取网站权限

4.再次总结

---后台 delfile 函数调用,如何处理delfile 函数,受参数控制,进行测试

---代码执行搜索关键字 eval,对应配置模版解析文件,查看调用此的地方

---判断后台可修改模版文件,前台触发模版文件,构造 payload 进行测试


作者:沙漠里的鲸 https://www.bilibili.com/read/cv15169189?spm_id_from=333.999.0.0 出处:bilibili