XSS
跨站脚本攻击(Cross-Site Script),为了与层叠样式表 CSS 更好的区分,通常称之为 XSS。 XSS 指的是攻击者恶意向 Web 页面中插入恶意攻击脚本。
XSS 类型
XSS 可以分为三类:
存储型
反射型
DOM 型
存储型 XSS
注入的脚本永久存储在目标服务器上。 然后,当浏览器发送数据请求时,受害者从服务器检索该恶意脚本。
现有一论坛网站,攻击者在评论回复 <script>alert('you has ben hack');</script>
. 如果没对内容里的 html 进行转义,那么其他用户访问时,该脚本会被执行。
反射型 XSS
当用户被诱骗点击一个恶意链接,或者提交一个表单,或者浏览恶意网站时,注入脚本进入易受攻击的网站。 WEB 服务器会将注入的脚本反映回用户浏览器,例如错误信息,搜索结果或其它响应,其中包括作为请求的一部分发送到服务器的数据。 浏览器执行代码是因为它假定响应来自用户已经与之交互的“受信任”服务器。
攻击 URL 示例: https://baidu.com?q=<script>alert('you has ben hack');</script>
DOM 型 XSS
本质上 DOM 型 XSS 是反射型中的特殊一种。 只不过 DOM 型没有对文档内容进行修改,只对 DOM 环境进行了修改。
用于攻击的 URL: http://www.vulnerable.site/welcome.html?name=<script>alert(document.cookie)</script>
DOM 型的特点
恶意程序脚本在任何时候不会嵌入到处于自然状态下的 HTML 页面.
这个攻击只有在浏览器没有修改 URL 字符时起作用。
XSS 防御
XSS 的本质是 “HTML 注入”,即将用户数据当成代码的一部分,从而混淆语义。
如果网站使用了 MVC 架构,XSS 则发生在 View 层 -- 拼接变量并输出至 HTML
在对用户数据进行输出时,需要使用到 ESAPI 进行处理。
输出检查
当用户数据作为内容展示或者属性时,需要对动态内容进行 HTMLEncode
。
主要是对 html 标签及一些特殊字符( ”
、<
、>
、&
等等 )转换成 HTMLEntities
。 对应标准 ISO-8859-1
当用户数据作为 JavaScript 中的一部分时,对动态内容采用 JavaScriptEncode
- escape()
当用户数据作为 CSS 中当一部分时,需要 ESAPI.encoder().encodeForCSS()
由于基于 CSS、style、style attribute 形成 XSS 的方式特别多,尽可能避免用户数据作为 CSS 当一部分
当用户数据作为 URL 中当一部分时,需要对其进行 URLEncode
处理富文本
处理富文本时应严格禁止“事件”。 过滤掉危险标签,最好采用白名单方式。
Cookie 设置 HttpOnly
Cookie 设置 HttpOnly 后,JS 脚本将无法获取该 Cookie 信息。 能有效避免 XSS 后的 Cookie 挟持攻击
Content-Security-Policy
增加 HTTP 响应头 Content-Security-Policy 限制 UA 能够为指定的页面加载哪些资源。
最后更新于