Web 安全(Web Security)

news2024/9/23 5:21:01

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老
导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云服务等。不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

Web 安全
技能目标:
-
了解常见的 Web 攻击类型
-
了解 SSRF、XXE 漏洞的产生原因
-
会搭建 SSRF、XXE 漏洞环境
-
会利用 SSRF、XXE 漏洞
-
会修复和防范 SSRF、XXE 漏洞

5.1 Web 安全风险与法规要求

当前 Web 应用已是企业必不可少的最主要 IT 系统之一。企业门户网站、电商平台等,
给企业带来业绩的同时,也给企业带来高安全风险的挑战。
Facebook、携程网、拼多多等国际国内知名网站,近年都曾爆出因网站存在安全漏洞,
导致用户信息泄露及被攻击等严重安全事件。
随着《网络安全法》和《等保 2.0》的落地,Web 等互联网应用的安全保障,已经不单
单是企业或个人的信息安全需要,而是国家的法律法规强制要求。如果不达标又未依法整改,
企业或个人必然会受到处罚。
以下是近年发生的因网站不安全被罚的典型案例。
哈尔滨市方正县某技术推广中心设立的服务平台网站遭受黑客攻击入侵,在社会上造成
恶劣影响。经查,该网站自开通以来长期无人维护,存在高危安全漏洞并被黑客攻击入侵,
造成严重后果。
以下是涵盖 Web 安全的等保 2.0 标准要求:
《等保 2.0》第二级(7.1.10.5)、三级 (8.1.10.5)和四级(9.1.10.5)关于“漏洞
和风险管理”要求,如下:
a.应采取必要的措施识别安全漏洞和隐患,对发现的安全漏洞和隐患及时进行修补或评
估可能的影响后进行修补。
b.应定期开展安全测评,形成安全测评报告,采取措施应对发现的安全问题。
以上 a、b 项是等保 2.0 三级 (8.1.10.5)和四级(9.1.10.5)的共同要求;等保 2.0
二级(7.1.10.5)仅有一项 a 项要求;等保 2.0 一级标准未定义“漏洞和风险管理”要求。
在等保 2.0 标准中所指的漏洞,既包括 Web 程序漏洞,也包括系统层面和网络层面的漏
洞。本章主要讲解 Web 程序漏洞。

5.2 常见的 Web 攻击方式

在当今的互联网领域,SQL 注入、跨站脚本攻击(Cross site scripting, XSS)(也缩
写为 CSS,为防止和美工的 CSS 混淆,所以业内都简称 XSS)、XML 外部实体注入漏洞(XML
External Entity Injection,XXE)、跨站请求伪造(Cross-site request forgery,CSRF)、
服务端请求伪造(Server-Side Request Forgery,SSRF)等,仍然是 Web 安全的主要威胁。
下面是对这几种安全威胁的介绍。

1. SQL 注入攻击

SQL 注入攻击,指通过把 SQL 命令输入到 Web 表单或页面请求的查询字符串,达到欺
骗服务器执行恶意的 SQL 命令的目的。比如一些影视网站泄露 VIP 会员密码大多就是通过
WEB 表单提交查询窃取的。黑客通过 SQL 注入攻击可以拿到网站数据库的访问权限,之后他
们就可以获得网站数据库中所有的数据,恶意的黑客可以通过 SQL 注入功能篡改数据库中的
数据甚至会把数据库中的数据毁坏掉。

2.跨站脚本攻击

跨站脚本攻击(XSS)指的是攻击者往 Web 页面里插入恶意脚本代码,当用户浏览该页
之时,嵌入其中 Web 里面的脚本代码会被执行,从而达到恶意攻击用户的目的。
XSS 攻击方式比较有代表性的是:反射型攻击和存储型攻击两种类型。

(1)XSS 反射型攻击

XSS 反射型攻击,又称非持型 XSS。恶意代码并没有保存在目标网站,而是通过引诱用
户点击一个含有恶意脚本代码的链接来实施攻击。图 5.1 展示了常见的 XSS 反射型攻击的攻
击流程。
图 5.1 XSS 反射型攻击

(2)XSS 存储型攻击

XSS 存储型攻击,又称持久型 XSS。恶意代码被保存到目标网站的服务器中,当用户访
问这些页面时,就会自动执行其中的 XSS 语句。比较常见场景是在博客、论坛等社交网站上,
比如:攻击者在发帖、留言的过程中,将恶意 XSS 脚本连同正常信息注入内容。随着帖子,
恶意 XSS 脚本也被保存在服务器中。当其他用户浏览帖子或者留言时,恶意 XSS 脚本会在他
们的浏览器中执行。
XSS 攻击可以窃取 Cookies 信息,读取 Cookies 发送到黑客服务器;也可以窃取用户资
料,如:邮件列表、系统的客户资料、联系人列表等等。它可以获取用户的联系人列表,然
后向联系人发送虚假诈骗信息等等。图 5.2 展示的是 XSS 存储型攻击的流程。
图 5.2 XSS 存储型攻击

3. XML 外部实体注入漏洞

XML 外部实体注入漏洞,又称 XXE 漏洞。XXE 漏洞发生在应用程序解析 XML 输入时,没
有禁止外部实体的加载,会导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、
内网端口扫描、发起 Dos 攻击等危害。

4.跨站请求伪造

