关于PHP文件包含

菜鸡随笔

本地文件包含漏洞基础看这里:http://www.freebuf.com/column/148886.html

(其中phar是个很神奇的协议,能解析很多后缀名,例如

似乎是因为phar在解析时会自动寻找stub部分

相关wp https://www.jianshu.com/p/e6adc2fcc705

http://php.net/manual/en/phar.fileformat.phar.php


关于文件包含,之前说到过的session和日志就不提了,怎么控制服务端的文件使得我们能够包含get shell也有各种各样的姿势,这里提几个很神奇的操作

文件包含+phpinfo=getshell(需要条件竞争)

一张图片解释

众所周知,在Linux系统下,php会将上传的临时文件放在/tmp目录下,如果不进行移动保存,在php生命周期结束后就会将其删除,而且该临时文件名一般是php和6个随机字符组成的,所以我们一般难以利用

但是当我们给phpinfo页面上传文件的时候,该临时文件名的会出现在页面中,利用这个点进行条件竞争就有可能直接get shell

文件包含=getshell?(需要爆破且不太可行)

链接:https://www.anquanke.com/post/id/153376

利用自包含,使得php上传后的临时文件得以保留下来

实测在我的公网VPS上可行,但是在docker上不可行

不推荐

利用软链接进行文件读取

链接:https://xz.aliyun.com/t/2589


当然,一般来说文件包含都不会那么好用,能够直接get shell,我们利用这个漏洞一般都是使用php://filter伪协议来读取源码进行审计或者读取文件内容的

对于php://filter,官方解说见这里http://php.net/manual/zh/wrappers.php.php

不过说的有点散,就让我们自己潜下去看看php实现代码吧,主要代码如下:

前面关于读写mode的不提,我们从下面开始看,句式类似这样:

php://filter//resource=文件路径

后面调用了 php_stream_apply_filter_list 函数,这里传入了用resource的文件路径打开的文件流和过滤器,我们追过去看看:

这里将过滤器用|分割,然后URL解码一次,句式类似这样:

php://filter/ (url_decode(过滤器)) | (url_decode(过滤器)) /resource=文件路径

并依次创建过滤器实例

跟入 php_stream_filter_create

这里从已经注册好了的哈希表中查找过滤器工厂,如果查找不到就做一些处理再查找

那有什么过滤器呢?

在filters.c中,我所看到的过滤器主要有:

string.rot13

string.toupper

string.tolower

string.strip_tags

convert.base64-encode

convert.base64-decode

convert.quoted-printable-encode

convert.quoted-printable-decode

在实际中,可以使用这些过滤器对流进行编码/解码


Orz

你可能感兴趣的:(关于PHP文件包含)