Web安全学院
Web安全学院
  • 首页
  • 译序
  • 学习路线
  • 前篇
    • Web应用程序安全测试
    • 动态应用程序安全测试(DAST)
    • 带外应用程序安全测试(OAST)
  • 服务器端主题
    • SQL注入
      • SQL注入
      • SQL注入UNION攻击
      • 在SQL注入攻击中检索数据库
      • SQL盲注
      • SQL注入速查表
    • 认证
      • 认证漏洞
      • 基于密码登录中的漏洞
      • 多因素认证中的漏洞
      • 其他认证机制中的漏洞
      • 如何保护你的认证机制
    • 目录遍历
      • 目录遍历
    • 命令注入
      • OS命令注入
    • 业务逻辑漏洞
      • 业务逻辑漏洞
      • 业务逻辑漏洞示例
    • 信息泄露
      • 信息泄露漏洞
      • 如何发现并利用信息泄露漏洞
    • 访问控制
      • 访问控制漏洞与权限提升
      • 不安全的直接对象引用(IDOR)
      • 访问控制安全模型
    • 文件上传漏洞
      • 文件上传漏洞
    • 条件竞争
      • 条件竞争
    • 服务器端请求伪造(SSRF)
      • 服务器端请求伪造(SSRF)
      • 盲SSRF漏洞
    • XXE注入
      • XML外部实体(XXE)注入
      • XML实体
      • 发现并利用盲XXE漏洞
  • 客户端主题
    • 跨站脚本(XSS)
      • 跨站脚本
      • 反射型XSS
      • 存储型XSS
      • 基于DOM的XSS
      • XSS上下文
        • 跨站脚本上下文
        • 客户端模版注入
      • 利用跨站脚本漏洞
      • 内容安全策略
      • 悬空标记注入
      • 如何防范XSS漏洞
      • 跨站脚本(XSS)速查表
    • 跨站请求伪造(CSRF)
      • 跨站请求伪造(CSRF)
      • XSS与CSRF
      • 绕过CSRF令牌验证
      • 绕过SameSite Cookie限制
      • 绕过基于Referer的CSRF防御
      • 如何防范CSRF漏洞
    • 跨域资源共享(CORS)
      • 跨域资源共享(CORS)
      • 同源策略(SOP)
      • CORS和Access-Control-Allow-Origin响应标头
    • 点击劫持
      • 点击劫持(UI伪装)
    • 基于DOM的漏洞
      • 基于DOM的漏洞
      • 控制Web消息源
      • 基于DOM的开放重定向
      • 基于DOM的Cookie操纵
      • 基于DOM的JavaScript注入
      • 基于DOM的document-domain操纵
      • 基于DOM的WebSocket URL投毒
      • 基于DOM的链接操纵
      • Web消息操纵
      • 基于DOM的Ajax请求标头操纵
      • 基于DOM的本地文件路径操纵
      • 基于DOM的客户端SQL注入
      • 基于DOM的HTML5 Storage操纵
      • 基于DOM的客户端XPath注入
      • 基于DOM的客户端JSON注入
      • DOM-data操纵
      • 基于DOM的拒绝服务
      • DOM破坏
    • WebSocket
      • 测试WebSocket安全漏洞
      • 什么是WebSocket?
      • 跨站WebSocket劫持
  • 进阶主题
    • 不安全的反序列化
      • 不安全的反序列化
      • 利用不安全的反序列化漏洞
    • 测试GraphQL API
      • 测试GraphQL API
      • 什么是GraphQL?
    • 服务器端模板注入
      • 服务器端模板注入
      • 利用服务器端模板注入漏洞
    • Web缓存投毒
      • Web缓存投毒
      • 缓存设计缺陷的利用
      • 缓存实现缺陷的利用
    • HTTP Host标头攻击
      • HTTP Host标头攻击
      • 如何识别和利用HTTP Host头的漏洞
      • 密码重置投毒
    • HTTP请求走私
      • HTTP请求走私
      • 查找HTTP请求走私漏洞
      • 利用HTTP请求走私漏洞
      • 高级请求走私
        • 高级请求走私
        • HTTP/2降级
        • 响应队列投毒
        • HTTP/2专属载体
        • HTTP请求隧道
      • 浏览器驱动的请求伪造
        • 浏览器驱动的请求伪造
        • CL.0请求走私
        • 客户端异步攻击
        • 基于暂停的异步攻击
    • OAuth认证
      • OAuth 2.0认证漏洞
      • OAuth授权类型
      • OpenID Connect
      • 如何防范OAuth认证漏洞
    • JWT攻击
      • JWT攻击
      • 在Burp Suite中使用JWT
      • 算法混淆攻击
    • 原型污染
      • 什么是原型污染?
      • JavaScript原型和继承
      • 客户端
        • 客户端原型污染漏洞
        • 通过浏览器API进行原型污染
      • 服务器端
        • 服务器端原型污染
      • 预防原型污染漏洞
    • 基本技能
      • 基本技能
      • 使用编码混淆攻击
      • 在手动测试中使用Burp Scanner
Powered by GitBook
On this page
  • 什么是DOM?
  • 污染源漏洞
  • 什么是污染流?
  • 共同来源
  • 哪些接收器可能导致基于DOM的漏洞?
  • 如何防止基于DOM的污染流漏洞
  • DOM破坏
  1. 客户端主题

