详解php文件包含原理(读取文件源码、图片马、各种协议、远程getshell等)
作者是namezz
(看完图相当于做了一轮实验系列)
现有文件代码如下
include和include_once、require、require_once用处差不多,故只举include例说明。话不多说,开始正文。(正文太啰嗦了,直接看总结吧)
功能说明
分别包含aaa和zzz,效果如下图所示
读取到zzz文件的内容<?phpecho __FILE__;并解析执行了,而aaa文件识别不为php,故直接输出源码内容。故包含/etc/passwd同理
用readfile读文件如图所示
由于加了图片头header,所以浏览器识别为图片类型。f12或抓包能看到响应包情况,能看到与include等不同的是,readfile是直接读文件内容,而不解析的。file_get_content同理(用法自行百度)。
原理说明:文件包含究竟包含了啥
首先,include函数和readfile函数都是先读取指定的内容(注意,这里是指定的内容而不是文件的内容,后面解释),而include函数会试图解析读取的内容,是否为php代码,如若是则执行,否则直接输出
如图所示,使用file协议、http协议、php协议(官方文档:http://php.net/manual/zh/wrappers.php)效果分别如下
因为默认配置是没开allow_url_include的,所以使用http协议读文件会失败(开了就是远程包含,后面会说)
以上使用file协议和php协议都读到了文件的源码,并执行了
在使用php://filter/read=convert.base64-encode/和php://filter/string.rot13/对读取的内容进行编码看看