跨站请求伪造(CSRF)与“跨站脚本攻击(Cross Site Scripting)”名字上比较相似,
但它与 XSS 的攻击方法完全不一样。XSS 利用漏洞影响站点内的用户,攻击目标是同一站点
内的用户,而 CSRF 则是通过伪装成受害用户向其他站点发送恶意请求,造成用户的利益受
损。
比如:网站 A 有 CSRF 漏洞,网站 B 是一个恶意网站。当用户没有退出 A 网站,或者用
户登录 A 网站的 cookie 没有过期,只要在同一个浏览器中打开了网站 B,攻击者就可以利
用用户在 A 网站的身份和权限,进行恶意操作。CSRF 攻击过程如图 5.3 所示。
图 5.3 CSRF 攻击

5. 服务端请求伪造

服务器端请求伪造(SSRF)) 是一种由攻击者构造形成由服务端发起请求的安全漏洞。
由攻击者构造的攻击链接传给服务端执行,一般用来在外网探测或攻击内网服务。正是因为
它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统。SSRF 的攻击
过程如图 5.4 所示。
图 5.4 SSRF 攻击
Web 攻击对计算机系统的安全会造成较大的威胁,本小节介绍了几种常见 Web 攻击方式
及其攻击过程希望对相关工作人员提供一定的参考作用,有效的找到防止攻击的方法。

5.3 SSRF 漏洞分析

下面以 SSRF 为例,分析 SSRF 漏洞的成因、漏洞利用以及修复方法。

1.漏洞成因

SSRF 形成的大部分原因是由于服务端提供了从其他服务器获取应用数据的功能,且没
有对目标地址进行 URL 过滤与限制的处理。

2.漏洞利用

通常,黑客利用 SSRF 漏洞进行下面的攻击。

(1)扫描内网主机及端口

构造 payload(即攻击代码)可请求本地端口或批量扫描内网主机和端口获取 banner
信息。

(2)本地文件读取

可使用 File 文件协议构造系统默认路径读取本地系统文件或根据路径信息泄露读取其
他配置文件。例如:
Linux 下:file:///etc/passwd
Windows 下:file:///c:\Windows\win.ini

(3)构造 POC/EXP 攻击服务器

可根据任意主机开放的任意端口,寻找对应漏洞,构造 payload 攻击。例如 Redis 未授
权访问使用 dict://127.0.0.1:6379/info,获得 Redis 版本以及运行状态的关键信息。

(4)DDOS 攻击

构造攻击请求,请求大文件,将请求的 HTTP 连接状态始终保持为 Keep-Alive Always,
造成服务器拒绝服务攻击。

3. 可利用协议

Web 网站如果存在 SSRF 漏洞,攻击者可利用多种协议对网站发起攻击。以下是 SSRF 攻
击可利用的常见协议。

(1)HTTP/HTTPS

直接构造 HTTP 请求,例如:http://www.xxx.com:80,可根据端口响应时间判断端口是否
开放。

(2)DICT

DICT 协议是一个字典服务器协议,该协议约定服务器端侦听端口号:2628。
若系统存在 Redis 服务,可通过 dict://127.0.0.1:6379/info 利用漏洞获取 Redis 信
息。

(3)File

可 利 用 File 协 议 进 行 本 地 文 件 读 取 操 作 , 例 如 在 Linux 系 统 下 , 可 以 利 用
file:///etc/shadow 读取本地密码文件内容。

(4)Gopher

Gopher 属于万能协议,可转换为任意协议。能够将所有操作转成数据流,并将数据流
一次发出去。所以,可以用来探测内网的所有服务的所有漏洞。

(5)TFTP

TFTP 为一个文件传输协议,可通过构造请求传输文件内容。

5.4 SSRF 案例介绍

上述内容介绍了漏洞产生原理和利用漏洞攻击的一些方法,下面将通过搭建靶机环境展
示在模拟环境下对 SSRF 漏洞的利用攻击,以及在靶机的环境下,演示漏洞的攻击效果,可
更直观的了解漏洞所造成的影响。下面从靶机环境搭建再到动手实践,演示漏洞的攻击方法
及防护策略,亲身体验 SSRF 漏洞攻击与防护的较量。

5.4.1 SSRF 案例环境

1.基本环境配置

本案例实验环境配置,如表 5-1 所示。
表 5-1 案例环境
主机操作系统IP 地址主要软件
攻击机
(物理机)
Windows10 版本 64 位系统192.168.0.103
Firefox 60.0.2
VMware Workstation 12 pro
Notepad++v7.7.1
靶机
(虚拟机)
WindowsServer
2012
R2
Standard 64 位系统
192.168.0.230
phpStudy2014Web 环境
Redis3.2.100
pikachu 漏洞靶机环境
Notepad++v7.7.1

2.案例工具介绍

(1)phpStudy 2014 Web 环境

该程序包集成最新的 Apache+PHP+MySQL+phpMyAdmin,一次性安装,无须配置即可使用,
是非常方便、好用的 PHP 调试环境。该程序不仅包括 PHP 调试环境,还包括了 PHP 的开发工
具、开发手册等。
在本章 SSRF 和 XXE 案例中,为 pikachu 漏洞环境提供 Web 服务。

(2)Redis3.2.100 数据库

Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志
型、Key-Value 数据库,它提供了多种语言的 API。
本章 SSRF 案例中需要安装 Redis 服务,并通过 SSRF 利用 Redis 未授权访问漏洞。

