什么是跨站脚本攻击?
跨站脚本 (英语: Cross-site scripting, 通常简称为: XSS) 是 web 应用程序一种常见的攻击方式. 它是指在服务器未严格验证输入输出时, 网站容易被攻击者注入恶意代码, 当其他用户访问这些携带恶意代码的网站时, 就会遭受攻击. 因此, XSS 是一种间接攻击技术, 不直接攻击 Web 服务器, 而是以其为跳板攻击用户.
跨站脚本攻击的分类
按攻击类型分类:
反射型: 攻击者构造含有恶意代码的链接, 诱导用户点击, 请求到达服务器后, 若未对输入输出严格验证, 恶意代码会被反射给用户运行, 使用户遭受攻击.
反射型 XSS
存储型: 攻击者构造含有恶意代码数据的请求提交给服务器, 若在数据存储到数据库以及从库中读取显示给用户的过程中, 未对输入输出严格验证, 恶意代码数据将被存到数据库中, 且所有访问到该恶意代码数据的用户均遭受攻击.
存储型 XSS
DOM 型: 随着单页面应用的发展, 越来越多 Web 应用依赖锚点 (#userinfo/jack) 来实现页面路由跳转. 这也带来新的 DOM 型 XSS, 如:#userinfo/<script>alert(document.cookie)<script>, 该攻击与反射型类似, 但不经过服务器反射, 直接在用户端执行. 详见: https://www.oschina.net/translate/dom-based-xss-of-third-kind
按注入位置分类:
标签体内:<div class="username">join<ScRipt sRc="https://xxx/hacker.js"></scRiPt></div>
标签的属性: <img class="anchor" src="x" onerror="alert(document.cookie);">
JavaScript 数据域:<script>var res_data = "data";alert(document.cookie); // ";<script>
URL 参数:<a href="product.jsp?id=123"></a><script src="hacker.js"></script><a href=" "></a>
CSS 参数:*body { backgroud-image: url("javascript: alert(document.cookie)"); }
跨站脚本攻击的利用及危害
身份盗用. Cookie 是用户对于特定网站的身份验证标志, XSS 攻击可以盗取用户的 cookie, 从而利用该 cookie 盗取用户对该网站的操作权限. 如果一个网站管理员用户的 cookie 被窃取, 将会对网站引发巨大的危害.
钓鱼欺骗. 在页面中伪造一个登录或支付页面, 欺骗用户输入账户密码信息, 实现窃取用户敏感信息.
网站挂马. 攻击者利用 Iframe 标签嵌入隐藏的恶意网站, 将被攻击者定向到恶意网站上, 或弹出恶意网站窗口等方式, 进行挂马攻击.
蠕虫攻击. 伪造请求, 主动攻击更多用户, 窃取敏感数据, 发表非法评论, 进行 DDoS 攻击, 最终导致服务器瘫痪.
跨站脚本攻击的防护
服务端防范方法:
对用户的输入输出进行过滤. 推荐使用 OWASP 开源项目 ESAPI 对用户的输入输出进行过滤(官网下载 ,API 文档):
针对标签内 html:ESAPI.encoder().encodeForHTML( HTML )
针对标签属性防护: ESAPI.encoder().encodeForHTMLAttribute( attr )
针对 JavaScript 域: ESAPI.encoder().encoderForJavaScript( jscode )
针对 URL 参数防护: ESAPI.encoder().encodeForURL( url )
针对 CSS 参数防护: ESAPI.encoder().encoderForCSS( CSS )
Cookie 设置 HttpOnly 和有效期. 当 Cookie 设置为 HttpOnly 时, Cookie 无法通过脚本读取, 即使不小心中了 XSS 攻击, 也不会被盗用身份. 设置有效期后, 万一 Cookie 泄露, 可避免会话被长期盗用.
限制用户输入数据长度和数据格式. 恶意代码一般比正常数据长, 限制字符长度, 能有效防止危害较大的 XSS 攻击. 当数据有固定格式时, 拦截不符合格式的数据, 能有效防止 XSS 攻击, 还能提升应用健壮性.
对用户的输入输出进行转义.
将特殊符号转为 HTML 编码, 可用第三方库: https://www.owasp.org/index.php/OWASP_Java_Encoder_Project
将特殊符号转为全角符号, 可参考: https://yunjiechao-163-com.iteye.com/blog/1973803
客户端防范方法:
慎重点击网页链接. 只点击可信任网站域内链接, 不点击指向其它网站的链接. 浏览邮件, 论坛文章, 留言板留言时提高安全意识, 可有效防范跨站脚本攻击.
提高浏览器安全等级. 及时升级浏览器, 必要时在浏览器上禁用 JavaScript 脚本的运行, 限制操作 cookie 的权限. 此外, 尽量采用主流 Chrome,Firefox,Safari 等浏览器, 此类浏览器可检测部分跨站脚本攻击, 更为安全.
开启终端安全防护. 即使跨站脚本被浏览器解释执行, 终端上安装的防病毒系统, 防火墙等安全软件, 可拦截和阻止网页挂马等后续攻击行为.
来源: http://www.jianshu.com/p/f0527ce21842