第四次作业
任务一:反射型、存储型、DOM型XSS特点和区别
概念:
- 存储型 XSS:存储型XSS又被称为持久性XSS,存储型XSS是最危险的一种跨站脚本漏洞,当攻击者提交一段 XSS代码后,被服务端接收并存储,当攻击者或用户再次访问某个页面时,这段XSS代码被程序读出来响应给浏览器,造成XSS跨站攻击,这便是存储型XSS。
- 反射型 XSS:反射型XSS也被称为非持久性XSS,当用户访问一个带有XSS代码的HTML请求时,服务器端接收数据后处理,然后把带有XSS的数据发送到浏览器,浏览器解析这段带有XSS代码的数据后,就造成XSS漏洞,这个过程就像一次反射,所以叫反射型XSS。
- DOM 型 XSS:不经过后端,DOM-based XSS漏洞是基于文档对象模Document object Model,DOM)的一种漏洞,dom-xss是通过url传入参数去控制触发的。
注意:大体上只分为存储型XSS和反射型XSS,反射型XSS包括D0M型XSS
联系和区别:
- 反射型XSS(Reflected XSS):特点:当用户浏览受感染网站时,攻击者构造的恶意脚本被反射回用户。通常是通过链接发送,用户点击链接后恶意内容即被执行。例子:在搜索引擎结果中输入恶意脚本。区别:不要求攻击者有网络服务器的控制,仅利用现有系统漏洞执行脚本。
- 存储型XSS(Persistent XSS):特点:攻击者的恶意脚本被存储在目标服务器上,如数据库、消息论坛、访客留言板等。例子:用户可以在留言板上发布包含恶意脚本的评论,其他访问者浏览时会被感染。区别:需要攻击者控制目标服务器,一旦上传就可能在多个用户间传播。
- DOM型XSS(Document Object Model XSS):特点:攻击者利用网站代码中的DOM解析漏洞执行恶意脚本。例子:恶意脚本在没有服务器交互的情况下直接在客户端执行。区别:不需要服务器参与内容存储,只依赖客户端浏览器的操作。
任务二:上网搜索一份XSS 的fuzz字典或字典生成工具
XSS的fuzz字典
- TheKingOfDuck/fuzzDicts:
easyXssPayload/easyXssPayload.txt at master · TheKingOfDuck/easyXssPayload · GitHub
工具:
- TheKingOfDuck/fuzzDicts:
GitHub - TheKingOfDuck/fuzzDicts: Web Pentesting Fuzz 字典,一个就够了。
- fuzzdb-project/fuzzdb:
GitHub - fuzzdb-project/fuzzdb: Dictionary of attack patterns and primitives for black-box application fault injection and resource discovery.
任务三:靶场通关
网址:https://xss.tesla-space.com/
LEVEL1
get型XSS
直接在URL上修改payload <script>alert(1)</script>
LEVEL2
POST型XSS
利用 <script>alert(1)</script>
查看页面源代码的解析结果,发现插入的script标签被当作input的输入字符串。
于是可以将input标签闭合再插入script标签作XSS攻击
"><script>alert(1)</script>
LEVEL3
插入script标签测试,发现被被当作了input字符串了
尝试level2的语句,发现value后的"与插入的"不一样
尝试单引号闭合,发现被实体化 <
尝试利用input能支持的html事件
input属性支持以下HTML事件:
- onchange - 当用户改变输入字段的内容时触发
- oninput - 当用户在输入字段中输入内容时触发
- onfocus - 当输入字段获得焦点时触发
- onblur - 当输入字段失去焦点时触发
- onkeypress - 当用户按下键盘按键时触发(在输入字段中)
- onkeydown - 当用户按下键盘按键并保持按下状态时触发(在输入字段中)
- onkeyup - 当用户释放键盘按键时触发(在输入字段中)
成功,这里我使用的oninput事件:' oninput = javascript:alert(1) '
LEVEL4
测试,查看源代码
尝试闭合input标签,插入script标签
同LEVEL4思路一样,需要触发事件才能XSS攻击,这里我使用a标签的html事件
- onclick:当鼠标点击链接时触发
- onmouseover:当鼠标移到链接上时触发
- onmouseout:当鼠标离开链接时触发
- onfocus:当链接获得焦点时触发
- onblur:当链接失去焦点时触发
"><a href="" onclick="alert('xss')">
LEVEL5
测试,查看源代码
看着好像和前两关一样,尝试使用input的事件
" oninput = javascript:alert(1) "
在源码中发现on被替换为了o_n
尝试大小写绕过,发现on和ON应该容易识别为小写
前面的事件中都是on事件触发的,而超链接标签本身是可被点击的,则直接构造超链接
"> <a href=javascript:alert()>1</a>
成功!
LEVEL6
测试
与前面的思路一样,尝试input的html事件
" oninput = javascript:alert(1) "
发现on被识别为o_n
尝试大小写绕过
" ONinput = javascript:alert(1) "
成功!
任务四:浏览器解析机制
- HTML解析:浏览器在下载HTML文档后,开始解析文档。解析器将HTML文档转换为一个文档对象模型(DOM)树,该树结构表示了HTML文档的内容和结构。解析过程中会处理标签、属性和文本节点,确保生成正确的DOM结构。同时,解析器会根据遇到的元素(如
<script>
和<link>
)来决定是否需要阻塞渲染,是否需要并行下载外部资源。 - URL解析:浏览器在处理HTTP请求时,会解析URL以获取相应的资源URL包含多个部分,如协议(http/https)、主机、路径、查询参数(如%61%6c%65%72%74%28%32%29)等。解析过程中,浏览器会将其分解为这些成分,以构建请求。此外,URL解析还确保了在相对路径和绝对路径之间进行正确的处理。
- JavaScript解析:JavaScript文件被下载后,浏览器会将其解析为抽象语法树(AST)。它会对标识符和字符串中的 Unicode 转义序列(如
\u0061\u006c\u0065\u0072\u0074(10);
)进行解码。 - 解析流: 当浏览器从⽹络堆栈中获得⼀段内容后,触发HTML解析器来对这篇⽂档进⾏词法解析。在这⼀步中字符引⽤被解码。在词法解析完成后,DOM树就被创建好了,JavaScript解析器会介⼊来对内联脚本进⾏解析。在这⼀步中Unicode转义序列和Hex转义序列被解码。同时,如果浏览器遇到需要URL的上下⽂,URL解析器也会介⼊来解码URL内容。在这⼀步中URL解码操作被完成。由于URL位置不同,URL解析器可能会在JavaScript解析器之前或之后进⾏解析。
解释《漏洞利用之XSS注入》中15条中,至少5条执行成功或不成功的原因
- 例2 :
<a href="javascript:%61%6c%65%72%74%28%32%29">
- 执行
- herf中含有html编码,先经过html解码得到:
<a href="javascript:%61%6c%65%72%74%28%32%29">
- href中为URL,URL模块可识别为 javascript 协议,进⾏URL解码,得到 :
<a href="javascript:alert(2)">
- 例4 :
<div><img src=x onerror=alert(4)></div>
- 不执行
- 里面包含了HTML编码,html编码就是在页面中显示这些内容,而不会创建一个img元素,即<div>中的内容被当作字符串显示在页面中。
- 例7 :
<button onclick="confirm('7');">Button</button>
- 执行
- onclick内为标签的属性值,会被html解码
- 例11 :
<script>\u0061\u006c\u0065\u0072\u0074(\u0031\u0032)</script>
- 不执行
- 括号内额: \u0031\u0032会被解析为字符串,但是没有引号,会导致JS执行失败
- 例15 :
<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(15)"></a>
- 执行
- 根据解析流顺序,href中先通过HTML解码得到结果:
<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(15)"></a>
- 在href中由URL模块处理,解码得到
javascript:\u0061\u006c\u0065\u0072\u0074(15)
- 识别JS协议,然后由JS模块处理,解码得到
javascript:alert(15)