(3)Pikachu 漏洞靶机环境

Pikachu 是一个带有漏洞的 Web 应用系统,在系统中包含了常见的 web 安全漏洞。
在本章 SSRF 和 XXE 案例中,将使用 Pikachu 系统中的 SSRF 漏洞环境和 XXE 漏洞环境,
来演示 ssrf 漏洞和 XXE 漏洞的利用。

(4)Notepad++v7.7.1

Notepad++ v7.7.1 官方版是一款免费开源的全能文本代码编辑器。它是小巧高效的文本编辑器、支持语法高亮的开源纯文本编辑器,并且可以替代系统自带的记事本的功能,资
源占用小,支持众多程序语言,比如 C++、C#、Java 等主 流程序语言;支持 HTML、XML、
ASP,Perl、Python、JavaScript 等网页/脚本语言。
完成本案例不建议使用 Windows 自带的记事本编辑器,Windows 记事本编辑器功能单一
使用不便,易导致异常问题。

5.4.2 环境搭建

本小节将开始搭建漏洞靶机环境。以下步骤将先搭建并配置 phpStudy 环境以提供 Web
及 PHP 服务,其中 Redis 作为本案例实施过程中所需要用到的服务,故需提前配置完成。最
后部署 Pikachu 漏洞靶机环境提供本案例所对应的 SSRF 漏洞环境。

1.下载所需工具

Pikachu 靶机下载地址:https://github.com/zhuifengshaonianhanlu/pikachu
phpStudy2014 官网下载地址:http://phpstudy.php.cn
Redis 下载地址:http://redis.io/download
2.安装 phpStudy 软件
下面是 phpStudy 软件的安装步骤。
(1)在靶机(192.168.0.230)上安装 phpStudy 软件,如图 5.5 所示。
图 5.5 安装 phpStudy
(2)点击“下一步”按钮,进入 phpStudy 安装导航对话框,如图 5.6 所示。
图 5.6 phpStudy 安装导航
此处需选择安装路径,保持默认 C:\phpStudy。
(3)继续点击“下一步”按钮,进入指定 PHP 安装路径的界面,如图 5.7 所示。
图 5.7 PHP 安装路径
选择 PHP 安装路径,也是网站根目录路径,这里使用 C:\WWW。
(4)继续点击“下一步“按钮,进入选择安装方式的界面,如图 5.8 所示。
图 5.8 选择安装方式
选择安装方式,默认为完全安装,保持默认值。
(5)继续点击“下一步”按钮,进入确认安装文件夹界面,如图 5.9 所示。
图 5.9 确认安装文件夹
此步骤需给 phpStudy 的快捷方式命名,本案例保持默认值。
(6)继续点击“下一步”按钮,进入准备安装的界面,如图 5.10 所示。
图 5.10 准备安装
(7)在图 5.10 中点击“安装”按钮之后,根据提示信息向下执行。直至安装完成,如
图 5.11 所示。
图 5.11 安装完成
(8)稍等片刻可看到安装完成界面。点击“完成”按钮,打开 phpStudy 管理界面,如
图 5.12 所示。
图 5.12 phpStudy 管理界面
(9)在图 5.11 界面,点击“完成”按钮后,会同时打开 phpStudy 使用手册。可先查看
使用手册了解 phpStudy 的使用方法。如果不需查看使用手册,可直接使用 phpStudy 环境,
如图 5.12 所示。此时 Apache 服务和 MySQL 服务在安装完成后均可以自行启动。

3.配置 phpStudy 软件

下面进行靶机环境配置,操作步骤如下。
(1)打开 phpStudy,找到 php.ini 文件,如图 5.13 所示。
图 5.13 文件位置
(2)打开 php.ini 文件,找到下列两个参数,将参数值修改为 on。
allow_url_include = On(需要手动开启)
allow_url_fopen = On(默认为开启)
注意:若保存时报错,关闭 phpStudy 并重新以管理员权限打开。参数值修改界面,如
图 5.14 所示。
图 5.14 修改参数值

4.安装 Redis 服务

安装 Redis 服务的步骤如下

(1)在靶机中(192.168.0.230)双击安装包并进入安装界面,如图 5.15 所示。

5.15 Redis 安装

(2)点击“Next”按钮进入协议确定界面,如图 5.16 所示。
图 5.16 同意协议
(3)勾选复选框,表示同意协议,点击“Next”按钮,如图 5.17 所示。
图 5.17 安装目录
(4)选择本案例的安装位置为“C:\Redis”,点击“Next”按钮,如图 5.18 所示。
图 5.18 服务端口
(5)此处需设置服务开放端口,默认为 6379,此处保持默认值。点击“Next”按钮,
如图 5.19 所示。
图 5.19 设置内存
(6)此处保持限制 Redis 服务占用的内存空间的默认值,点击“Next”按钮,如图 5.20
所示。
5.20 安装准备
(7)进入安装前准备阶段,直接点击“Install”按钮,开始安装 Redis 服务,如图 5.21
所示。
图 5.21Redis 安装完成
至此,Redis 安装完成并启动。

5.部署 pikachu 漏洞环境

