一、反射型、存储型、DOM型XSS特点及区别
XSS属于注入类漏洞,其本质是:在前端代码中用户可以控制内容的地方(简称可控点),拼接上一段可被浏览器执行的新语句。这里可被浏览器执行是关键,不管你正在测试的点是否有漏洞,首先拼接上去的脚本同上下文看来,需要一定程度的符合前端代码的语法结构。
(一)反射型XSS
1.反射型跨站脚本也称作非持久型、参数型跨站脚本、这类型的脚本是最常见的 ,也是使用最为广泛的一种,主要用于将恶意的脚本附加到URL地址的参数中。
如:http://www.test.com/search.php?key="><script>alert("xss")</script>"
2.攻击流程:
(1)黑客向用户发送带有XSS恶意脚本的链接
(2)用户点击恶意链接访问目标服务器
(3)网站将XSS连同正常页面返回到用户浏览器
(4)用户浏览器解析了XSS恶意代码,向恶意服务器发送请求
(5)黑客在自己搭建的恶意服务器获取用户提交的信息
(二)存储型XSS
1.存储型XSS:持久性,代码是存储在web服务器中的,比如在个人信息或发表文章等地方插入代码,如果没有过滤或者过滤不严,那么这些代码将存储在服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫、盗窃cookie。每一个访问特定页面的用户,都会受到攻击。
2.攻击流程:
(1)黑客在目标服务器上构造xss恶意脚本保存在数据库中
(2)用户在网站登录状态下访问了目标服务器,查看了存在恶意脚本的页面
(3)网站将XSS同正常页面返回到用户浏览器
(4)用户浏览器解析了XSS恶意代码,向恶意服务器发起请求
(5)黑客从自己搭建的恶意服务器中获取用户提交的信息
(三)DOM型XSS
1.基于DOM(Document Object Model,文档对象模型)的跨站脚本攻击是一种更高级的攻击形式,通过篡改DOM注入恶意脚本。DOM提供对文档结构化的描述,并将HTML页面与脚本、程序语言联系起来,当网页被加载时,浏览器会创建页面的文档对象模型DOM。Web程序的客户端侧JavaScript脚本可以对DOM进行编辑从而动态修改网页内容,也就是从DOM获取数据然后在用户本地执行。在这个过程中,如果数据处理不当,攻击者就可以将恶意脚本注入DOM,然后读取DOM数据时触发攻击。基于DOM的跨站脚本攻击与反射型、存储型跨站脚本攻击有很大不同,整个攻击过程均在用户侧浏览器执行,无需Web服务器端进行解析和响应访问请求。这种类型的攻击比较难排查,WAF设备无法获取通信流量,可能难以发现攻击。
二、一份XSS字典(不止XSS字典)
(这个的作者还在不定期更新)
GitHub地址:TheKingOfDuck/fuzzDicts: Web Pentesting Fuzz 字典,一个就够了。 (github.com)
内容包括:参数Fuzz字典 Xss Fuzz字典 用户名字典 密码字典 目录字典 sql-fuzz字典 ssrf-fuzz字典 XXE字典 ctf字典 Api字典 路由器后台字典 文件后缀Fuzz js文件字典 子域名字典
三、XSS挑战靶场打靶(https://xss.tesla-space.com/)
(一)level1
1.看到payload长度为4,尝试修改url中name=admin,下方payload值也发生改变
2.F12检查网页查看发现get传参name的值admin插入了html里,还回显了payload的长度
3.直接payload:name=name=<script>alert()</script>
(二)level2
1.还是先尝试修改url中keyword=admin
2.尝试payload:name=name=<script>alert()</script>(既然是第二关肯定会失败)
3.我们右键查看网页源码,发现第一处进行了html实体转义,但是第二处没有
4.因为第二处是标签的属性值,需要使用"来闭合本来就有的引号,所以构造payload:"><script>alert()</script><",修改url中的keyword值
(三)level3
1.第三关闭合双引号肯定行不通了,但还是尝试一下,果然没反应
2.右键查看网页源码,发现是单引号
3.尝试闭合单引号:'> <script>alert()</script> <',还是失败了,再看网页源代码,发现符号也被实体化了
4.看来无法利用标签来执行弹窗,尝试使用触发事件函数onclick来弹窗onclick是在对象被鼠标点击或者选取时触发,即οnclick=’alert()’,鼠标点击就会触发弹窗,还要闭合单引号,构造payload:'onclick='alert()
5.再点击一下页面
拓展:触发事件函数有三种onclick(点击)、onerror(加载外部文件(文档、图像)发生错误时触发)、onmouseover(鼠标滑过)
(四)level4
1.我们直接看网页源代码,发现应该要闭合双引号
2.尝试继续利用触发事件函数onclick来弹窗,构造payload:”οnclick=”alert()
3.再点击一下
(五)level5
1.查看网页源代码
2.尝试继续利用触发事件函数onclick来弹窗,构造payload:”οnclick=”alert(),发现失败了
3.查看网页源代码,发现被加了下划线
4.尝试了所有随机事件函数,都被加下划线,最后发现javascript不会
5.用a href标签法:href属性的意思是 当标签<a>被点击的时候,就会触发执行转跳,上面是转跳到一个网站,我们还可以触发执行一段js代码,添加一个标签得闭合前面的标签,构建payload:
"><a href=javascript:alert()>tgp</a><"
6.点击tgp
四、浏览器解析机制
(一)URL解析与缓存检查
1.URL解析:当用户在浏览器中输入一个URL并发送请求时,浏览器会首先解析这个URL,识别出协议(如http、https)、域名、端口号(如果有的话)和路径等信息。
2.缓存检查:在发送网络请求之前,浏览器会检查本地缓存(包括浏览器缓存和系统缓存)中是否已有对应资源的副本。如果找到且资源未过期,则直接从缓存中加载资源,以节省时间和带宽。
(二)DNS域名解析
如果本地缓存中没有找到所需资源,浏览器会进行DNS查询,以获取域名对应的IP地址。DNS查询是一个递归查询过程,可能涉及多个DNS服务器。
(三)建立连接与发送HTTP请求
1.建立连接:浏览器与服务器之间通过TCP/IP协议建立连接。
2.发送HTTP请求:浏览器构建HTTP请求报文,并通过TCP连接发送给服务器。请求报文包括请求行、请求头和请求正文(如果有的话)。
(四)服务器响应与资源接收
服务器接收到HTTP请求后,会处理请求并返回响应。响应报文包括状态行、响应头和响应正文。浏览器接收响应报文,并根据需要缓存响应内容。
(五)页面渲染
页面渲染是浏览器解析机制的核心部分,它涉及多个子过程:
1.解析HTML以构建DOM树:
(1)浏览器的渲染引擎开始解析HTML文档,将HTML标签转换为DOM(文档对象模型)节点,构建DOM树
(2)DOM树是页面内容的结构化表示,它包含了页面中的所有元素及其关系
2.解析CSS以构建渲染树:
(1)浏览器继续解析CSS样式文件(包括外部CSS文件和样式元素以及JS生成的样式),根据CSS选择器计算出节点的样式
(2)根据DOM树和CSS样式信息,构建渲染树(Render Tree)。渲染树只包含需要显示的节点和它们的样式信息
3.布局:
(1)从根节点开始,递归地计算每个元素的大小、位置等几何信息。
(2)这个过程称为布局或回流(Reflow),它确保了页面上的元素能够按照正确
的顺序和位置进行排列
4.绘制:
(1)遍历渲染树,使用UI后端层来绘制每个节点
(2)当渲染树中的元素需要更新属性时,如果这些属性只是影响元素的外观(如颜色、背景色等),则称为重绘(Repaint)。重绘不会改变元素的布局或位置,只是重新绘制元素的外观
(六)优化策略:
批处理、合并操作、利用缓存、避免使用table布局
(七)事件处理与交互:
事件触发、事件处理、JavaScript执行