目录
(三)XSS挑战靶场(https://xss.tesla-space.com/)
2.《漏洞利用之XSS注入》中15条中,一些执行成功或不成功的原因。
一、要求
1.总结反射型、存储型、DOM型XSS特点和区别
2.上网搜索一份XSS 的fuzz字典或字典生成工具(可选)
3.到XSS挑战靶场打靶,要求通过5关以上,通关越多,加分越多。(https://xss.tesla-space.com/)
4.总结浏览器解析机制,若不能理解,解释《漏洞利用之XSS注入》中15条中,至少5条执行成功或不成功的原因。(可选)
二、内容与步骤记录
(一)反射型、存储型、DOM型XSS特点和区别
跨站脚本攻击(XSS, Cross-Site Scripting)是一种网络安全漏洞,攻击者通过在网页中注入恶意脚本来执行未经授权的操作。这种攻击利用了Web应用程序对用户输入的处理不当,使得攻击者能够在用户浏览器中执行恶意代码。
1.反射型XSS:
(1)特点:
- 恶意脚本通过HTTP请求的参数传递(如URL参数、表单数据)并立即在响应中反射出来。
- 服务器不会存储恶意脚本,而是将其直接反射回响应中。
- 通常需要用户进行某种交互(如点击链接)来触发攻击。
- 反射型XSS通常用于钓鱼攻击或窃取用户的会话数据。
(2)区别:
数据流动:数据从客户端到服务器,再反射到客户端。
持久性:非持久型,不存储在服务器端。
2.存储型XSS:
(1)特点:
- 恶意脚本存储在服务器的数据库或其他持久存储中(如留言板、评论区)。
- 当其他用户访问包含恶意脚本的页面时,脚本会自动执行。
- 通常更加危险,因为攻击代码可以影响所有访问该页面的用户。
- 攻击者只需一次注入,便可持续对用户产生影响。
(2)区别:
数据流动:数据从客户端到服务器,存储在服务器上,之后再发送给其他客户端。
持久性:持久型,恶意脚本被存储在服务器端。
3.DOM型XSS:
(1)特点:
- 直接在浏览器端的JavaScript代码中操作DOM对象,从而产生安全漏洞。
- 恶意代码不通过服务器返回,而是直接在客户端解析和执行。
- 通常发生在客户端脚本不安全地处理数据(如document.location、document.cookie等)时。
- 攻击者通过操控DOM环境改变页面内容或行为,可能影响浏览器的安全性。
(2)区别:
数据流动: 数据在客户端内流动,不通过服务器进行处理。
持久性: 非持久型,完全依赖于客户端环境。
(二)XSS 的fuzz字典或字典生成工具
XSS fuzz字典是一组精心设计的攻击载荷,旨在触发潜在的XSS漏洞。这些字典通常包含各种常见和罕见的XSS攻击字符串,可以涵盖不同的浏览器和Web应用程序的行为。字典中的载荷可能包括:
基本的脚本标签: <script>alert(1)</script>
HTML标签: <img src=x οnerrοr=alert(1)>
事件处理程序: <body οnlοad=alert(1)>
混淆和绕过技巧: <scr<script>ipt>alert(1)</scr<script>ipt>
数据URI和其他协议: <iframe src="javascript:alert(1)">
常用的XSS Fuzz字典资源
(1)PayloadsAllTheThings:一个非常全面的安全测试资源,包含了各种XSS载荷,以及如何测试和利用这些载荷的说明。网址:https://github.com/swisskyrepo/PayloadsAllTheThings
(2)SecLists:是一个广泛使用的安全字典集合,包括XSS、SQL注入等字典。网址:https://github.com/danielmiessler/SecLists
(三)XSS挑战靶场(https://xss.tesla-space.com/)
第一关(URL传参)
URL中的参数有个name,根据XSS原理,注入恶意脚本,尝试注入payload,即:
?name=<script>alert()</script>
第二关(输入框注入)
尝试注入payload
<script>alert()</script>
分析源码,点击菜单来最下面的检查“”看渲染结构,发现输入的内容是一个文本框的value值,这样浏览器是不会执行注入语句的,所以需要构造标签闭合
把input标签闭合掉,然后写个script标签
"><script>alert()</script><"
第三关(事件注入)
尝试使用上一关的内容进行绕过,被转义
考虑到在JavaScript中有一个函数onfocus,用于输入框input,select,a标签获得焦点的事件,所以这里给它一个函数即可,payload如下
' οnfοcus=javascript:alert() '
此时再点击这个input框,使其获得焦点,触发onfocus事件
第四关(引号类型)
使用上一关的结果进行注入,尝试失败,分析源码,发现外围是双引号,双包单了,不符合javascript 的onfocus事件绑定
所以切换payload为双引号即可
" οnfοcus=javascript:alert() "
提交payload后,需要点击input框,触发onfocus事件
第五关(a标签注入)
尝试输入脚本标签,被强行切换为scr_ipt
使用上一关的方法" οnfοcus=javascript:alert() ",事件名称也被强行转换了
这里就要用到a标签的 href属性了,尝试注入
分析源码,发现没有异常转换,只是少了个"> 和 <",构造payload"><a href="javascript:alert();">xx</a><"
发现页面多了个标签,可以点击此标签,然后过关
第六关(大小写绕过)
使用上一关结果,尝试注入"><a href="javascript:alert();">xx</a><",分析源码,href变成了hr_ef
尝试大小写混合绕过,"> <a HREF=javascript:alert()>xx</a> <",成功
第七关(双拼写)
一样,使用上一关方法尝试,发现href被删掉了
而script也是
所以使用双写绕过,比如oonn,这样的话只会把中间的on替换为空,就剩下on了
" ><sscriptcript>alert()</sscriptcript>< "
第八关(Unicode编码)
首先在源码中,发现输入input框内容就是value,而这个内容同时会被当做友情链接a标签的href属性,所以可以尝试闭合a的href属性,构造新属性
尝试后发现,javascript不仅加了_,并且使用了html实体编码,对特殊符号进行了编码,导致不能进行标签闭合
所以可以利用href的隐藏属性即:自动Unicode解码,插入一段js伪协议:javascript:alert()
利用在线工具进行Unicode编码后得到
(四)浏览器解析机制
浏览器解析机制是指浏览器在接收到HTML、CSS、JavaScript等资源后,将其解析为网页并展示给用户的过程。浏览器的解析机制涉及从请求网页资源到将内容渲染到屏幕的多个阶段。关键步骤包括HTML解析、CSS解析、JavaScript执行、渲染树的生成、布局计算、绘制、图层合成等。这一过程的复杂性和高效性对于现代Web应用程序的性能和用户体验至关重要。
步骤简述:
1. 请求和响应
(1)DNS解析:当用户在浏览器中输入URL时,浏览器首先通过DNS(域名系统)将域名解析为IP地址。
(2)发送HTTP请求:浏览器向服务器发送HTTP请求,请求的资源包括HTML、CSS、JavaScript、图像等文件。
(3)接收HTTP响应:服务器返回HTTP响应,通常包含HTML文档和可能引用的其他资源的URL。
2. HTML解析
(1)构建DOM树:浏览器从HTML文档的顶部开始逐行读取内容,并逐步将其解析为DOM树。DOM树是HTML文档的结构化表示,每个节点代表HTML中的一个元素、文本、属性等。
(2)处理阻塞资源:如果HTML中包含外部资源(如CSS、JavaScript文件),浏览器将根据这些资源的类型决定是阻塞解析还是异步加载。默认情况下,外部JavaScript文件会阻塞HTML的解析,直到JavaScript被加载和执行完成。
3. CSS解析
(1)构建CSSOM树:浏览器并行解析CSS文件,将其解析为CSSOM(CSS对象模型)树。CSSOM树表示CSS规则及其应用的层次结构。
(2)应用CSS规则:一旦CSSOM树构建完成,浏览器将CSS规则应用于DOM树中的各个节点,确定每个元素的样式。
4. 渲染树构建
(1)生成渲染树:渲染树是DOM树和CSSOM树的结合体,它只包含需要在页面上显示的内容(不包括<head>标签中的元素或使用display:none隐藏的元素)。
(2)计算布局:也称为回流,浏览器计算每个元素的大小和位置,这个过程取决于页面的几何属性。
5. 绘制
渲染树构建完成后,浏览器将每个节点绘制到屏幕上。这一步称为“绘制”,包括绘制文本、颜色、边框、图像、阴影等视觉样式。
6. 合成和分层
(1)生成图层树:为了优化渲染性能,浏览器会将某些元素提升为独立图层。这些独立图层可以在GPU中进行合成操作。
(2)合成和显示:浏览器将多个图层组合成最终的图像,并将其显示在屏幕上。现代浏览器使用GPU进行合成操作,以提高性能和流畅度。
7. JavaScript 执行
(1)解析和执行:如果HTML文档中包含JavaScript,浏览器的JavaScript引擎会解析并执行这些脚本。
(2)操作DOM和CSSOM:JavaScript可以通过DOM API和CSSOM API动态操作页面内容和样式。浏览器会相应地更新DOM树、CSSOM树和渲染树。
8. 增量解析和渐进渲染
(1)增量解析:浏览器在下载HTML文档的过程中,逐行解析HTML并开始构建DOM树。这种增量解析使得浏览器可以更快地开始渲染页面,提高页面加载速度。
(2)渐进渲染:浏览器逐步显示页面的内容,随着更多的HTML和CSS资源被解析和加载,页面逐步完整呈现给用户。
三、思考与总结
1.反射型、存储型、DOM型XSS的应用场景
(1)反射型 XSS多用于短期攻击,如钓鱼、会话劫持,通常通过链接或用户输入直接诱导执行。
(2)存储型 XSS适合大范围、持久性攻击,影响访问受感染内容的所有用户。
(3)DOM型 XSS适用于不涉及服务器端响应的攻击,通过操控客户端DOM环境直接在用户浏览器中执行恶意代码。
2.《漏洞利用之XSS注入》中15条中,一些执行成功或不成功的原因。
(1)基本的Script标签注入
载荷: <script>alert('XSS')</script>
①执行成功的原因:
- 无输入过滤:Web应用程序没有对用户输入进行任何过滤或转义,因此直接允许<script>标签。
- 未使用内容安全策略(CSP):如果Web应用程序没有使用CSP头部,浏览器就会执行嵌入的JavaScript。
②执行失败的原因:
- 输入过滤:应用程序可能会过滤或删除<script>标签,导致无法执行。
- 转义字符:某些应用程序会自动将<和>转义为<和>,防止脚本执行。
(2)事件处理程序注入
载荷: <img src="x" οnerrοr="alert('XSS')">
①执行成功的原因:
- 事件处理程序允许:应用程序允许用户输入包含HTML属性事件(如onerror)。
- 浏览器渲染规则:当图片无法加载时,浏览器会触发onerror事件,从而执行JavaScript。
②执行失败的原因:
- 属性过滤:应用程序过滤或禁止某些HTML属性(如onerror),防止事件处理程序执行。
- CSP限制:如果CSP头部阻止内联脚本执行,则即使onerror存在也不会执行。
(3)混淆注入
载荷: <scr<script>ipt>alert('XSS')</scr<script>ipt>
①执行成功的原因:
- 解析宽松:一些旧版本的浏览器或对HTML的解析较为宽松的浏览器可能会正确解析嵌套的<script>标签,从而执行其中的JavaScript。
②执行失败的原因:
- 严格解析:现代浏览器严格遵循HTML5规范,处理错误或嵌套的标签会忽略或修正,因此无法执行。
(4)使用JavaScript协议注入
载荷: <a href="javascript:alert('XSS')">Click me</a>
①执行成功的原因:
- 如果应用程序允许用户输入的URL以javascript:协议开头,则浏览器会执行相应的JavaScript。
②执行失败的原因:
- URL过滤:应用程序可能对URL输入进行了严格的验证和过滤,禁止以javascript:为前缀的URL。
- CSP限制:CSP可以阻止JavaScript URL的执行。
(5)CSS表达式注入
载荷: <div style="width: expression(alert('XSS'));">
①执行成功的原因:
- 这种攻击载荷依赖于CSS表达式,这是Internet Explorer早期版本(如IE6和IE7)支持的功能,允许在CSS中嵌入JavaScript。
②执行失败的原因:
- IE8及更高版本已禁用CSS表达式的支持。
(6)URL编码注入
载荷: %3Cscript%3Ealert('XSS')%3C/script%3E
①执行成功的原因:
- 服务器在处理用户输入时,未正确处理或解码URL编码的数据,直接插入到HTML中并执行。
②执行失败的原因:
- 服务器或应用程序在插入数据之前,正确解码并过滤了潜在的恶意代码。
(7)内联事件处理程序注入
载荷: <body οnlοad="alert('XSS')">
①执行成功的原因:
- 未过滤内联事件:应用程序允许插入带有事件处理程序的HTML标记(如onload)。
②执行失败的原因:
- 过滤内联事件:应用程序可能过滤所有内联事件处理程序(如onload、onclick等),从而阻止脚本执行。
(8)基于DOM的XSS
载荷: #<img src=x οnerrοr=alert('XSS')>
①执行成功的原因:
- JavaScript在处理URL的hash部分时未进行正确的验证或编码,导致攻击载荷被插入到DOM中。
②执行失败的原因:
- 应用程序在处理URL参数时进行了正确的验证和编码,防止了攻击载荷的插入。