某不知名博客 某不知名博客
首页
  • 《vulcat文档》
  • Web安全

    • 《BurpSuite及官方实验室》
    • 《OSWE学习历程》
  • 云原生安全

    • 《Docker命令大全》
    • 《CKS考试学习指南》
    • 《旧-Kubernetes教程》
漏洞库
  • 《渗透工具大全》
  • 《云安全》
事件库
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carsaid

安全界的小学生
首页
  • 《vulcat文档》
  • Web安全

    • 《BurpSuite及官方实验室》
    • 《OSWE学习历程》
  • 云原生安全

    • 《Docker命令大全》
    • 《CKS考试学习指南》
    • 《旧-Kubernetes教程》
漏洞库
  • 《渗透工具大全》
  • 《云安全》
事件库
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 前言

  • 服务器端主题(翻译)

  • 客户端主题(翻译)

  • 高级主题(翻译)

  • 扩展阅读(翻译)

  • 个人学习笔记

  • 实验室做题记录

    • 实验室做题记录
    • 服务器端

    • 客户端

      • 跨站脚本(XSS)

        • 学徒-反射型XSS-未编码的HTML上下文
        • 学徒-存储型XSS-未编码的HTML上下文
        • 学徒-DOM型XSS-document.write接收器-location.search源
        • 从业者-DOM型XSS-document.write接收器-location.search源-位于select元素内
        • 学徒-DOM型XSS-innerHTML接收器-location.search源
        • 学徒-DOM型XSS-jQuery锚点href属性接收器-location.search源
        • 学徒-DOM型XSS-jQuery选择接收器-hashchange事件
        • 从业者-DOM型XSS-AngularJS表达式-尖括号与双引号HTML编码
        • 从业者-反射型DOM XSS
        • 从业者-存储型DOM XSS
          • 题目
          • 实操
        • 从业者-XSS上下文-HTML标签之间-反射型XSS-大多数标签和属性被阻止
        • 从业者-XSS上下文-HTML标签之间-反射型XSS-除了自定义标签外的所有标签都被阻止
        • 专家-XSS上下文-HTML标签之间-反射型XSS-事件处理程序和href属性被阻止
        • 从业者-XSS上下文-HTML标签之间-反射型XSS-允许使用SVG标签
        • 学徒-XSS上下文-HTML属性中-反射型XSS-尖括号HTML编码
        • 从业者-XSS上下文-HTML属性中-存储型XSS-锚点href属性与双引号HTML编码
        • 从业者-XSS上下文-HTML属性中-反射型XSS-link规范标签
        • 从业者-XSS上下文-JavaScript字符串中-反射型XSS-单引号和反斜杠转义
        • 学徒-XSS上下文-JavaScript字符串中-反射型XSS-尖括号HTML编码
        • 从业者-XSS上下文-JavaScript字符串中-反射型XSS-尖括号双引号HTML编码和单引号转义
        • 专家-XSS上下文-JavaScript URL中-反射型XSS-某些字符被阻止
        • 从业者-XSS上下文-利用HTML编码-onclick属性中的存储型XSS-尖括号双引号HTML编码-以及单引号反斜杠转义
        • 从业者-XSS上下文-模板字面量-反射型XSS-尖括号单引号双引号反斜杠和反引号Unicode转义
        • 从业者-利用跨站脚本-窃取cookie
        • 从业者-利用跨站脚本-捕获密码
        • 从业者-利用跨站脚本-执行CSRF
        • 专家-内容安全策略-反射型XSS-非常严格的CSP保护-悬挂标记攻击
        • 专家-内容安全策略-反射型XSS-绕过CSP保护
        • 专家-客户端模板注入-反射型XSS-无字符串的AngularJS沙箱逃逸
        • 专家-客户端模板注入-反射型XSS-AngularJS沙箱逃逸与CSP的碰撞
      • 跨站请求伪造(CSRF)

      • 跨域资源共享(CORS)

      • 点击劫持

      • 基于DOM的漏洞

      • WebSockets

    • 高级主题

  • BurpSuite及官方实验室
  • 实验室做题记录
  • 客户端
  • 跨站脚本(XSS)
carsaid
2023-09-08
目录

从业者-存储型DOM XSS

# 实验室:存储型DOM XSS

# 题目

