文件包含总结--2018自我整理

0x00前言

用户的一些行为会将服务器某些文件比如日志,session等写入信息,如果有php页面能够把写入的恶意代码其包含进来,就可能getshell

0x01文件包含的函数

include, include_once,require,require_one引入文件时,利用参数拼接成路径,而参数如果可控则造成的问题。

这四个函数虽然存在细微的不同,但是功能都大差不差

0x02文件包含可用的协议

1.php://input => 读取到访问请求的原始数据的只读流,即读取POST上没有经过解析的数据。不支持multipart/form-data的类型的传码方式上传。

   在配置文件php.ini中allow_url_include => On 打开,使用方式

2.php://filter  => 对磁盘中的文件进行读写,因此可以通过该协议来达到对文件的读取

resource= 要过滤的数据流
read
= 读链的筛选列表 write = 写链的筛选列表 convert.base64-encode =>打开后是base64编码后的

该协议使用没有配置文件的限制,它可以读文件

http://127.0.0.1/test/include.php?a=php://filter/read=convert.base64-encode/resource=fupload.php    #读取文件,将内容base64编码输出

 

3.zip:// => 将压缩包里面的文件读取出来,并包含读取的文件,文件路径必须为绝对路径

http://127.0.0.1/test/include.php?a=zip://D:/phpstudy/WWW/test/hello.zip%23hello.txt    // %23是#编码,因为要会和url中#定为冲突

 

4.phar:// => 将压缩包里面的文件读取出来,并包含读取的文件,文件路径可用是相对路径

http://127.0.0.1/test/include.php?a=phar://hello.zip/hello.txt

关于file_get_contents()函数

在file_get_contents()中可以用php://filter协议进行写文件

这个函数在处理/.这个的时候会在写入的时候给自动删除。因此如果前面对后缀进行正则匹配

if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename))

详细原理http://wonderkun.cc/index.html/?p=626

使用方法

file_put_contents('php://filter/write=convert.base64-encode/resource=hello.php/.', 'PD9waHAgZWNobyAiaGVsbG8iOz8+');        #可以将base64解码内容写进去,并且不会保存/.

0x03包含的2种形式

本地包含

只要使用了include,require等包含的函数,就能本地包含

有时候会存在这个,添加后缀的过滤,导致无法随性所有的包含文件

include $path . "txt";

在php5.3即以下可用使用%00截断

http://127.0.0.1/test/get.php?file=hack.php%00

在php5.2.8以下能使用路径截断

window服务器利用256个. linux利用2038个/.组合来截断扩展名

http://127.0.0.1/test/get.php?file=hack.php........................................[256个]
http://127.0.0.1/test/get.php?file=hack.php/./././././././././././././[2038个]./././././.

远程包含

远程包含是跨地址的包含,即包含另外台服务器的页面

前提是在php.ini里面的allow_url_include=ON和allow_url_fopen=ON, allow_url_fopen默认是ON,allow_url_include在 php 5.2 后是OFF

http://127.0.0.1/test/include.php?a=http://www.baidu.com

猜你喜欢

转载自www.cnblogs.com/sijidou/p/10258663.html
今日推荐