Web应用安全

XXE漏洞

XML基础

什么是XML?

  • 一种类似于HTML(超文本标记语言)的可扩展标记语言,可以用来标记数据、定义数据类型
  • XML语言没有预定义的标签,允许用户自定义标签和文档结构
  • XML被设计用来传输和存储数据

XML文档结构

  • XML声明
  • DTD文档类型定义(可选)
  • 文档元素

XML案例

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<girl age="18">
<hair>长头发</hair>
<eye>大眼睛</eye>
<face>可爱的脸庞</face>
<summary>可爱美丽的女孩</summary>
</girl>

XML的语法规则

  • XML文档必须有一个根元素
  • XML元素都必须有一个关闭标签
  • XML标签对大小敏感
  • XML元素必须被正确的嵌套
  • XML属性值必须加引导

DTD与DTD实体

DTD(Document Type Definition)

  • DTD(文档定义类型)的作用是定义XML文档的合法构建模块
  • DTD可以被成行的声明于XML文档中,也可以作为一个外部引用

DTD实体

  • 实体是用于定义引用普通文本或特殊字符的快捷方式的变量
  • 实体引用是对实体的引用
  • 实体可在内部或外部进行声明

内部实体声明

语法

1
<!ENTITY entity-name "entity-value">

实例

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE author[
<!ENTITY writer "Donald Duck">
<!ENTITY copywrite "Copywrite">
]>
<author>&write;&copywrite;</author>

外部实体声明

语法

1
<!ENTITY entity-name SYSTEM "URI/URL">

实例

1
2
3
4
5
6
7
DTD实例:

<!ENTITY writer SYSTEM "https://www.baidu.com">
<!ENTITY copywrite SYSTEM "https://www.sogou.com">

XML example:
<author>&write;&copywrite;</author>

XXE概念

什么是XXE?

  • 全称是”XML external entity injection”,即XML外部实体注入
  • 攻击者通过向服务器注入指定的XML实体内容,从而让服务器按照指定的配置进行执行
  • 服务端接收和解析来自用户端的XML数据,而没有做严格的安全控制,从而导致XML外部实体注入

基于pikachu靶场的XXE实例

该案例读取C:/Windows/win.ini

1
2
3
4
5
6
<?xml version="1.1" encoding="UTF-8"?>
<!DOCTYPE foo[
<!ELEMENT foo ANY>
<!ELEMENT xxe SYSTEM "file:///C:/Windows/win.ini">
]>
<foo>&xxe;</foo>

打开Pikachu中的xxe漏洞页面,将构造好的XML文件内容复制到输入框中,点击”提交”按钮

14.5.1

浏览器页面中显示win.ini文件内容

14.5.2

XXE实体注入攻击

除此之外,利用XXE注入,还可以实现如下攻击:

  • 执行系统命令
  • 探测内网端口
  • 攻击内网网站

XXE实体注入防御

  • 禁用外部实体
  • 过滤和验证用户提交的xml数据
  • 不允许xml中含有任何自己声明的dtd
  • 配置xml parser只能使用静态dtd,禁止外来引入

逻辑漏洞

逻辑漏洞概述

什么是逻辑漏洞?

  • 攻击者利用业务/功能上的设计缺陷,获取敏感信息或破坏业务的完整性

逻辑漏洞的特点

  • 与系统本身的业务功能相关,决定了逻辑漏洞的多样性
  • 很难通过有规则的脚本或工具扫描发现
  • 产生的流量是合法流量,一般的防御手段和设备无法阻止
  • 一般需要通过人工审计和手动测试发现

逻辑漏洞常见功能点

根据常见的业务功能,逻辑漏洞常常出现在以下功能点

  • 越权漏洞
  • 验证码漏洞
  • 支付漏洞
  • 密码修改/找回漏洞
  • 短信轰炸
  • 投票、积分、抽奖

越权漏洞

越权漏洞分类

  • 越权漏洞主要分为:水平越权和垂直越权

