【web安全】第二弹:XSS攻防中的复合编码问题
最近一直在研究XSS的攻防,特别是dom xss,问题慢慢的迁移到浏览器编码解码顺序上去。
今儿被人放鸽子,无奈在KFC看了两个小时的资料,突然有种豁然开朗的感觉。
参考资料先贴出来:
1. http://www.freebuf.com/articles/web/43285.html
2. http://www.freebuf.com/articles/web/10121.html
3. http://www.wooyun.org/whitehats/%E5%BF%83%E4%BC%A4%E7%9A%84%E7%98%A6%E5%AD%90
4. 道哥:白帽子讲Web安全
5. 编码转换工具:http://app.baidu.com/app/enter?appid=280383
通常在XSS防御中,输出在HTML标签中或HTML属性中的情况最为常见,浏览器也只会进行HTML解码,只需要对输出进行HTML编码就可以解决XSS问题。但如果涉及输出在脚本或者URL中的时候就要进行其他方式的编码。本文的重点就是研究在复杂环境中输出变量的编码问题。
【基本知识----常见编码及起因】
HTML编码
在呈现HTML页面时,有时候需要显示一些特殊的字符,例如”<”和”&”,因为它们是HTML专用字符,需要通过一定的方式来实现,HTML编码由此诞生。HTML编码只是一种函数体现,用于将字符转换成HTML实体。例如想要显示<script>,在代码中需要写成“<script>“。为了防止XSS,至少要转换以下字符:
字符 |
HTML实体 |
< |
< |
> |
> |
‘ |
' |
“ |
" |
& |
& |
同时字符编码也是实现HTML编码的一种形式。十进制、十六进制ASCII码或unicode字符编码,样式为“&#数值;”。例如想要显示<script>,在代码中可以写成“<script>”或者“<script>”。
Javascript编码
JavascriptEncode可以采用跟HtmlEncode不同的编码方式,即使用“\”对特殊字符进行转义。也可以转换成对应的字符编码。js提供了四种字符编码的策略:
1、三个八进制数字,如果不够个数,前面补0,例如“e”编码为“\145”
2、两个十六进制数字,如果不够个数,前面补0,例如“e”编码为“\x65”
3、四个十六进制数字,如果不够个数,前面补0,例如“e”编码为“\u0065”
4、对于一些控制字符,使用特殊的C类型的转义风格(例如\n和\r)
URL编码
Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码。字符编码方式为:%号后面加上字符的十六进制来替换这些有冲突的字符,例如将空格替换为%20。
【浏览器解析原理】
浏览器在接收到一个HTML文件时,会从头开始对文档进行解析。遇到javascript时,会调用javascript解析器进行解析。遇到类似Onclick等需要触发才会执行的代码会跳过,事件被触发时才会被解析。
【实例一】
<a href="#" onclick="{$value}">天气不错</a>
浏览器解析时,onclick中的内容被当做HTML来解析。在点击链接之后,调用javascript解析器来解析$value。
所以解码的顺序:HTML解码->JavaScript解码。
所以正确的防御对策为:JavaScript编码->HTML编码。
【实例二】
<div id="bb"></div>
<script>
document.getElementById('bb').innerHTML="{$value}";
</script>
浏览器解析时,$value位于JavaScript中,先被Javascript解码。后$value被赋值到HTML中,进行HTML解码。
所以解码顺序为:JavaScript解码->HTML解码
所以正确的防御对策为:HTML编码->JavaScript编码
【实例三】
<td onclick=”openUrl(add.do?userName=’{$value}’);”>11</td>
浏览器解析时,$value位于Javascript中,但由于是在onclick中,所以先以HTML的身份被解码。被点击之后,先被JavaScript解码。由于$value还是URL的一部分,所以还会被URL解码。
所以解码顺序为:HTML解码->JavaScript解码->URL解码
所以正确的防御对策为:URL编码->JavaScript编码->HTML编码
【写在最后】
在编码不合理的情况下的绕过方法在参考资料里写的很清楚啦,这篇文章只是整理一下思路哈~
这几天尝试着去挖挖漏洞好啦~\(^o^)/~
【web安全】第二弹:XSS攻防中的复合编码问题的更多相关文章
- Kotlin 第二弹:Android 中 PDF 创建与渲染实践
这是 Kotlin 练习的的第二篇.这一篇的由来是因为刚刚在 Android 开发者官网查看 API 的时候,偶然看到了角落里面的 pdf 相关. 我仔细看看了详细文档,发现这个还蛮有意思的,关键是编 ...
- web前端-----第二弹CSS
web前端之CSS样式 CSS 语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. ''' selector { property: value; property: value; ...
- XSS 复合编码 续
对上文 [web安全]第二弹:XSS攻防中的复合编码问题 的一些补充,思路来源于:http://escape.alf.nu/3/ html解码的问题: 通过appendChild添加的节点,不会被HT ...
- 前端学习 第二弹: JavaScript中的一些函数与对象(1)
前端学习 第二弹: JavaScript中的一些函数与对象(1) 1.apply与call函数 每个函数都包含两个非继承而来的方法:apply()和call(). 他们的用途相同,都是在特定的作用域中 ...
- web攻击之一:XSS跨站脚本
一.浏览器安全 同源策略 影响源的因素:host,子域名,端口,协议 a.com通过以下代码: <script scr=http://b.com/b.js> 加载了b.com上的b.js, ...
- 使用 PHP 构建的 Web 应用如何避免 XSS 攻击
本文首先简单介绍开发测试人员如何对 Web 应用进行 XSS 漏洞测试,如何借助工具绕过客户端 JavaScript 校验输入恶意数据:然后针对使用 PHP 语言构建的 Web 站点,从在输出端对动态 ...
- 【web渗透技术】渗透攻防Web篇-SQL注入攻击初级
[web渗透技术]渗透攻防Web篇-SQL注入攻击初级 前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的S ...
- 浅谈Hybrid技术的设计与实现第二弹
前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...
- 青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)
继上一次介绍了<神奇的六边形>的完整游戏开发流程后(可点击这里查看),这次将为大家介绍另外一款魔性游戏<跳跃的方块>的完整开发流程. (点击图片可进入游戏体验) 因内容太多,为 ...
随机推荐
- Intent的介绍
一.Intent的介绍 Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作 的动作.动作涉及数据.附加数据进行描 ...
- 转--xcode duplicate symbol问题
遇到引用库重复定义的问题,需要解决. 项目需要,同时引用ZBar和QQ授权登录SDK,由于二者均使用了Base64处理数据,XCode编译时报错: duplicate symbol _base64 ...
- hadoop安装包的目录结构
初次接触Hadoop,了解了Hadoop安装包的目录结构,和大家分享下: bin:Hadoop最基本的管理脚本和使用脚本的目录,这些脚本是sbin目录下管理脚本的基础实现,用户可以直接使用这些脚本管理 ...
- Redis集群
一.Redis集群原理 集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规 ...
- javascript中substring和substr方法
1.substring 方法 定义:用于提取字符串中介于两个指定下标之间的字符 语法:stringObject.substring(start,stop) 参数描述: start 必需.一个非负的整数 ...
- http协议与内容压缩
为了加快网络上的传输的速度,可以将服务器传输的内容进行压缩,服务器的压缩方式有gzip压缩 deflate压缩 compress压缩 content-length:压缩后的长度 如何启动压缩功能 1, ...
- Sql的实际应用
sql实际应用-递归查询 1.既然要谈到sql,数据库表是必须的 2.数据结构 3.获取某个节点的所有子节点 传统的写法(sql2000) 很麻烦,暂且就不写了 来看看 ...
- c#结束winword.exe进程、
最近在做一个c#生成word的功能.调用了微软自带的COM组件. 生成完以后发现有一个winword.exe无法关闭.调试或修改代码都没有搞明白. 遂强制关闭进程了. System.Diagnost ...
- 常用ASP函数的封装
做ASP开发常常需要用到一些小功能,这些功能通常我们都会封装成函数来使用,本教程提供了许多我们经常用到的ASP函数. <% '所有功能函数名如下: ' StrLength(str) 取得字符串长 ...
- AppWidgetProvider生命周期
1.在桌面上添加小部件,让小部件可用会调用:onEnabled 2.作为通知会调用onReceive 3.小部件可用后会调用onUpdate,表明小部件状态由不可用变为可用发生了变化 4.作为通知又会 ...