跨站脚本攻击(cross site scripting),为了与css做区分,简称为xss。顾名思义,就是在别人的网站上通过执行脚本来达到攻击网站的目的。
为什么能执行脚本?就是因为程序过滤不严谨,太过于相信用户的输入和服务器的返回内容,直接在网页呈现,才让人有机可乘。
如何测试一个网站存不存在xss漏洞呢?可以把URL的请求参数内容换成<script>alert('xss')</script>,看会不会弹出内容,如果可以,那就存在xss漏洞了
xss的类型
1. 反射性
反射性xss又称非持久型xss。通常是诱使用户点击恶意链接,注入脚本被传输到目标服务器上,然后目标服务器又“反射”到用户浏览器上,从而在浏览器上执行脚本。
比如受害者点击了这个链接
http://test.com/search/?q=<script>alert(document.cookie)</script>
注入的脚本被当作搜索关键词发送到目标服务器上,在搜索结果页,脚本被当作关键词嵌入页面,从而在页面中执行,这就是反射性xss。由于脚本的执行只在链接被点击的时候才会发生,所以又叫非持久型xss。
反射性xss攻击的途径
- 向想攻击的目标用户发送电子邮件,邮件里包含带有漏洞的链接,并含有攻击负载,并配上诱使用户点击的文字。
- 有些网站允许用户提交html标签,就可以提交一些像img可以带有url的标签,url指向存在漏洞的网站,这样用户也不会察觉到是中了圈套。
- 在存在漏洞的网站插入广告,广告带有攻击脚本,用户在点击广告的时候,也会攻击成功。
2. 存储型
存储型xss又称持久性xss。之所以称为持久型,是因为攻击脚本永远地存在了目标服务器的数据库中。
这种类型的攻击多在论坛中出现,如果不对用户的输入加以控制,用户输入了类似于<script>alert(document.cookie)</script>这种的脚本,然后在数据库中存储了起来,只要浏览这个帖子脚本就会执行,那么所有浏览这个帖子的用户都会中招,影响的范围会很大,比反射型xss的危害更大。
3. DOMBasedXSS
用户通过交互修改dom改变页面结构产生的xss称为DOMBasedXSS。能够修改dom在于把从document.location 或document.URL 或 document.referrer等获取等数据直接展示在了页面上。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>xss</title>
</head>
<body>
<img src="{{img_src}}">
<script>
var href = (location.search.match(/href=([\w\W]+)/i) || [])[1];
console.log('href', href, decodeURIComponent(href));
document.write(decodeURIComponent(href))
</script>
</body>
</html>
这里是获取url的参数然后写在了页面上,如果url是http://test.com/search/?href=<script>alert(document.cookie)</script>
,那参数<script>alert(document.cookie)</script>
就会直接插入到页面中,这段js代码也会执行,就产生了xss。
危害
- 窃取用户的cookie,盗取私密信息。如果用户是网站管理员,可进行的操作将更多,也会造成更大的危害。
- 网络钓鱼,盗取用户账号
- 盗取企业重要资料
- 流量劫持等
防范措施
- 设置httpOnly,对cookie进行保护
- 过滤特殊字符,对script、img、a标签等进行过滤
- 在将不可信数据插入html之前,对特殊字符进行编码
特殊字符 | 实体编码 |
---|---|
& | & |
> | > |
< | < |
/ | / |
" | " |
' | ' |
网友评论