部署 pikachu 环境的步骤如下。
(1) pikachu 下载后解压,将目录名修改为 pikachu;放置于 C:\WWW 目录下,修改
pikachu 目录下 inc/config.inc.php 里面的数据库连接配置,需要注意:phpStudy 安装完后
默认用户名和密码都为 root。如图 5.22 所示。
图 5.22 连接配置
(2)在浏览器打开“http://192.168.0.230/pikachu”,如图 5.23 所示。首先要进行初始
化安装,点击右上方的文字“提示:欢迎使用 pikachu 还没有初始化,点击进行初始化安装!”,
进行初始化安装。
图 5.23 靶机主页
(3)进入系统初始化安装界面后,点击“安装/初始化”按钮,如图 5.24 所示。
图 5.24 初始化
(4)初始化完成后,会显示连接成功提示,如图 5.25 所示。
图 5.25 初始化完成
(5)切换 PHP 版本,点击 phpStudy 中的“PHP 版本”按钮,如图 5.26 所示。
图 5.26 php 版本
(6)在图 5.27 界面中,勾选“apache+php5.4n”单选框,点击“应用”按钮将会切换
php 版本,并自动重启 apache 与 php 服务。
图 5.27 php 版本
(7)PHP 版本切换完成后,在靶机环境初始化完成界面。点击“点击这里”按钮,进入
靶机首页,如图 5.28 所示。
图 5.28 “点击这里”进入首页
(8)在靶机首页,左侧导航栏下方找到并点击“ssrf(curl)”按钮,如图 5.29 所示。
图 5.29 点击“ssrf(curl)”按钮
(9)看到如图 5.30 所示界面。至此,靶机配置完成。
图 5.30 ssrf 漏洞效果起始页
5.4.3 攻击展示
下面是 SSRF 漏洞攻击演示的步骤。
(1)在图 5.26 中,点击“累了吧,来读一首诗吧”,如图 5.31 所示。
图 5.31 SSRF 漏洞效果展示页
在图 5.31 中,URL 参数为 http://xxxxx 字样,证明服务器向另一个服务器发起请求。
若向另一个服务器发起请求时过滤不严,可能导致 SSRF 漏洞。
(2)尝试构造请求,获取本地系统文件内容 file:///C:\Windows\win.ini,浏览器访问
http://192.168.0.230/pikachu/vul/ssrf/ssrf_curl.php?url=file:///C:\Windows\win.
ini,如图 5.32 所示

