什么是XSS:
XSS,即cross-site-scripting,跨站脚本攻击。
跨站脚本攻击是指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击。当用户访问包含攻击脚本的特定网页,就会产生XSS。
XSS 的原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的。
XSS攻击主要分为三种:反射型XSS,存储型XSS,DOM-XSS等。
主要涉及三方:攻击者,用户,web server等。
一.危害
挂马
盗取用户Cookie。
DOS(拒绝服务)客户端浏览器。
钓鱼攻击,高级的钓鱼技巧。
删除目标文章、恶意篡改数据、嫁祸。
劫持用户Web行为,甚至进一步渗透内网。
爆发Web2.0蠕虫。
蠕虫式的DDoS攻击。
蠕虫式挂马攻击、刷广告、刷浏量、破坏网上数据。
其它安全问题
二.分类
1.反射型(reflected)(非持久型XSS)
反射型XSS又称非持久性跨站点脚本攻击,它是最常见的XSS攻击类型。
发出请求后,服务器端对请求进行解析后响应,并返回包含有XSS脚本的响应,浏览器对其进行解析并执行。
当一个网页获取url中的参数展示在页面上,并且没有对获取到的数据进行转义或者进行的转义有漏洞,那么就会存在被攻击的风险。
攻击脚本并没有存入网站数据库,而是隐藏在链接中,通过链接传播。只要用户点击了链接就很可能会被盗取信息。
特征:
(1)即时性,不经过服务器存储,直接通过 HTTP 的 GET 和 POST 请求就能完成一次攻击,拿到用户隐私数据。
(2) 攻击者需要诱骗点击,必须要通过用户点击链接才能发起。
(3) 反馈率低,所以较难发现和响应修复。
(4) 盗取用户敏感保密信息 。
为了防止出现非持久型XSS,需要确保以下事情:
(1)Web 页面渲染的所有内容或者渲染的数据都必须来自于服务端。
(2)尽量不要从 URL,document.referrer,document.forms 等这种 DOM API 中获取数据直接渲染。
(3)尽量不要使用eval, newFunction(),document.write(),document.writeln(),
window.setInterval(),window.setTimeout(),innerHTML,document.createElement()
等可执行字符串的方法。
(4)如果做不到以上几点,也必须对涉及 DOM 渲染的方法传入的字符串参数做 escape 转 义。前端渲染的时候对任何的字段都需要做 escape 转义编码。
反射型
2.存储型(stored)(持久型XSS)
一般存在于 Form 表单提交等交互功能,如文章留言,提交文本信息等,黑客利用的 XSS 漏洞,将内容经正常功能提交进入数据库持久保存,当前端页面获得后端从数据库中读出的注入代码时,恰好将其渲染执行。
持久的XSS相比非持久XSS攻击危害更大,因为每当用打开页面,查看内容时脚本将自动执行。谷歌的orkut曾经就遭受到XSS攻击。
存储型XSS与反射型XSS的差别在于,存储型XSS将攻击脚本存储在数据库中,不需要诱骗点击,黑客只需要在提交表单的地方完成注入即可,但是这种 XSS 攻击的成本相对还是很高。
最典型的例子是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML与Js解析执行,于是触发了XSS攻击。
攻击脚本存储在网站数据库,所以在链接上看不出来一点异样,更加隐蔽,破坏性更大。
攻击成功需要同时满足以下条件:
(1)POST 请求提交表单后端没做转义直接入库。
(2)后端从数据库中取出数据没做转义直接输出给前端。
(3)前端拿到后端数据没做转义直接渲染成 DOM。
特点:
(1)持久性,植入在数据库中
(2)盗取用户敏感私密信息
(3)危害面广
防御措施
1.CSP
CSP 本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截是由浏览器自己实现的。我们可以通过这种方式来尽量减少 XSS 攻击。
通常可以通过两种方式来开启 CSP:
(1)设置 HTTP Header 中的 Content-Security-Policy
(2)设置 meta 标签的方式
2.对用户输入进行转义
“永远不要相信用户的输入”
存储型
3.DOM XSS
DOM XSS与另外两种的区别主要是:DOM XSS的代码并不需要服务器参与,触发XSS取决于浏览器端的DOM解析,完全是客户端的事情。
三.常见代码
常用的JavaScript方法
alert 用于显示带有一条指定消息和一个确认按钮的警告框。
window.location 用于获得当前页面地址的地址,并把浏览器重定向到新的页面。
onload 一张页面或一幅图像完成加载。
onsubmit 确认按钮被点击。
onerror 在加载文档或图像时发生错误。
常见代码:
四.总结
产生的原因:无充分过滤,产生不合法的参数或输入内容,比如URL中没有进行转义或者转义存在漏洞,都会产生XSS攻击的风险。
防御:
“永远不要相信用户的输入”
具体转义的对象就是一些 / ” < > 之类的特殊字符,防止形成可执行脚本。
对输入与URL过滤
对输出编码
|
|