1. 总结反射型、存储型、DOM型XSS特点和区别
反射型(Reflected Cross-site Scripting)
反射型xss也称作非持久型、参数型跨站脚本。
- 主要用于将恶意脚本附加到URL地址的参数中。
- 产生层面:前端
- 漏洞特征:一次性的、前端执行、不会储存在后端数据库
- 危害等级:中
- 反射型XSS形成的一个过程
反射型 XSS 的攻击步骤:
- 攻击者构造出特殊的 URL,其中包含恶意代码。
- 用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
储存型(Stored Cross-site Scripting)
- 此类XSS不需要用户单击特定URL就能执行跨站脚本。
- 攻击者事先将恶意JavaScript代码上传或存储到漏洞服务器中。
- 当受害者浏览包含此恶意JavaScript代码的页面就会执行恶意代码。
- 产生层面:后端
- 漏洞特征:持久性的、前端执行、储存在后端数据库
- 危害等级:高
- 存储型 XSS 常出现在网站的留言版、评论、博客日志等交互处
存储型XSS数据交互过程:
用户输入数据->后端执行php代码-> 存入数据库某张表 ->返回数据给php页面->回显前端
函数:
- die()//函数输出一条消息,并退出当前脚本
- trim()//函数从字符串的两端删除空白字符和其他预定义字符
- stripslashes()//删除反斜杠
- mysql_real_escape_string()//转义 SQL 语句中使用的字符串中的特殊字符
- mysql_query(query) //mysql_query() 函数执行一条 MySQL 查询
- mysql_error()//返回上一个 MySQL 操作产生的文本错误信息
存储型 XSS 的攻击步骤:
- 攻击者将恶意代码提交到目标网站的数据库中。
- 用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指
- 定的操作。
- 这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等
DOM型XSS
- 产生层面:前端、特殊的反射型XSS
- 漏洞特征:一次性的、前端执行、不会储存在后端数据库、程序执行不依赖
- 于服务器端的数据
- web server不参与,仅仅涉及到浏览器的XSS。
- 危害等级:中
DOM型XSS原理:
- DOM XSS的XSS代码不需要服务端解析响应的直接参与,触发XSS的是浏览器端的DOM解析。
- 用户在客户端输入的数据如果包含了恶意JavaScript脚本,而这些脚本没有经过适当的过滤,应用程序就可能受到基于DOM的XSS攻击。
什么是DOM(Document Object Model):
- DOM是JS操作网页的接口,全称为“文档对象模型”(Document Object Model)。它的作用是将网页转为一个JS对象,从而可以用脚本进行各种操作(比如增删内容)
DOM节点:
- 元素节点:在“购物清单”例子中,<body>、<p>、<ul>之类的元素在文档中的布局形成了文档的结构,它们即是元素节点。
- 文本节点:文档通常会包含一些内容,这些内容多数由文本提供,如前面的例子中,<p>包含着文本“欢迎购买” ,它就是一个文本节点。
- 属性节点:元素或多或少都有一些属性,属性用于对元素做出更具体的描述
DOM型原理:
- XSS原理客户端的脚本程序可以通过DOM动态地检查和修改页面内容。
- 程序执行不依赖于服务器端的数据,从客户端获得DOM中的数据并在本地执行。
- 浏览器用户可以操纵DOM中的一些对象,例如URL、location等。
- 用户在客户端输入的数据如果包含了恶意JavaScript脚本,而这些脚本没有经过适当的过滤和消毒,应用程序就可能受到基于DOM的XSS攻击。
三种类型的XSS区别:
与之前两类XSS漏洞不同的是:
漏洞发生原因跟服务器解析无关,纯粹是JS代码读取了URL内容导致。
dom-xss取决于输出位置,并不取决于输出环境
因此检测JS代码中可能触发DOM型XSS的属性如下:
1、document.referer 属性
2、window.name 属性
3、location 属性
4、innerHTML 属性
5、documen.write 属性
2. 上网搜索一份XSS 的fuzz字典或字典生成工具
网上很多,这个相对全面一点:web的都有
GitHub - TheKingOfDuck/fuzzDicts: Web Pentesting Fuzz 字典,一个就够了。
3. 到XSS挑战靶场打靶,要求通过5关以上,通关越多,加分越多。(https://xss.tesla-space.com/)
第一关:
发现提交了参数name=test,页面上又出现了test,试一下直接注入<script>alert(1)</script>
done.
第二关:
改一下输入内容:
明显的回显,直接注入试试<script>alert(1)</script>
没反应,f12看看前端代码;
试下闭合掉引号:"><script>alert(1)</script>
done
第三关:
源码一看这不和level2一样吗,试一下发现,输入的“”和<>被过滤了
于是试一下不带<>的语句,双引号使用单引号来闭合' οnmοuseοver=alert(9) '
done
第四关:
直接<script>alert(1)</script>
没反应,看看源代码发现,<>被过滤掉了,试着构造"οnmοuseοver=alert(9) "
done
第五关:
试了两个发现:o给我转成了o_;r给我转成了r_;
试试大写绕过,无用,依然被过滤了;
多换几个标签试试。。。
找到了"><a href=javascript:alert('xss')>test</a>
done
4. 总结浏览器解析机制
浏览器解析机制是指浏览器如何将用户输入的网页地址(URL)解析为实际可显示的网页内容的过程。这个过程涉及多个步骤,从用户输入URL开始,到浏览器显示网页结束。以下是浏览器解析的主要步骤:
1. URL 解析
- 用户输入:当用户在浏览器地址栏中输入一个URL时,浏览器首先会解析这个URL,确定要访问的资源位置。URL通常包括协议(如
http://
或https://
)、域名(如www.example.com
)、路径、查询参数等。 - DNS 解析:浏览器将域名发送给DNS服务器,DNS服务器返回该域名对应的IP地址,浏览器使用这个IP地址与目标服务器建立连接。
2. 建立连接
- TCP/IP 连接:浏览器通过TCP/IP协议与目标服务器建立连接。如果使用HTTPS协议,还会执行TLS/SSL握手以确保连接安全。
- 请求资源:浏览器向服务器发送一个HTTP或HTTPS请求,要求获取网页资源(如HTML文件、CSS样式表、JavaScript文件等)。
3. 接收和处理响应
- 服务器响应:服务器处理浏览器的请求,并返回相应的内容,如HTML文档、图片、视频、CSS、JavaScript等。响应还可能包含HTTP状态码,用于指示请求的结果(如200 OK,404 Not Found)。
- 内容解码:如果服务器响应是经过压缩或编码的(如Gzip压缩),浏览器会先对其进行解码。
4. 解析与渲染
- HTML 解析:浏览器开始解析接收到的HTML文档,构建DOM(文档对象模型)树结构。HTML文档中的标签和元素会被逐一解析,并加入到DOM树中。
- CSS 解析:同时,浏览器还会解析与HTML相关联的CSS文件,构建CSSOM(CSS对象模型)树,以确定各个元素的样式。
- JavaScript 执行:在解析HTML的过程中,如果遇到JavaScript代码或引用的外部JavaScript文件,浏览器会暂停HTML解析,执行JavaScript代码。JavaScript可能会动态地修改DOM和CSSOM树。
- 布局(Layout):浏览器根据构建的DOM树和CSSOM树来计算每个元素在页面上的位置和大小,这个过程称为布局。
- 绘制(Painting):布局完成后,浏览器将页面内容绘制到屏幕上,包括文本、图片、背景等。
- 复合(Compositing):最终,浏览器将各个层(Layer)组合成最终的页面,并显示给用户。
5. 优化与更新
- 渲染优化:现代浏览器会对渲染过程进行优化,例如减少重绘(Repaint)和重排(Reflow)次数,以提高页面加载和交互的性能。
- 事件处理与交互:浏览器会持续监听用户的交互(如点击、输入等)和异步事件(如XHR、Fetch等),并实时更新页面。