图 5.32 ssrf 漏洞测试
图 5.32 中,使用 File 协议成功读取了服务器本地系统文件 win.ini,可见 ssrf 漏洞
存在。
( 3 ) 在 攻 击 机 上 使 用 dict 协 议 探 测 靶 机 本 地 \ 内 网 端 口 构 造 请 求 内 容
dict://127.0.0.1:3306 , 添 加 到 “ url= ” 后 , 实 际 URL 地 址 http://192.168.0.230/pikachu/vul/ssrf/ssrf_curl.php?url=dict://127.0.0.1:3306,Q
敲入回车键后,返回 MySQL 的版本信息以及 MySQL 存储密码的加密方式,如图 5.33 所示。
图 5.33 dict 协议展示
(4)ssrf 也可以利用内网系统程序漏洞,例如 Redis 未授权漏洞利用。首先在靶机环
境 启 动 Redis 服 务 , 切 换 到 Redis 安 装 目 录 下 执 行 命 令 redis-server.exe
redis.windows-service.conf 启动 Redis-server 服务,然后执行 redis-cli.exe 进入 Redis
客户端,如图 5.34 所示。
图 5.34 Redis 启动
(5)在攻击机上构造攻击请求 dict://127.0.0.1:6379/info,利用 ssrf 执行 Redis 未
授权访问漏洞,获取 Redis 信息,如图 5.35 所示。
攻击者从中可以获得 Redis 的大量配置及运行信息,比如:版本号 3.2.100,采用
standalone 单机模式部署,操作系统为 Windows,在线时间为 2 天,以及后面的内存、CPU
资源使用情况等。
图 5.35 Redis 未授权访问
5.4.4 防护措施
根据上述演示对 ssrf 漏洞常见的利用方法,可以制定出一些对漏洞的修复方案。本小
节从开发者的角度,对产生漏洞的代码进行修复措施。
1.限制访问协议
找到漏洞文件 C:\WWW\pikachu\vul\ssrf\ssrf_curl.php,用记事本打开,代码如下所
示:禁用不需要的协议,仅仅允许 http 和 https 请求。
function curl($url){
$ch = curl_init();
curl_setopt($CH, CURLOPT_URL, $url);
curl_setopt($CH, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
curl_setopt($CH, CURLOPT_HEADER, 0);
curl_exec($CH);
curl_close($CH);
}
$url = $_GET['url'];
修复代码如图 5.36 所示。
图 5.36 允许访问协议
此时不允许使用 dict 协议。当然除 https 以外,其他任何协议都将无任何信息返回,
这样可以有效地防止通过 File 协议读取本地文件或通过 dict 协议探测端口。使用 dict 协
议探测端口的界面效果如图 5.37 所示。之前能读取的 MySQL 的数据库版本等信息,现在已
无法再读取,可与图 5.33 进行比较代码修复前后的差别。
图 5.37 修复后执行 dict 协议攻击展示
2.统一错误信息
统一错误信息是为了避免攻击者根据错误信息来判断远端服务器的端口状态。
此处,可以通过对协议的判断,自定义统一错误回显,代码如下:
if (in_array(parse_url($url)['scheme'], ['http','https'])){
echo curl($url);
}
else {
echo 'happen the error';
}
修复代码如图 5.38 所示。
图 5.38 统一错误信息
此时,攻击者如果企图利用 http/https 以外的协议进行攻击,都是返回 happen the
error,这样可有效防止攻击者根据返回信息得到有效信息。如图 5.39 所示。
图 5.39 错误信息
5.5 XXE 漏洞分析
在 5.2 节中,简单介绍了 XXE 漏洞。要了解 XXE 漏洞的形成原因 ,需要先了解 xml 语
言的基本概念,接下来将从 XML 文档组成、DTD 文档及 DTD 实体三方面讲述 XML 语言。
5.5.1 XML 文档介绍
XML 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,
它是一种允许用户对自己的标记语言进行定义的源语言。
1.XML 文档结构
XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素,如下代码展示的
是 XML 文档结构。
<!--XML 声明-->
<?xml version="1.0"?>
<!--文档类型定义-->
<!DOCTYPE note [ <!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,heading,body)><!--定义 note 元素有四个元素-->
<!ELEMENT to (#PCDATA)><!--定义 to 元素为”#PCDATA”类型-->
<!ELEMENT from (#PCDATA)><!--定义 from 元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)><!--定义 head 元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)><!--定义 body 元素为”#PCDATA”类型-->
]>
<!--文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>
2.DTD 文档类型定义
DTD 的英文全称是“The document type definition”,即是文档类型定义,可定义合
法的 XML 文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明
于 XML 文档中,也可作为一个外部引用。DTD 分为两种构建方式,内部声明 DTD 和引用外
部 DTD:
(1)内部声名 DTD
<!DOCTYPE 根元素 [元素声明]>
(2)引用外部 DTD
<!DOCTYPE 根元素 SYSTEM "文件名">
(3)DTD 中包含一些重要的关键字:
DOCTYPE(DTD 的声明)
ENTITY(实体的声明)
SYSTEM、PUBLIC(外部资源申请)
3.DTD 实体
DTD 实体是用于定义引用普通文本或特殊字符的快捷方式的变量, 按实体的存在形式分
为:内部实体和外部实体。
(1)内部实体
内部实体在一个 XML 文档的内部定义,只能在该文档内部引用。就像子程序中的局部变
量,只在该程序中生存。如果子程序退出,它也就随之消亡。
<!ENTITY 实体名称 "实体内容">
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer "Bill Gates">
]
<test>&writer;©right;</test>
(2)外部实体
外部实体在文档中必须通过 URL 才能定位,外部实体为独立的文件,可以被多个文档所
引用。XML 通过对外部实体的引用,可以在一个 XML 文档中嵌入另一个 XML 文档,或者将多
个文档组合为一个文档。
<!ENTITY 实体名称 SYSTEM "URI">
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer SYSTEM "http://www.test.com.cn/entities.dtd">
]
<author>&writer;©right;</author>
5.5.2 XXE 漏洞成因和利用
接下来讲解 XXE 漏洞的成因和利用知识。
1.漏洞成因
XXE 漏洞的产生正是因为在引用外部实体时,未对实体内容(上述外部实体中
http://www.test.com.cn/entities.dtd)进行过滤,导致可构造恶意内容攻击服务器。
2.漏洞利用
XXE 漏洞有很多种利用方式,可以利用多种协议进行攻击,不管是任意文件读取还是命
令执行都可以利用 XXE 来完成,可以说影响非常大。
(1)内网端口探测内网端口
利用 XXE 漏洞,通过构造 payload(攻击代码)可以从互联网探测目标网站的内网服务
器端口开放情况。例如利用 http 协议,进行内网端口探测,代码如下。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[ <
!ENTITY xxe SYSTEM "http://10.100.200.2:8080/slfe/"> ]>
<login>&xxe;</login>
通过返回信息,就可以知道内网这台服务器的 8080 端口是否开放。
(2)本地文件读取
可使用 file 文件协议构造系统默认路径读取本地系统文件或根据路径信息泄露读取其
他配置文件。例如:
Linux 下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [<!ENTITY passwd SYSTEM "file:///etc/passwd">]>
<a>
<value>&passwd;</value>
</a>
Windows 下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [<!ENTITY passwd SYSTEM "file:///c:/Windows/win.ini ">]>
<a>
<value>&passwd;</value>
</a>
(3)执行系统命令
在安装 expect 扩展的 PHP 环境下,可通过如下代码来执行系统命令。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [<!ENTITY passwd SYSTEM "expect://whoami">]>
<a>
<value>&passwd;</value>
<a>
(4)执行 DDOS 攻击
构造请求,请求多个实体并相互调用,造成服务器拒绝服务。例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE a [
<!ENTITY test “test” >
<!ENTITY test1 “&test; &test; &test; &test; &test;” >
<!ENTITY test2 “&test1; &test1; &test1; &test1; &test1;” >
]>
<a>
<value>&passwd;</value>
</a>
3.可利用协议
XXE 漏洞使攻击者可利用 HTTP 协议、PHP 协议、File 协议等多种协议执行攻击。
(1)HTTP 协议
攻击者可以直接构造实体内容为 HTTP 请求,例如:http://www.xxx.com:80,可根据端口
响应信息判断端口是否开放。
(2)PHP 协议
攻击者可直接利用 PHP 协议构造下面内容的实体,将“index.php”文件的内容进行
base64 编码,然后进行读取。
“php://filter/read=convert.base64-encode/resource=index.php”
(3)File 协议
攻击者可利用 File 协议进行本地文件读取操作,例如在 Linux 系统下,则可以构造实
体内容为 file:///etc/shadow 读取本地密码文件内容。
5.6 XXE 案例介绍
XXE 漏洞在利用上涉及 XML 的知识较多,在利用漏洞进行攻击时使用的 payload 也较为
复杂,漏洞所造成的危害很大。下面将通过搭建靶机环境展示 XXE 漏洞的利用及攻击效果,
可更直观的体现漏洞所造成的影响。
5.6.1 环境介绍
本案例实验环境配置,如表 5-2 所示。
表 5-2 本章案例的实验环境
主机操作系统IP 地址主要软件
攻击机
(物理机)
Windows10 版本 64 位系统192.168.0.103
Firefox 60.0.2
VMware Workstation 12 pro
Notepad++v7.7.1
靶机
(虚拟机)
WindowsServer
2012
R2
Standard 64 位系统
192.168.0.230
phpStudy2014Web 环境
pikachu 漏洞靶机
Notepad++v7.7.1
5.6.2 环境搭建
按下面步骤完成实验环境的搭建工作。
1.安装 phpStudy 软件
如果在前面案例中已部署,可向下执行。如果独立部署本案例,操作步骤可参见 5.4.2
中“安装 phpStudy 软件”和“配置 phpStudy 软件”相关内容。
2.部署 pikachu 漏洞环境
如果在前面案例中已部署,可向下执行。如果独立部署本案例,操作步骤可参见 5.4.2
中“部署 pikachu 漏洞环境”的相关内容。
(1)靶机部署完成后,在左侧导航栏中找到 XXE 漏洞如图 5.40 所示。
图 5.40 XXE 漏洞位置
(2)点击“XXE 漏洞”超链接,进入 XXE 漏洞环境,如图 5.41 所示。
图 5.41 XXE 漏洞
5.6.3 攻击展示
部署了案例的环境后,便可以开始尝试漏洞实战。下面操作均在攻击机上执行的具体操
作。
(1)构造 XML 数据
在图 5.42 输入框中输入任意字符,点击“提交”按钮后,获得提示信息“XML 声明、
DTD 文档类型定义、文档元素这些都搞懂了吗?”,说明请求出错,需要自己构造 XML 数据。
如图 5.42 所示。
图 5.42 提示信息
构造 XML 数据的代码如下:
<?xml version = "1.0"?>
<!DOCTYPE note [
<!ENTITY hacker "ESHLkangi">
]>
<name>&hacker;</name>
将以上代码,复制到图 5.43 的输入框中。注意:输入框中只能单行粘贴,为了防止粘
贴不全,可在记事本中将以上代码合并成一行,再贴入。
图 5.43 DTD 实体
接着,点击“提交”按钮。查看程序是否可以解析 DTD 实体,输出 ESHLkangi。
在图 5.43 中,页面输出“ESHLkangi”,证明此处可解析 XML 数据,并且没有禁用实体
引用。
(2)尝试构造请求
下面是尝试构造请求的代码:
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///c:/Windows/win.ini">
]>
<x>&f;</x>
将以上代码,复制到图 5.44 的输入框中,点击“提交”按钮。可成功读取到本地系统
文件 file:///C:/Windows/win.ini 的内容,如图 5.44 所示。使用 File 协议读取本地文件,
由此可知 XXE 漏洞存在。
图 5.44 文件读取
(3)继续构造请求
编辑一个 test.php 文件,输入一些内容。本案例中输入的字符串是“this is a
testdata”,将 test.php 文件保存在 C:\WWW 目录下,然后将下列字符串拷贝到图 5.45 的
输入框中,点击“提交”按钮。注意:由于靶机环境的原因,请使用英文测试,中文会出现
异常。
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM
"http://192.168.0.230/test.php"> ]><x>&f;</x>
如图 5.45 所示,在点击了“提交”按钮后,因为存在 XXE 漏洞,所以利用 http 协议成
功解析读取了存放在服务器上面的 test.php 文件的内容。
图 5.45 文件读取 1
再编辑一个 test.txt 文件测试,输入一些内容。本案例输入的是“this is a text page”
并保存在 C:\WWW 目录下,然后将下列代码复制粘贴到输入框中。
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM
"http://192.168.0.230/test.txt"> ]><x>&f;</x>
点击“提交”按钮,如图 5.46 所示。
图 5.46 文件读取 2
​​​​​​​在点击了“提交”按钮后,因为存在 XXE 漏洞,所以利用 http 协议成功解析读取了存
放在服务器上面的 test.txt 文件的内容。
(4)利用 php 协议来读取文件
对于 XXE 漏洞也可以利用 php 协议来获得文件内容,并把文件内容加密为 base64 格式
进行读取。这样的做法可避免由于文件内容存在特殊字符而导致文件读取失败。
首先,在 c 盘根目录下创建一个 password.txt 的文本文件,内容为“123456”。
<!DOCTYPE ANY [ <!ENTITY f SYSTEM
"php://filter/read=convert.base64-encode/resource=c:/password.txt">
] ><x>&f;</x>
然后,将下列代码复制粘贴到输入框中,点击“提交”按钮,如图 5.47 所示。
图 5.47 PHP 协议
点击“提交”按钮后,成功读取文本内容并转换成了 Base64 格式。
再使用在线 base64 解密网站 http://tool.chinaz.com/Tools/Base64.aspx,解密字符
串得文件内容为“123456”,如图 5.48 所示。
图 5.48 base64 解密
至此,成功获得 c:/password.txt 文件内容并用 base64 加密。
通过上面的演示,可以得知:对于存在 XXE 漏洞的网站,攻击者利用 HTTP 协议、File
协、PHP 协议,可以成功窃取服务器上的文件内容,而这些文件很可能是企业的私密文件。
5.6.4 防护措施
XXE 漏洞存在是因为 XML 解析器解析了用户发送的不可信数据。可以采用禁用外部实体
和过滤用户提交的 XML 数据等方法来防范 XXE 攻击。下面是具体的修复操作步骤。
(1)禁用外部实体
修改靶机环境(192.168.0.230)漏洞文件,在 c:\WWW\pikachu\vul\XXE\XXE_1.php
中,加入如下代码。
libxml_disable_entity_loader(true);
//加入此行代码,禁用外部实体
$
data = @simplexml_load_string($xml);
//此行去掉 LIBXML_NOENT 等参数
修复后,代码如图 5.49 所示。
图 5.49 漏洞修复 1
通过上面的设置,外部实体被禁用,再用前面加载外部实体窃取本地文件内容的方法进
行攻击,在输入框中输入以下代码,发现返回信息为空。攻击已经失效,原来能够成功窃取
的文件内容,现在已经无法获得,如图 5.50 所示。
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///c:/Windows/win.ini">
]>
<x>&f;</x>
攻击已经失效,原来能够成功窃取的文件内容,现在已经无法获得,如图 5.50 所示。
图 5.50 漏洞利用失败
(2)过滤用户提交的 XML 数据
修改靶机环境(192.168.0.230)漏洞文件 c:\WWW\pikachu\vul\XXE\XXE_1.php 中的
过滤关键词:<!DOCTYPE 和<!ENTITY,或者 SYSTEM 和 PUBLIC,须增加代码下面示例中加粗
的代码。
// libxml_disable_entity_loader(true);
$string = array(
'<!DOCTYPE',
'<!ENTITY',
'SYSTEM',
'PUBLIC'
);
if(isset($_POST['submit']) and $_POST['xml'] != null){
$xml =$_POST['xml'];
$data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);
$body = file_get_contents('php://input');
//
echo "--- 获取到的原始数据--- \r\n".$body;
foreach ($string as $value) {
if (strstr($body,$value)){
echo 'request not allowed';
return;
}
else{if($data){
$html.="<pre>{$data}</pre>";
}
else{
$html.="<p>XML 声明、DTD 文档类型定义、文档元素这些都搞懂了吗?</p>";
}
}
}
}
再次构造请求获取本地文件时,请求被禁止,无法获取文件内容。构造请求如下,界面
效果如图 5.51 所示。
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///c:/Windows/win.ini"> ]><x>&f;</x>
图 5.51 漏洞防护
至此,XML 外部实体注入漏洞修复成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2156665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信息安全工程师(11)网络信息安全科技信息获取