14.5.3

水平越权案例

水平越权中有两个用户,权限相同

用户名 密码
kobe 123456
lucy 123456

打开如图所示的页面,以普通用户的角色登录

14.5.4

登录后,点击查看个人信息,可以看到用户kobe的信息

14.5.5

修改地址栏的数据,将username=kobe,修改为lucy。即可看到lucy的信息。也就是说kobe可以看到lucy信息,即水平越权

14.5.6

水平越权代码分析

14.5.7

14.5.8

水平越权案例修复方案

14.5.9

支付漏洞

支付漏洞概述

  • 从技术方面看,支付漏洞是一种很简单的逻辑漏洞,通过抓包简单修改数据即可实现
  • 从危害性方面看,支付漏洞对企业来说危害很大,对用户来说同样危害也大。例如越权支付漏洞可以用他人账户进行消费
  • 从产生场景看,凡是涉及购买交易的都可能存在支付漏洞

支付漏洞成因

  • 开发人员缺乏必要的安全知识,在支付的关键步骤数据包中直接传递数据而这些数据在服务器没有校验,传递过程中也没有签名,导致攻击者通过代理软件随意篡改数据提交

支付流程

14.5.10

支付漏洞常见利用方式

支付金额 = 商品价格 * 商品数量 - 优惠券面额 * 优惠券数量 + 运费

  • 如果可以修改上面的某个关键数据,就有可能减少支付金额。每个值都可能有问题。负数、小数、无限大

大额商品ID换成小额商品ID

将支付状态的未支付修改为已支付

无限制试用

  • 例如:试用的参数为2,正常购买的参数为1。购买时,将购买参数改为2

支付漏洞攻击流程

14.5.11

支付漏洞挖掘

找到关键的数据包

  • 可能一个支付操作有三四个数据包,我们要对数据包进行挑选

分析数据包

  • 支付数据包中会包含很多的敏感数据(账号、金额、余额、优惠)要尝试对数据包中的各个参数进行分析

不按套路出牌

  • 多去想想开发者没有想到的地方

支付漏洞防御方法

  • 后端检查每一项值,包括支付状态。校验价格、数量参数,比如产品数量只能为正整数,并限制购买数量
  • 与第三方支付平台检查,实际支付的金额是否与订单金额一致
  • 支付参数进行 MD5 校验、数字签名及验证,这个可以有效的避免数据修改,重放攻击中的各种问题
  • 金额超过阈值,进行人工审核

密码找回漏洞

密码找回漏洞

概念

  • 很多网站都提供了密码找回/重置功能,密码找回/重置需要提供相应的凭证。如果用户可以在前端获取凭证,或通过猜测、爆破的方式获取凭证,就可以重置任意用户的密码

常见密码找回漏洞原因

  • 用户凭证暴力破解
  • 服务器响应数据包中包含凭证
  • 服务器响应页面中包含凭证
  • 可猜测的弱token凭证
  • 跳过凭证认证步骤

用户凭证暴力破解

当当网任意用户密码修改漏洞

漏洞复现

14.5.12

14.5.13

服务器响应数据包中包含凭证

天天网任意账户密码重置

漏洞复现

正常流程找回密码,填好邮箱和验证码,点击下一步,抓包

14.5.14

可以看到抓包返回数据中会有一个加密字符串,将其记录下来

14.5.15

然后会给邮箱发一个验证码,然后要求在页面填写验证码,填好之后会进入如下的设置新密码的页面

14.5.16

仔细观察发现,这里的加密验证字符串和之前返回数据中的那个字符串竟然是同一个。既然如此,那个邮箱验证码就可以直接绕过了

14.5.17

服务器响应页面中包含凭证

sohu邮箱任意用户密码重置

可猜测的弱token

奇虎360任意用户密码修改凭证

跳过凭证认证步骤

OPPO手机同步密码随意修改,短信通讯录随意查看