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