一、信息获取的重要性 在网络安全领域&#xff0c;及时、准确地获取科技信息对于防范和应对网络威胁至关重要。这些信息可以帮助安全团队了解最新的攻击手段、漏洞信息、防护技术等&#xff0c;从而制定有效的安全策略和应对措施。 二、信息获取的来源 网络信息安全科技信息的获…

s3c2440各部分应用

一、按位运算 按位与&&#xff1a;清零&#xff0c;清零位&0&#xff1b; 如&#xff1a;0xFFFF &&#xff08; ~&#xff08;1 << 7&#xff09;&#xff09;, 将第7位清零。 按位或 | &#xff1a;置1&#xff0c;置1位 | 1&#xff1b; 如&…

MySQL(七)——事务

文章目录 事务事务的概念事务的ACID特性事务的语法查看存储引擎查看自动提交参数和设置手动事务操作保存点 隔离级别与并发事务问题隔离级别并发事务问题 事务 事务的概念 事务&#xff08;Transaction&#xff09;是数据库管理系统中执行过程中的一个逻辑单位&#xff0c;由…

Rx Strategist:智能体实现处方验证的方方面面,如适应症、剂量、药物相互作用

Rx Strategist&#xff1a;智能体实现处方验证的方方面面&#xff0c;如适应症、剂量、药物相互作用 秒懂大纲提出背景&#xff1a;拆解解法分析全流程分析创意 秒懂大纲 ├── 处方验证系统【主题】 │ ├── 背景和问题【问题描述】 │ │ ├── 现代药物复杂性对严…

