XSS 基础及分类
介绍
跨站脚本攻击( Cross Site Scripting ),为了和层叠样式表 csss 区分,缩写为 XSS。 恶意攻击者通过 “HTML 注入” 篡改网页,向 Web 页面里插入恶意脚本(例如恶意 javaScript 代码 ),当用户浏览该页时,嵌入其中 Web 里面的脚本( 例如 javaScript 代码 ) 会被执行,从而达到恶意攻击用户的目的。
XSS 是客户端代码注入,通常注入代码是 JavaScript。区别于命令注入,SQL 注入等服务端代码注入,XSS 的形成和 SQL 注入一样,通常是因为对用户可控的地方(数据)与命令区分不严谨(过滤做的不彻底)造成的。
XSS 分类
类型 | 触发过程 | 存储区 | 谁来输出 | 输出位置 |
---|---|---|---|---|
存储型 XSS | 1.黑客构造 XSS 脚本 2.正常用户访问携带 XSS 脚本的页面 |
后端数据库 | HTML | HTTP 响应 |
反射型 XSS | 正常用户访问携带 XSS 脚本的 URL | URL | 后端 Web 应用程序 | HTTP 响应 |
DOM 型 XSS | 正常用户访问携带 XSS 脚本的 URL | URL | 前端 JavaScript | 动态构造的 DOM 结点 |
输出在 HTTP 响应中和输出在动态构造的 DOM 结点中有什么区别呢?
????暂未搞清楚?
危害
盗取用户信息(比如获取用户的 Cookie)、钓鱼、制造蠕虫等。
分类详解
存储型
原理
形成
- 黑客构造携带 XSS 脚本的内容
- 浏览器将携带 XSS 脚本的页面内容提交给 web 服务器
- Web 服务器中的 Web 服务器软件(例如:免费的 HTTP 服务器软件:Apache 和 Nginx ) 处理浏览器与 Web 服务器的连接与请求过程
- Web 服务器软件根据 HTTP 请求报文,解析文件位置、处理请求参数
- 脚本语言解释器(如:php 语言解释器)从 Web 服务器软件获取请求参数,并解释对应文件,(存储型 XSS 的后端脚本文件一定是有数据库有交互的)
- 解释执行的 php 脚本与数据库交互,将携带 XSS 脚本的内容存储到数据库中。
- Web 服务器软件处理浏览器与 Web 服务器的应答过程以及关闭连接
触发
- 用户或管理员打开浏览器访问存在 XSS 脚本的页面
- 浏览器将页面内容请求提交给 web 服务器
- Web 服务器中的 Web 服务器软件(例如:免费的 HTTP 服务器软件:Apache 和 Nginx ) 处理浏览器与 Web 服务器的连接与请求过程
- Web 服务器软件根据 HTTP 请求报文,解析文件位置、处理请求参数
- 脚本语言解释器(如:php 语言解释器)从 Web 服务器软件获取请求参数,并解释对应文件,(存储型 XSS 的后端脚本文件一定是有数据库有交互的)
- 解释执行的 php 脚本与数据库交互,将存储在数据库中恶意 xss 脚本(一般为网站留言等)查询出来,并拼接到页面的某个地方。
- Web 服务器软件处理浏览器与 Web 服务器的应答过程,将内容返回给用户浏览器,浏览器渲染 HTML 并显示,因而触发 XSS
存储型 XSS 是 从数据库中提取恶意的 脚本代码(php 脚本与数据库有交互)
那这是不是先从参数中获取存入数据库中,然后再从数据库中获取呢?
类似于使用注入点进行二次注入?
示例
反射性
反射型 XSS 又称为非持久性 XSS,这种攻击往往具有一次性,点击访问一次含恶意脚本的 url 进行触发。
与存储型 XSS 不同的是,反射性 XSS 可以在链接 (url )中查看到很明显的 XSS 脚本特征,所以我们一般诱导用户点击时通常采用 url 编码、生产短网址的方式增加隐蔽性,以期减弱用户的警惕性。
一般判断是否存在反射型 XSS 的方式:看你的输入是否会在页面上某个地方显示,当然,一般你的输入要有唯一性,这样才好确定的显示的是不是你输入的呀
原理
![1565781435376](https://blog-1259556217.cos.ap-chengdu.myqcloud.com/blog/BlogPic/Web%E5%AE%89%E5%85%A8/xss/reflected%20xss_prici.png)
形成
下面的流程就不写那么详细了....
- 攻击者通过邮件等形式将包含 XSS 代码的链接发送给正常用户,用户点击访问该 URL
- 浏览器向 web 服务器发送请求
- Web 服务器软件解析处理应用参数
- php 语言解释器定位到对应 php 文件,解释执行对应 php 脚本,获取请求参数(即:恶意 XSS 脚本)拼接到页面内容中,生成 html 文件
- Web 服务器软件响应对应页面内容,然后把带有 XSS 的代码(一般为 javaScript 脚本)的 HTML 发送给用户
- 用户浏览器渲染 HTML ,触发 XSS 漏洞。
触发
反射型 XSS 是从 URL 中提取的参数中含有恶意脚本代码。
示例
黑客在 url 中插入恶意脚本,然后发给用户点击
1 | http://localhost/dvwa-master/vulnerabilities/xss_r/?name=<script>alert("xss")</script> |
用户点击访问,后端 php 开始处理提交的参数(当然,参数是之前黑客构造的恶意脚本),
1 |
|
我们可以看到后端 php 代码对输入参数未经过滤就直接拼接,导致脚本拼接之后解析出来的是以下代码,这样浏览器渲染的时候,就会产生弹出。
1 | <pre>Hello <script>alert("xss")</script></pre> |
测试流程:
- 输入页面上比较唯一的正常字符串(无引号,无大于小于号),看有没有在页面上回显,右键查看源码或开发者工具中定位到显示位,看是什么标签。
- 尝试输入一些带有大于小于号对或引号的不正常字符串,看页面如何显示,按 F12 打开开发者工具,定位到显示位置看如何解析我们的输入
DOM
DOM 型的 XSS 由于其特殊性,常常被分为第三种,这是一种基于 DOM 树的 XSS。例如服务器端经常使用 document.boby.innerHtml 等函数动态生成 html 页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生 DOM 型的 XSS。DOM 型 XSS 可能是存储型,也有可能是反射型。
原理
- 用户在浏览器中访问携带有 XSS 脚本的链接
- 浏览器通过 JavaScript 从 URL 中提取 XSS 脚本中的内容,并写入到 DOM 中,触发 XSS
DOM 型与反射型的区别:DOM 型通过前端 JavaScript 将 XSS 脚本写入到 DOM 中触发 XSS,而反射型是通过后端 Web 服务器中的 PHP 解释执行将 XSS 脚本写入到页面中。浏览器渲染响应页面触发 XSS。
DOM 型 XSS 的一种情况:
XSS 不是在 URL 的参数中而是在 URL 的 hash 中,URL 的 hash 是不会发送到 后端 Web 服务器的,说明向页面输出 XSS 脚本的不是后端,是前端页面。我们可以在脚本中搜索 hash 来定位。
如果改变 # 后面 hash 的内容,点击 Enter,页面是不会重载的,你需要手动去刷新。
dom 型 xss 是由 javascript 来触发的,所以不能想其他两种那样通过查看页面源代码的方式在 html 中找到 xss 脚本代码。我们需要去开发者工具中的还有 js 脚本的 html 中搜索。
补充:
JavaScript 中的三个弹窗函数:alert() confirm() prompt()
根据服务器的过滤情况,如果第一个被过滤了,我们可以尝试其他函数。