菜鸡随笔
本地文件包含漏洞基础看这里: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