Java基础面试题——异常

目录 关系图 1. Throwable和Exception之间的关系 2.异常分为哪两大类 3.常见的 RuntimeException 4. 常见的 Error 5.什么是已检查异常和未检查异常&#xff1f;它们的区别是什么&#xff1f; 6.Java 中如何自定义异常&#xff1f; 7.throw 和 throws 的区别是什么&…

ML 系列:机器学习和深度学习的深层次总结(07)数据预处理—解决缺失值、异常值和错误数据

文章目录 一、说明二、数据预处理三、缺失值四、数据集中可能会出现多种类型的缺失值&#xff1a;五、处理缺失值的方法六、结论 一、说明 在AI数据挖掘中&#xff0c;对原始数据的预处理是必须的技术手段&#xff0c;本篇将对数据预处理的一系列注意事项进行展示。 二、数据…

JavaEE: 深入探索TCP网络编程的奇妙世界(五)

文章目录 TCP核心机制TCP核心机制六: 拥塞控制为什么要有拥塞控制?动态调整的拥塞控制拥塞控制中,窗口大小具体的变化过程 TCP核心机制七: 延时应答TCP核心机制八: 捎带应答 TCP核心机制 前一篇文章 JavaEE: 深入探索TCP网络编程的奇妙世界(四) 书接上文~ TCP核心机制六: 拥…

