xss attack

Cross Site Script

页面被注入恶意代码
-

  • 通常页面中包含的用户输入内容都在固定的容器或属性内,以文本的形式展示
  • 攻击者利用这些页面的用户输入片段拼接特殊格式的字符串,突破原有位置的限制
  • 攻击者通过在目标网站上注入脚本,使之在用户的浏览器上运行,从而引发潜在风险。
  • 通过HTML 转义可以防止xss攻击(并没有如此easy),因为不仅仅是特殊字符,就是JavaScript的字符串如果出现在特定的位置也会引发xss攻击。
  • 对于链接跳转,如 <a href=”xxx” 或者localtion.href=”xxx”.要检验其内容,禁止以JavaScript:开头的链接,和其他非法的scheme

    allowSchemes =["http","https"];
    valid = isValid(getParameter("redirect_to"),allowSchemes);
    if (valid){
        <a href="<%= escapeHTML(getParameter("redirect_to"))%>">
            跳转...
        </a>
        }else{
            <a href="/404">
            </a>
        }
    
  • 当JSON中包含U+2020或者U+2020这两个字符时,不能作为Javascript的字面量使用,否则会抛出语法错误

  • 当JSON中包含字符</script>时,当前的script标签将会被闭合,后面的字符串内容浏览器会按照HTML进行解析,通过增加下一个<script>标签等方法完成注入。

    漏洞总结

  • 在HTML中内嵌的文本中,恶意内容以script标签形成注入
  • 在内联的JavaScript中,拼接的数据突破原本的限制(字符串,变量,方法名等);
  • 在标签属性中,恶意内容包括引导,从而突破属性值的限制,注入其他属性或者标签
  • 在标签的href,scr等属性中,包含javascript:等可执行代码
  • 在onload,onerror,onclick等事件中,注入不受控制代码
  • 在style属性和标签中,包含类似background-image:url(“JavaScript:…”)的代码(新版本浏览器已经可以防范)
  • 在style属性和标签中,包含类似expression(…)的CSS表达式

换句话说,如果开发者没有将用户输入的文本进行合适的过滤就贸然插入到HTML中,就很容易造成注入漏洞
cross site scripting,为了和CSS区别,就把攻击的第一个字母改成了X。
在处理输入时,以下内容都不可信

  • 来自用户的UGC信息
  • 来自第三方的链接
  • URL参数
  • post参数
  • refere
  • cookies

XSS分类:可分为 存储性,反射性和DOM型三种

存储性常用于用户保持数据的网站功能:论坛发帖,商品评论,用户私信等。

反射性常见于URL传递参数的,比如网站搜索和跳转, POST 内容也可以触发反射性XSS。

DOM型XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端JavaScript漏洞,而反射性和存储性属于服务器端的安全漏洞。

XSS攻击的预防
XSS攻击的两大要素:来自攻击者提交恶意代码和浏览器提交恶意代码
所以:防止HMTL中出现注入, 防止JavaScript执行时,执行恶意代码

方法
-

  • 纯前端渲染:
  • 1.浏览器先加载一个静态HTML,此HTML中不包含任何与业务相关的数据
  • 2.浏览器执行HTML中的JavaScript
  • 3.JavaScript通过Ajax加载业务数据,调用DOM API更新到页面上
  • 转义HTML
  • 如果拼接HTML是必要的,就需要采用合适的转义库,对HTML末班各处插入点进行充分的转义。常用的模板引擎 doT.js、ejs、FreeMarker
  • DOM 中的内联事件监听器,location,onclick,onerror,onload,onmouseover等,set