250 likes | 497 Views
客户端消灭XSS攻击. 王智勇. XSS 攻击可以用来做什么?. 突破浏览器的域限制. 360, 傲游等浏览器的命令执行. Xss 蠕虫攻击. 用户信息. XSS. 私密信息:日志,相片,邮件. 管理信息. DDoS 攻击. 后台地址,管理员帐号信息 甚至直接通过 Ajax 上传 Shell. 客户端信息. 针对浏览器缺陷实施攻击. 传统的服务端xss防御. 常见XSS利用方法 1. </script> 或者</style>de等标签闭合当前脚本,然后输入自定义内容。 2.根据 JS 或css上下文,构造正确的闭合。. 3.利用浏览器解析bug.
E N D
客户端消灭XSS攻击 王智勇
XSS攻击可以用来做什么? 突破浏览器的域限制 360, 傲游等浏览器的命令执行 Xss蠕虫攻击 用户信息 XSS 私密信息:日志,相片,邮件 管理信息 DDoS攻击 后台地址,管理员帐号信息 甚至直接通过Ajax上传Shell 客户端信息 针对浏览器缺陷实施攻击
传统的服务端xss防御 • 常见XSS利用方法 • 1.</script>或者</style>de等标签闭合当前脚本,然后输入自定义内容。 • 2.根据JS或css上下文,构造正确的闭合。 3.利用浏览器解析bug
传统的服务端xss防御 • 输入过滤: • 过滤关键字script,alert,document.cookie • 过滤特殊字符/\'"<>\u%0a等 • 长度限制,内容限制 • 净化输出: • 对输出内容做html编码等
传统的服务端xss防御 • 缺陷: • 1.易被绕过: • 新的与废弃标签(html5) • 多种编码(unescape,base64,url,html实体编码) • 提交位置不同(url,post(两种),refer,ua) • 浏览器缺陷(差异性与解析bug) • 2.对基于dom的xss攻击无能为力
基于客户端的xss防御 • 思考: • xss(csrf)的原理: • 攻击客户端,在客户端执行恶意脚本 • 防御方法: • 在恶意脚本执行前,执行基于防御的脚本,来阻止恶意脚本执行。
基于客户端的xss防御 • 思路: • Preventing XSS with Data Binding by Stefano Di Paola 2006 (数据绑定) • ACS By Eduardo Vela 2009(动态内容签名,沙箱) • Locking the Throne Room 2011 (利用ECMAScript5来锁定对特殊内容或对象的访问权限) • JSReg (Javascript解析) • JSLR 2012(为标签与属性添加随机Token)
基于客户端的xss防御 • 思想: • 使浏览器了解哪些内容是正常的,来自于应用程序生成 • 哪些内容是有害的,在生成新的页面前消除,并阻止恶意脚本访问某些敏感对象。 • 关键技术点: • <plaintext>标签:使html渲染无效化 • onload或DOMContentLoaded:在dom加载事件发生后执行基于防护的脚本 • 解析DOM • 对DOM元素进行过滤和重组,净化恶意脚本内容
基于客户端的xss防御 • 参数绑定: • 在<plaintext>标签下保存所提交的参数名值对 • 在DOM加载完成后立即调用该事件处理器,将危险标签元素与文本元素内容送到指定文件进行解析处理,最后将净化后的内容返回给浏览器。
基于客户端的xss防御 • ACS(Active Content Signatures) • 三类沙箱 • JSReg • HTMLParser • CSSParser
基于客户端的xss防御 • 优势: • 易于部署,不需要客户端安装额外插件等 • 以下为在mod_security中添加针对ACS的支持 • SecContentInjection On • SecRule RESPONSE_CONTENT_TYPE "^text/html" "phase:4,t:none,nolog,prepend:'<html><head><script type=\"text/javascript\" src=\"/acs.js\"></script><script type=\"text/javascript\" src=\"/xss.js\"></script>'" • 功能强大: • ACS2.0添加了白名单,强制加密等功能
基于客户端的xss防御 • Locking_the_throneroom • 利用DOM,通过重载javascript的函数来阻止访问危险对象 • __defineGetter__() • <script> • document.__defineGetter__('cookie',function(){ • alert('no cookie access'); • return false; • }) </scirpt> ... <script>alert(document.cookie)</script>
基于客户端的xss防御 • 问题: • IE不支持 • 可以简单bypass(delete操作符,同样被重载等) • Bypass: • <script> • delete document.cookie; • alert(docment.cookie); </scirpt>
基于客户端的xss防御 • 利用ECMA Script5 • 对象扩展: • Object.freeze()//使得所有属性变成只读,同时防止新添属性或删除属性 • Object.seal() //对象现在有seal()方法(防止添加新的属性和删除既有属性) • Object.defineProperty()/Object.defineProperties() • Object.preventExtensions()//组织向对象添加新的原型属性 • <script> • Object.defineProperty(document,'cookie',{ • get:function(){return false} • set:function(){return false} • configurable:false}) </scirpt>
基于客户端的xss防御 • 优势: • 阻止cookie或其他对象调用 • 阻止方法调用 • 比delete优先级更高 • 重定义不起作用 • Components.lookupMethod()不起作用 • 可以添加get,set访问日志 • 应用于存在的HTML元素 • 没有误报
基于客户端的xss防御 • 缺陷: • 影响已存在的javascript程序 • 影响第三方应用 • 不能智能匹配
基于客户端的xss防御 • JSLR • 通过随机化标签与属性节点来阻止黑客注入恶意代码。 • 原理: • 向JSLR脚本传入三个随机token,分别为标签id,单引号id和双引号id。 • 如果标签或属性中不存在随机token,则忽略。 • 移除属性中所有单引号和双引号,只有两个单引号或双引号id之间的内容才会被执行
基于客户端的xss防御 • 模板代码: • <iframe <?php echo $JSLR->id?>_src="http://www.microsoft.com/"></iframe> • 实际生成代码: • <iframe c886c4256f0cd99c99bb4256dc85c53257d2_src="http://www.microsoft.com/"></iframe> • JSLR会查找所有的标签和属性,如果黑客注入如下代码:<iframe src=javascript:alert(1)></iframe>,JSLR会忽略标签内的内容,新的DOM元素变成<iframe></iframe>
基于客户端的xss防御 • 防御DOM XSS • 防御代码: • <script <?php echo $JSLR->id?>_=1>x='<?php echo $JSLR->singleQuote?><?php echo $_GET['dom']?><?php echo $JSLR->singleQuote?>';</script> • 生成代码: • <script>x=’randomtoken ATTACKER CONTROLLED VALUE randomtoken’</script> • JSLR首先移除属性中所有引号,之后执行随机token内的代码
基于客户端的xss防御 • 限制: • 需要浏览器支持DOMContentLoaded事件。 • 在JSLR脚本运行之前的注入代码可能执行 • 某些DOM XSS攻击例如location.hash, location.search结合document.write/innerHTML可能bypass • 改进:加入针对()的随机token,这样可以防止inline脚本直接调用类似document.write,getAttribute()等函数
基于客户端的xss防御 综述: 1.服务端的防护策略是基础 2.ACS可以与WAF类产品配合使用,但是由于源码是不变的,所以扫描器仍然会大量报警 3.JSLR添加新的token,需要模板支持,易于实现 4.利用ECMA Script5来提高安全性