数据结构:二叉树OJ题(基础版)

前言 更完两期二叉树的知识之后&#xff0c;来做几道oj题巩固一下基础 一、翻转二叉树 链接&#xff1a;leetcode链接 还是分治思想&#xff0c;将问题分解成左子树和右子树交换&#xff0c;遇到空树停止 采用递归算法做题 TreeNode* invertTree(TreeNode* root) {if(root …

2D目标检测常用loss

在2D目标检测任务中&#xff0c;常用的损失函数&#xff08;Loss&#xff09;主要用于优化以下三个关键方面&#xff1a; 类别分类&#xff08;Classification&#xff09;&#xff1a;用于区分检测到的对象属于哪一类。边界框回归&#xff08;Bounding Box Regression&#x…

Spring Boot蜗牛兼职网:全栈开发

第4章 系统设计 4.1 系统体系结构 蜗牛兼职网的结构图4-1所示&#xff1a; 图4-1 系统结构 登录系统结构图&#xff0c;如图4-2所示&#xff1a; 图4-2 登录结构图 蜗牛兼职网结构图&#xff0c;如图4-3所示。 图4-3 蜗牛兼职网结构图 4.2开发流程设计 系统流程的分析是通…

在Web开发中使用和风天气接口

介绍 和风天气是一个提供全球天气预报和气象数据的服务平台&#xff0c;支持多种语言&#xff0c;提供实时天气、未来天气预报、空气质量指数、生活建议等多种气象数据&#xff0c;可以广泛用于网页开发、移动应用和物联网设备等场景。 开发文档&#xff1a;文档 | 和风天气开…

intellij idea 控制台运行java出现中文乱码的解决方法

原因&#xff1a; 字符编码不一致&#xff1a; 当你在intellij idea使用了UTF-8编码&#xff0c;而在控制台使用了其他编码&#xff08;比如gbk&#xff09;&#xff0c;就可能导致乱码。 文件读写编码问题&#xff1a; 如果读取文件时使用的编码与文件实际编码不一致&#xf…

Chainlit集成LlamaIndex实现知识库高级检索(自动合并检索)

检索原理 自动合并检索 自动合并检索原理&#xff0c;和我的上一篇文章的检索方案&#xff1a; 将文本分割成512大小&#xff08;一般对应段落大小&#xff09;和128&#xff08;一般对句子大小不是严格的句子长度&#xff09;大小两种分别存储到索引库&#xff0c;再用llama_…

《深度学习》—— 卷积神经网络(CNN)的简单介绍和工作原理

文章目录 一、卷积神经网络的简单介绍二、工作原理(还未写完)1.输入层2.卷积层3.池化层4.全连接层5.输出层 一、卷积神经网络的简单介绍 基本概念 定义&#xff1a;卷积神经网络是一种深度学习模型&#xff0c;通常用于图像、视频、语音等信号数据的分类和识别任务。其核心思想…

如何在Markdown写文章上传到wordpress保证图片不丢失

如何在Markdown写文章上传到wordpress保证图片不丢失 写文日期,2023-11-16 引文 众所周知markdown是一款nb的笔记软件&#xff0c;本篇文章讲解如何在markdown编写文件后上传至wordpress论坛。并且保证图片不丢失&#xff08;将图片上传至云端而非本地方法&#xff09; 一&…

通信工程学习:什么是NFVI网络功能虚拟化基础设施层

NFVI&#xff1a;网络功能虚拟化基础设施层 NFVI&#xff08;Network Functions Virtualization Infrastructure&#xff09;即网络功能虚拟化基础设施层&#xff0c;是NFV&#xff08;Network Functions Virtualization&#xff0c;网络功能虚拟化&#xff09;架构中的一个重要…

精准农业中遥感技术应用(五)- 一站式遥感数据服务平台AIEarth

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案&#xff0c;帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、领域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&…

【LeetCode:116. 填充每个节点的下一个右侧节点指针 + BFS(层次遍历)】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

redis主从复制的理论和实战详细教程

0 前言 就是主从复制&#xff0c;master以写为主&#xff0c;slave以读为主&#xff0c;当master数据变化的时候&#xff0c;自动将新的数据异步同步到其他的slave数据库。也就是redis主从复制异步同步数据的&#xff0c;所以在主从架构中使用分布式锁时&#xff0c;可能会出现…

4--SpringBoot项目中分类管理

目录 新增分类 分类分页查询 启用禁用分类 根据类型查询 修改分类 本文介绍SpringBoot项目中的分类管理&#xff0c;操作类似员工管理模块&#xff0c;具体详解可见以下博客&#xff0c;此处给出各部分代码 2--SpringBoot项目中员工管理 详解&#xff08;一&#xff09;-C…