基于DOM的漏洞

在本节中,我们将描述DOM是什么,解释DOM数据的不安全处理如何会引入漏洞,并建议如何防止网站上基于DOM的漏洞。

什么是DOM?

文档对象模型(DOM)是web浏览器对页面上元素的层次表示。 网站可以使用JavaScript来操纵DOM的节点和对象及其属性。 DOM操作本身不是问题。 实际上,它是现代网站运作不可或缺的一部分。 但是,不安全地处理数据的JavaScript会引发各种攻击。 当网站包含JavaScript时,就会出现基于DOM的漏洞,该JavaScript获得攻击者可控制的值(称为源),并将其传递给危险的功能(称为接收器)。

污染源漏洞

许多基于DOM的漏洞可以追溯到客户端代码操纵攻击者可控制数据的方式问题。

什么是污染流?

要利用或减轻这些漏洞,您必须首先熟悉源和接收器之间的污染流的基本知识。

源

源是一个JavaScript属性,它接受可能受到攻击者控制的数据。 来源的一个示例是location.search属性,因为它从查询字符串中读取输入,这对于攻击者而言比较容易控制。 最终,攻击者可以控制的任何属性都是潜在的来源。 这包括引用URL(由document.referrer字符串公开),用户的cookie(由document.cookie字符串公开)和web消息。

接收器

接收器是潜在危险的JavaScript函数或DOM对象,如果将攻击者控制的数据传递给它,则可能导致不良后果。 例如,eval()函数是一个接收器,因为它处理作为JavaScript传递给它的参数。 HTML接收器的一个示例是document.body.innerHTML,因为它可能允许攻击者注入恶意HTML并执行任意JavaScript。

从根本上讲,当网站将数据从源传递到接收器时,基于DOM的漏洞就会出现,该接收器随后会在客户端会话的上下文中以不安全的方式处理数据。

最常见的来源是URL,通常可通过location对象访问该URL。 攻击者可以构建一个链接,以将受害者发送到易受攻击的页面,并在查询字符串和URL的片段部分中添加有效负载。 考虑以下代码:

goto = location.hash.slice(1)if(goto.startsWith('https:')) { location = goto;}

这很容易受到基于DOM的开放式重定向的影响,因为location.hash源是以不安全的方式处理的。 如果URL包含以https:开头的哈希片段,则此代码将提取location.hash属性的值并将其设置为窗口的location属性。 攻击者可以通过构造以下URL来利用此漏洞:

https://www.innocent-website.com/example#https://www.evil-user.net

当受害者访问此URL时,JavaScript会将location属性的值设置为https://www.evil-user.net,这将自动将受害者重定向到恶意站点。 例如,可以很容易地利用此行为来构造网络钓鱼攻击。

共同来源

以下是可用于开发各种污染流漏洞的典型来源:

document.URLdocument.documentURIdocument.URLUnencodeddocument.baseURI位置document.cookiedocument.referrerwindow.namehistory.pushStatehistory.replaceStatelocalStoragesessionStorageIndexedDB (mozIndexedDB, webkitIndexedDB, msIndexedDB)数据库

哪些接收器可能导致基于DOM的漏洞?

以下列表提供了常见的基于DOM的漏洞的快速概述,以及可能导致每个漏洞的接收器示例。 有关相关接收器的更全面列表,请通过单击以下链接来参考特定于漏洞的页面。

基于DOM的漏洞
接收器示例

DOM XSS LABS

document.write()

开放重定向 LABS

window.location

Cookie操作 LABS

document.cookie

JavaScript注入

eval()

文档范围操作

document.domain

WebSocket-URL中毒

WebSocket()

链接操纵

someElement.src

网络消息操纵

postMessage()

Ajax请求标头操作

setRequestHeader()

本地文件路径操作

FileReader.readAsText()

客户端SQL注入

ExecuteSql()

HTML5存储操作

sessionStorage.setItem()

客户端XPath注入

document.evaluate()

客户端JSON注入

JSON.parse()

DOM数据操作

someElement.setAttribute()

拒绝服务

RegExp()

如何防止基于DOM的污染流漏洞

您不能采取任何行动来完全消除基于DOM的攻击的威胁。 但是,一般而言,避免基于DOM的漏洞的最有效方法是避免允许来自任何不受信任源的数据动态更改传输到任何接收器的值。

如果应用程序所需的功能意味着这种行为是不可避免的,则必须在客户端代码内实施防御。 在许多情况下,可以在白名单的基础上验证相关数据,仅允许已知安全的内容。 在其他情况下,有必要对数据进行清理或编码。 这可能是一项复杂的任务,并且取决于要插入数据的上下文,它可能会按照适当的顺序包含JavaScript转义,HTML编码和URL编码的组合。

有关可以采取的防止特定漏洞的措施,请参阅上表链接的相应漏洞页面。

DOM破坏

DOM破坏是一种高级技术,您可以将HTML注入页面中以操纵DOM并最终更改网站上JavaScript的行为。 DOM破坏的最常见形式是使用锚元素覆盖全局变量,然后该全局变量将被应用程序以不安全的方式使用,例如生成动态脚本URL。

Previous点击劫持(UI伪装)Next基于DOM的漏洞

Last updated 2 years ago