目录
到XSS挑战靶场打靶(https://xss.tesla-space.com/)
总结反射型、存储型、DOM型XSS特点和区别
1. 反射型 XSS(Reflected XSS)
特点:
- 注入方式:恶意脚本通过用户输入(如URL参数、表单提交等)被发送到服务器,服务器响应时直接将这些未过滤的输入返回给用户。
- 执行方式:脚本在响应时被执行,通常是用户点击恶意链接或提交表单后,恶意代码立即被反射到用户的浏览器并执行。
- 持久性:非持久性,不会存储在服务器端。
- 常见场景:搜索框、错误消息、URL 参数。
- 攻击载体:通常通过社会工程学手段,如诱导用户点击恶意链接。
区别:
- 反射型 XSS 是一次性的,不会在服务器端持久保存,用户访问特定恶意链接时才会被攻击。
2. 存储型 XSS(Stored XSS)
特点:
- 注入方式:恶意脚本被存储在目标服务器的数据库中(如评论区、论坛帖子、用户简介等)。
- 执行方式:每次用户访问包含恶意脚本的页面时,脚本都会自动加载并执行。
- 持久性:持久性攻击,脚本存储在服务器端,影响所有访问该数据的用户。
- 常见场景:社交媒体、留言板、在线聊天、博客评论等允许用户输入和展示内容的地方。
- 攻击载体:脚本被存储后,无需用户特别交互即可执行,影响范围较广。
区别:
- 存储型 XSS 攻击持续性更强,因为脚本被存储在服务器上,任何访问相关数据的用户都可能受影响。
3. DOM型 XSS(DOM-based XSS)
特点:
- 注入方式:恶意脚本不通过服务器返回,而是直接在客户端的 JavaScript 执行上下文中被操纵(如
document.location
、document.write
等)。 - 执行方式:脚本通过 DOM 操作在客户端动态插入和执行。
- 持久性:非持久性,完全在客户端执行,攻击代码未经过服务器的处理。
- 常见场景:客户端代码未正确转义或过滤用户输入,导致脚本通过 DOM 操作被插入执行。
- 攻击载体:依赖于客户端环境,攻击通常通过浏览器行为被触发。
区别:
- DOM 型 XSS 完全在客户端发生,不涉及服务器对恶意脚本的存储或反射,攻击方式依赖于客户端 DOM 操作的漏洞。
总结区别:
- 反射型 XSS 依赖于即时反射回来的脚本。
- 存储型 XSS 依赖于服务器上存储的恶意脚本。
- DOM 型 XSS 完全发生在客户端,通过客户端的 JavaScript 逻辑直接执行。
上网搜索一份XSS 的fuzz字典或字典生成工具
这是github上的一份XSSpayload字典。并且每一个可以注入成功之后都会alert不同的值。特别方便。
fuzzDicts/easyXssPayload/easyXssPayload.txt at master · TheKingOfDuck/fuzzDicts (github.com)
下面是字典截图
到XSS挑战靶场打靶(https://xss.tesla-space.com/)
level 1
分析
url参数和界面同时出现相同字符串,考虑到xss
解决:简单xss直接注入<script>alert(1)</script>
level 2
分析
url参数和界面同时出现相同字符串,考虑到xss
直接注入没有反应
但是界面出现两个地方出现了对应字符串
- 注入点1是<h2>,不能注入
- <input>可以直接注入
解决:
很简单,闭合前面的双引号
和>
就行了。
闭合之后这一段为(标红为payload
)
<input name="keyword" value=""><script>alert(1)</script>">
level 3
分析
和第二题类似也是
尝试注入之后发现有问题,就是我的双引号和>
粘贴到vsc
之后变成了html
编码
所以思想就是尽量不用>
和"
,或者进行编码。这里可以不用>
但是"
必须要闭合。
但是 ---- 双引号 "
和 单引号 '
在php是可以混合使用的,所以可以用 '
进行闭合。
解决
构造下面payload
前面对value="
闭合 ,后面对 "
进行闭合
<input name="keyword" value="' onmouseover=alert(9) '">
注:移动鼠标到元素上触发
level 4
分析
本来还在分析,以为会被过滤什么的。因为和第三题类似。
但是没想到双引号直接就成功了。
解决:
payload
:" onmouseover=alert(9) "
但是好像单引号'
会被编码,和第三题相反。
level 5
分析
简单测试一下,发现双引号可以闭合,但是我的o被加了下划线。
思路就是绕开检测。
- 通过编码绕过,尝试无果。
-
- url编码,没有用,因为
url
解码之后得到o
再给到js
还是处理了。 - html编码,包含
&#
等字符,根本无法正常运行。 - unicode编码,这个
o
都不是js内部的脚本,而是html标签的属性,更不能解码
- url编码,没有用,因为
- 大小写绕过,无用,会被转为小写。
- 使用不包含o的payload
-
- 使用
"><script>alert(1)</script>
,<script>
中的r
被加了下划线。
- 使用
解决
用ifram
标签
payload:"><iframe src=javascript:alert(197)>
level 6
分析
我的src
的r
竟然被加了下划线,
action
也不行href
也不行。
思路就是绕开
解决
大小写绕过
payload:"><a hRef=javascript:alert(200)>click
总结浏览器解析机制
浏览器解析机制总结
浏览器在解析网页时涉及多个解析器,包括 HTML、URL、JavaScript 解析器。每个解析器按照特定的状态机模型工作,将输入流中的字符解析为相应的输出。以下是各个解析器的简要说明:
- HTML 解析:处理 HTML 文档,将内容解析为 DOM 树。它会处理字符实体(如
<
转换为<
),但不会解码特殊字符,如<script>
内的字符。 - URL 解析:用于解析 URL,涉及识别协议、域名、路径等。如果 URL 中的协议部分被编码(如
%6a%61%76%61%73%63%72%69%70%74:
),解析器可能无法正确识别和执行。 - JavaScript 解析:解析和执行 JavaScript 代码。它会对标识符和字符串中的 Unicode 转义序列(如
\u0061\u006c\u0065\u0072\u0074
)进行解码。 - 解析流:多个解析器协同工作,解析顺序通常为 HTML、URL、JavaScript。如果某一部分需要多个解析器(如
href
中的JavaScript:
协议),则解析顺序会依次进行。
成功与不成功的原因分析(5条)
1. 例1
<a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29"></a>
-
- 不执行:
- 先进行
html
解码,但是未进行html
编码,所以不解码。 - 然后进行
url
解码,但是不对协议解码,所以无法识别协议,所以无法执行。
2. 例4
<div><img src=x onerror=alert(4)></div>
-
- 不执行:
- html解码不对
"("
、")"
进行解码
3. 例8
<button onclick="confirm('8\u0027);">Button</button>
-
- 不执行:
- 当
' "
作为边界符时候,javascript解码不对'
、"
、进行解码。
4. 例12
<script>\u0061\u006c\u0065\u0072\u0074(\u0031\u0032)</script>
-
- 不执行:
- 全都可以解码,确实没错。
- 但是解码之后变成了
alert(12)
,12
是字符串但是外面没有引号,语法错误
5. 例5
<textarea><script>alert(5)</script></textarea>
-
- 不执行:
<textarea> </textarea>
标签内只能是字符串,都不会执行。