一、什么是文件包含

文件包含可以直接执行被包含文件中的代码,包含的文件格式是不受限制的,只要能正常执行即可。文件包含又分为本地文件包含(Local file include)和远程文件包含(Rmote file include),不管是哪种都是非常高危的,渗透过程中文件包含漏洞大多可以直接利用获取webshell。在php中,一般使用这些函数:include(), include_once(), require(), require_once(),它们之间的区别在于: include()和include_once()在包含文件时即使遇到错误,下面的代码依然会执行;而require()和require_once()则会直接报错退出程序。

二、包含文件的位置

(一)本地文件包含

漏洞演示

本地文件包含,顾名思义就是包含本地的文件,即相对于对方服务器的本地,目标服务器上。

漏洞代码示例:

<? php
    $file =$_GET['file'];//GET方式获取参数
    include($file);//包含该文件
?>

这是个典型的本地包含漏洞,并没有限制后缀,可以包含任意格式的文件,利用”…/”可以跨目录,另外如果包含的文件非php可执行代码,会把文件内容打印出来。

访问链接是:

http://xxx.xxx.xxx/web3/index.php?file=tips.php

绝对路径和相对路径的区别:

特性 绝对路径 相对路径
定义 从文件系统的根目录盘符开始的完整路径。 当前文件当前工作目录开始的路径。
特点 定位精准,不受当前文件位置影响,但灵活性较低。 灵活,但容易因当前目录改变而失效(如文件嵌套时)。
示例 Windows: C:\Windows\System32\
Linux: /var/www/html/index.php
./index.php
../config.php 
web/index.php

. 代表当前目录,.. 代表上级目录

本地文件包含漏洞可以帮助攻击者获取webshell。

绕过技巧

  1. 限制访问目录时,使用相对路径跳转到指定目录,使用绝对目录时会报错。

  2. 限制包含的文件名时,可以在包含文件名后面加上%00隔断,但该方法只支持PHP<5.3且magic_quotes_gpc = Off,即使用php中字符的结束标识符来截断字符串。

  3. 通过加长url来实现自动截断,但部分服务器可能已有应对策略,但一般情况下,Windows下240个”.”,Linux下4096个”./”就可以。

(二)远程文件包含

当服务器满足前面本地文件包含的条件并打开allow_url_fopen选项和allow_url_include这两个选项时,可以使用远程文件包含。

绕过技巧

  1. 在url后面加入?截断,因为”?”后面再加上任何内容都不会影响远程的txt文件输出。

  2. 伪协议

协议 描述 典型利用
file:// 访问本地文件系统 用于读取本地源码或敏感文件(如 file:///etc/passwd
http:// 访问 HTTP(s) 网址 用于远程文件包含
ftp:// 访问 FTP(s) URLs 用于远程文件包含
php:// 访问各个输入/输出流 php://filter/read=convert.base64-encode/resource=flag
zlib:// 压缩流 用于处理压缩数据
data:// 数据(RFC 2397) 用于直接执行数据流中的代码
glob:// 查找匹配的文件路径模式 用于探测目录下的文件列表
phar:// PHP 归档 phar://zip文件名/shell名,PHP5.3后才加入此协议
ssh2:// Secure Shell 2 用于 SSH 连接
rar:// RAR 用于访问 RAR 压缩包
ogg:// 音频流 用于访问音频文件
expect:// 处理交互式的流 用于执行系统命令(需开启相关扩展)
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