No.22 笔记 | WEB安全 - 任意文件绕过详解 part 4
一、图片 Webshell 技术
(一)基本原理
- 图片 Webshell 的核心在于利用服务端文件类型检测机制的漏洞。服务端通常依靠检查文件头部的魔术数字(Magic Numbers)来判别文件类型,然而这种检测方式存在被绕过的可能性,从而为攻击者提供了可乘之机。攻击者借此在图片文件中嵌入恶意的 PHP 代码,以此实现攻击目的。
(二)文件格式特征速查表
文件类型 | 字节数 | 字节内容(十六进制) | 对应标识 |
---|---|---|---|
Png | 8 字节 | 89 50 4E 47 0D 0A 1A 0A | .PNG |
Jpg | 2 字节 | FF D8 | - |
Gip | 6 字节 | 47 49 46 38 39(37) 61 | GIF89(7)a |
Bmp | 2 字节 | 42 4D | BM |
(三)实战示例
1. 创建图片 Webshell
攻击者创建一个看似是图片但实际包含恶意 PHP 代码的文件,例如:
GIF89A<?php phpinfo();?>
这里以 GIF 格式为例,在文件开头添加符合 GIF 格式的标识后,紧接着嵌入 PHP 代码。
2. 文件包含漏洞利用
以下是一个典型的存在文件包含漏洞的 PHP 代码:
<?php
if($_GET){
include($_GET["file"]); // 此处的文件包含操作存在安全风险,未对传入的文件参数进行严格验证
} else{
echo "未获取到文件参数";
}
?>
当攻击者能够控制传入的file
参数时,就可以利用此漏洞执行恶意代码。
3. 攻击链路
- 首先,攻击者将伪装的图片文件上传到目标服务器。
- 然后,通过构造特定的 URL,利用文件包含漏洞来执行嵌入在图片文件中的恶意 PHP 代码。例如,访问
http://example.com/include.php?file=./upload/shell.gif
,其中include.php
是存在文件包含漏洞的文件,shell.gif
是攻击者上传的包含恶意代码的图片文件。
二、竞争条件攻击
(一)攻击场景
- 场景一:上传检测后删除
- 网站允许用户先上传任意文件。
- 随后对上传的文件进行检测,如果发现文件中包含 Webshell,则删除该文件。
- 场景二:类型限制后删除
- 网站允许用户上传文件,但在上传后会检查文件类型。
- 如果文件类型不符合要求,则调用
unlink
函数删除该文件。攻击者利用在文件被删除之前的短暂时间差来访问上传的 PHP 文件,从而执行其中的恶意代码。
(二)利用技术
以下是一个示例攻击代码:
<?php
fputs(fopen('shell.php','w'),'<?php phpinfo();?>');
?>
这段代码的作用是创建一个名为shell.php
的文件,并向其中写入<?php phpinfo();?>
这段 PHP 代码。攻击者利用网站的逻辑漏洞,在合适的时机上传并执行此代码。
(三)防护策略清单
- 严格的文件内容检测:对上传的文件进行全面的内容检查,不仅仅依赖于文件头部的魔术数字或文件扩展名来判断文件的安全性。
- 使用白名单限制文件扩展名:只允许特定的、经过授权的文件扩展名进行上传,防止恶意文件通过更改扩展名来绕过检测。
- 避免文件包含漏洞:在代码中,对所有的文件包含操作进行严格的安全验证,确保只包含可信的文件,避免攻击者通过控制文件包含路径来执行恶意代码。
- 及时更新应用程序:随着安全威胁的不断演变,及时更新 Web 应用程序及其相关组件,以修复已知的安全漏洞,确保系统的安全性。
- 实施并发控制机制:针对竞争条件攻击,通过实施并发控制机制,确保在文件上传、检测和处理的过程中,各个操作之间的顺序和完整性得到保证,避免攻击者利用时间差进行攻击。
三、任意文件下载漏洞
(一)漏洞特征
- URL 模式:常见的 URL 模式中包含类似
download.php?file=
这样的参数形式,其中file
参数可能被攻击者利用来指定要下载的文件路径。 - 参数特征:除了
file
参数外,还有path
、filename
等参数也可能存在漏洞,攻击者可以通过控制这些参数来尝试下载任意文件。 - 常见测试路径:攻击者通常会尝试使用
../../etc/passwd
这样的路径来测试是否存在任意文件下载漏洞,因为/etc/passwd
是系统中一个包含重要用户信息的文件,如果能够成功下载此文件,就意味着存在严重的安全漏洞。
(二)攻击面分析
1. 敏感信息获取
- 数据库配置文件:攻击者如果能够下载数据库配置文件,就可以获取数据库的连接信息,如用户名、密码、数据库地址等,进而可能通过远程数据库链接工具或在线数据库管理工具等方式获取数据库控制权,进行拖库、篡改数据库或进一步获取数据库中的敏感信息用于其他攻击。
- 系统配置文件:系统配置文件包含了系统的各种设置和参数信息,如
/etc/mysql/my.cnf
(MySQL 配置文件)、/etc/shadow
(包含用户密码的加密信息)等,获取这些文件可以帮助攻击者了解系统的配置情况,寻找其他潜在的攻击点。 - 应用程序源代码:下载应用程序的源代码后,攻击者可以对其进行分析,寻找其中存在的其他安全漏洞,如 SQL 注入漏洞、文件上传漏洞等,以便进一步扩大攻击范围。
- 日志文件:日志文件记录了系统和应用程序的各种操作信息,如
/var/log/apache2/access.log
,攻击者可以通过分析日志文件获取用户的访问模式、系统的活动情况等信息,这些信息可能有助于攻击者制定更有效的攻击策略。
2. 常见目标文件
以下是一些攻击者可能感兴趣的常见目标文件:
/etc/passwd
/etc/shadow
/etc/mysql/my.cnf
/var/log/apache2/access.log
web应用配置文件(如/WEB - INF/web.xml等)
(三)漏洞防护方案
1. 输入验证
在处理用户输入的文件路径参数时,进行严格的输入验证是至关重要的。例如,可以使用以下 PHP 代码对路径进行处理,防止路径穿越攻击:
$file = str_replace('..', '', $_GET['file']);
通过将用户输入的file
参数中的..
替换为空字符串,可以防止攻击者通过构造../../
这样的路径来访问服务器上的任意文件。
2. 访问控制
- 实施文件类型白名单:与竞争条件攻击中的防护策略类似,只允许特定类型的文件被下载,通过建立文件类型白名单来确保下载的文件是安全的。
- 限制文件访问目录:对文件的访问目录进行严格限制,确保用户只能访问到经过授权的目录中的文件,防止攻击者通过构造恶意路径来访问其他敏感目录中的文件。
- 实施用户权限控制:根据用户的角色和权限,对不同用户设置不同的文件下载权限,确保只有具有相应权限的用户才能下载特定的文件。
3. 最佳实践
- 使用安全的文件存储路径:将重要的文件存储在安全的目录中,避免将敏感文件放置在容易被访问到的位置。例如,可以将配置文件存储在一个受保护的目录中,只有具有特定权限的进程才能访问。
- 实施文件哈希验证:对重要的文件计算哈希值,并在文件下载或使用过程中进行验证,确保文件的完整性和未被篡改。如果文件的哈希值与预期不符,则可能存在文件被篡改的风险。
- 记录文件访问日志:对所有的文件访问操作进行详细的日志记录,包括访问的文件路径、访问时间、访问用户等信息。通过分析这些日志,可以及时发现异常的文件访问行为,有助于及时采取措施应对安全威胁。
- 定期安全审计:定期对系统和应用程序进行安全审计,检查是否存在新的安全漏洞,及时发现并修复可能存在的任意文件下载漏洞以及其他安全问题。
(四)漏洞检测方法
- Google Hacking:利用 Google 搜索引擎的强大功能,可以通过特定的搜索语法来查找可能存在任意文件下载漏洞的网站。例如,可以使用
inurl:"readfile.php?file="
或inurl:"download.php?path="
等搜索语法,来查找包含这些关键字的 URL,这些 URL 可能存在文件下载漏洞。 - 自动化扫描:使用专业的 Web 漏洞扫描工具,对网站进行全面的扫描,这些工具可以自动检测出可能存在的任意文件下载漏洞以及其他安全问题。
- 手动测试验证:除了自动化工具和搜索引擎外,手动测试验证也是一种重要的漏洞检测方法。安全人员可以通过手动构造恶意的文件路径参数,尝试下载不同类型的文件,来验证网站是否存在任意文件下载漏洞。
笔记精华归纳
一、图片 Webshell 技术
- 原理:利用服务端文件类型检测漏洞,在图片中嵌入 PHP 代码。
- 图片格式:不同格式有特定字节特征(如 PNG 为 89 50 4E 47 0D 0A 1A 0A 等)。
- 攻击流程:创建含恶意代码图片,利用文件包含漏洞,通过构造 URL 执行代码。
二、竞争条件攻击
- 场景:上传后检测或按类型检测并删除文件,攻击者利用时间差。
- 利用:示例代码创建恶意文件利用逻辑漏洞。
- 防护:检测文件内容、白名单扩展名、避免文件包含漏洞、更新应用、并发控制。
三、任意文件下载漏洞
- 特征:特定 URL 模式及参数可被利用,常用测试路径如../../etc/passwd。
- 攻击面:获取数据库、系统、应用配置及日志文件等信息。
- 防护:输入验证、访问控制(白名单、目录限制、权限控制)、最佳实践(安全存储、哈希验证、日志记录、定期审计)。
- 检测:Google Hacking、自动化扫描、手动测试。
今天学了这些 WEB 安全的知识,真心感觉好复杂呀!但是我知道光看不行,得自己动手多练习,加油加油! ( ̄ˇ ̄)