ctf之文件包含——你的秘密我知道

0 阅读3分钟

一、什么是文件包含

文件包含可以直接执行被包含文件中的代码,包含的文件格式是不受限制的,只要能正常执行即可。文件包含又分为本地文件包含(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://处理交互式的流用于执行系统命令(需开启相关扩展)