此实验室在 博客评论功能 中包含一个存储型的 DOM 漏洞。若要解决实验室问题,请利用此漏洞调用alert()函数。

实验室-从业者

存储型DOM XSS >>

- name: 实验室-从业者
  desc: 存储型DOM XSS >>
  avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
  link: https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-dom-xss-stored
  bgColor: '#001350'
  textColor: '#4cc1ff'
1
2
3
4
5
6

# 实操

点击 “ACCESS THE LAB” 进入实验室。

Not Found Image

点击任意文章下方的 “View post” 进入详情页。

Not Found Image

在文章详情中存在一处 JavaScript,此处定义了一个escapeHTML函数,该函数对尖括号<>进行了 HTML 实体编码。

function escapeHTML(html) {
    return html.replace('<', '&lt;').replace('>', '&gt;');
}
1
2
3
Not Found Image

此外还存在三处innerHTML。

第一处,接收评论作者名称,用户输入可控。

let newInnerHtml = firstPElement.innerHTML + escapeHTML(comment.author)
1
Not Found Image

第二处,获取当前时间,用户不可控。

let newInnerHtml = firstPElement.innerHTML + " | " + dateStr
1
Not Found Image

第三处,获取评论内容,用户输入可控。

commentBodyPElement.innerHTML = escapeHTML(comment.body)
1
Not Found Image

尝试发布一个评论,用户名称 和 评论内容都位于标签之外,无法在现有的标签内注入载荷。

Not Found Image

尝试注入经典的攻击载荷。

Not Found Image

提交之后,点击 “Back to blog” 返回刚刚的博客文章。

Not Found Image

正如前面看到的escapeHTML函数,尖括号都被过滤了。

Not Found Image

捕获评论的请求数据包,一共有四个数据包。

第一个请求,提交表单。

Not Found Image

第二个请求,跳转至 “提交成功” 页面,可以点击返回按钮回到刚刚的博客。

Not Found Image

第三个请求,调用函数loadComments加载评论。

Not Found Image

第四个请求,获取评论内容并返回。

Not Found Image

修改载荷,尝试闭合响应中的 JSON 数据。

Not Found Image

失败,双引号被转义。

Not Found Image

尝试提交自己的反斜杠,同样被转义,这次应用程序没有再犯错。

Not Found Image

在提交经典的script载荷时,发现结束标签会离奇消失,为什么?

Not Found Image

尝试提交多个script标签。

Not Found Image

查看提交结果,发现只有第一个<script>的尖括号被编码了,而且由于第一个</script>是结束标签,起始标签被编码后 无法与其配对,所以会消失。

而后面两个script标签的尖括号未被编码,说明应用程序只进行了一次编码。

Not Found Image

还记得刚刚的escapeHTML函数吗?

function escapeHTML(html) {
    return html.replace('<', '&lt;').replace('>', '&gt;');
}
1
2
3

在某篇文章 (opens new window)中提到,replace只能替换匹配到的第一个字符:

Not Found Image

那就好办了,在原有的载荷前面添加一个额外的标签,先让其把replace的第一次替换给消耗掉,后面的标签就能够正常解析。

Not Found Image

提交载荷之后查看结果,前面的标签消耗掉第一次替换,后面的标签虽然没有被编码,但 alert 函数依然没有被调用,为什么?

Not Found Image

在前面的理论知识中提到:innerHTML接收器不接受任何现代浏览器上的script元素,也不会触发svg onload事件。这意味着你需要使用其他替代元素,如img或iframe。

懂了吧?

Not Found Image

前面的消耗性标签不变,将后面的script载荷更换为img载荷。

<script><img src=1 onerror=alert(5)>
1
Not Found Image

提交之后,回到博客页面,可以看到 alert 函数被成功调用了。

Not Found Image

实验完成。

Not Found Image
编辑 (opens new window)
从业者-反射型DOM XSS
从业者-XSS上下文-HTML标签之间-反射型XSS-大多数标签和属性被阻止

← 从业者-反射型DOM XSS 从业者-XSS上下文-HTML标签之间-反射型XSS-大多数标签和属性被阻止→

最近更新
01
API测试笔记
04-30
02
msfvenom
03-29
03
Metasploit
03-29
更多文章>
Theme by Vdoing | Copyright © 2023-2024 Carsaid | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式