关于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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容