R1gelX`Blog

22 object(s)
 

PHPINFO+文件包含

前言

phpinfo有个特点,可以将整个请求上下文的所有变量全部打印出来。

其次文件上传,无论后端有无对文件的操作,这个都会暂时的存储在服务器上


利用

要存在一个phpinfo界面,我们上传一个文件,会生成一个临时文件路劲的数据,存储在全局变量$_FILES里面
我们可以通过读取phpinfo里的内容来获取到临时文件的位置,从而进行包含。

其次,phpinfo会将请求上下文的所有变量打印出来,包括接收到的参数(get or post)全部打印在PHP Variables里,所以只要我们传入的垃圾参数足够多,就可以把phpinfo变得很大。

如下 是访问的 host/phpinfo.php?test=FFFFF

image-20210727230453529

把phpinfo撑大有什么用呢,那就是,php的默认缓冲区大小只有4096,并且之前在打fpm的时候有提到,php和中间人的交互方式,我们访问一个php,其实是由php处理后返回给中间件在返回给我们。所以我们如果让phpinfo的大小超过了4096 那么我们就可以从每个4096中读取tmp name

如果利用burp 或者requests库去访问,获得到的数据是全部加载完成才可读取,而我看到文章是利用socket去链接,那么就可以每次读取4096字节然后读取完才传输下一个4096 如果我们读取到当前4096字节中有临时文件数据的话,而接下来还有数据未传送完成,那当然临时文件也还存在。这里是利用phithon的脚本来实现的

可以根据自己的环境去修改一下他的代码,我的包含是在include所以我改了

之前一直打不成功,然后把配置文件里的 upload_tmp_dir 启用并赋值再打就成功打了,当然这里的shell不在 /tmp/g下 我自己改在D:/

image-20210728003150722

如图,成功写入文件

image-20210728003320679

可以包含执行

image-20210728003611479

后记

其实复现中还是有很多问题:

在没有设置upload_tmp_dir的时候,脚本显示获取到临时文件,但没有成功写马,说包含失败。

在wsl下复现的时候一直 no php tmp_name in phpinfo OUTPUT