WEB-基于phpinfo的包含临时文件
基于phpinfo的包含临时文件
从N1CTF ezphp 的非预期解中知道的漏洞
开始找资料学习
利用前提
- LFI文件包含漏洞
- 一个服务端的phpinfo页面
原理
先了解文件上传流程
向服务器上任意php文件以multipart/form-data
方式提交请求上传数据时,会生成临时文件,也就是说不需要一定有显性的上传功能也可以上传生成临时文件。
下面向我们有的phpinfo页面以multipart/form-data方式提交文件
要注意的是 在multipart/form-data方式中,作为分割用的boundary字符串比定义处前面多两个
--
查看结果,会有在通常GET请求中没看见的参数$_FILES
phpinfo中的 upload_tmp_dir 可以查看临时文件存放的文件夹,但是文件名是随机的,所以不能利用
如果 php.ini 没有设置 upload_tmp_dir,那么默认 php 进程会读写系统的临时目录
(Windows 默认为 C:/windows/temp,Linux 为 /tmp)
另外$_FILES 是在运行中作为环境参数产生的,所以在我们平常中访问的phpinfo()不会包含$_FILES
接下来通过phpinfo
中的$_FILES
来获取临时文件的路径以及名称
假如上传的临时文件是木马文件,在被删除之前的极短时间之内,需要与服务器竞争时间包含木马文件,当然包含木马文件得到webshell不太现实,可以让木马文件重新生成一个shell文件或者提供一个反弹shell。
脚本竞争包含上传的木马文件
根据以下原理,来构建脚本
- 通过分块传输编码,提前获知临时文件名称;
分块传输可以实现在未完全传输完成时即可获知临时文件名,可以尽早发起文件包含请求,赶在删除之前执行代码。 - 通过增加临时文件名后数据长度来延长时间;
通过观察PHPinfo的信息,在$_FILES信息下面,还有请求头的相关信息,我们可以在请求的时候,通过填充大量无用数据,来增加后面数据的长度,从而增加脚本的处理时间,为包含文件争取更多的时间。 - 通过大量请求来延迟PHP脚本的执行速度。
通过大量的并发请求,提高成功的概率。
本机虚拟机测试,无限失败,原因不明
自己写的脚本与他人成功的脚本都尝试过,无果,可能跟虚拟机环境有关系
贴出他人成功的脚本
PS.写脚本时,发现python多线程时,不好在线程外读文件,在多个线程内使用这个文件,没有找到官方解释,可能是内存变动的原因
1 | ## PHP : Winning the race condition vs Temporary File Upload - PHPInfo() exploit |
参考
https://www.insomniasec.com/downloads/publications/LFI%20With%20PHPInfo%20Assistance.pdf
http://dann.com.br/php-winning-the-race-condition-vs-temporary-file-upload-alternative-way-to-easy_php-n1ctf2018/
http://www.freebuf.com/articles/web/79830.html