Web常用编码以及攻击绕过笔记
2017-07-25 10:08
253 查看
一、URL编码
形式:“%”加上ASCII码(先将字符转换为两位ASCII码,再转为16进制),其中加号“+”在URL编码中和“%20”表示一样,均为空格。当遇到非ASCII码表示的字符时,如中文,浏览器或通过编写URLEncode,根据UTF-8、GBK等编码16进制形式,进行转换。如“春”的UTF-8编码为E6 98 A5,因此其在支持UTF-8的情况下,URL编码为%E6%98%A5。值得注意的是采取不同的中文编码,会有不同的URL编码。
在URL传递到后台时,首先web容器会自动先对URL进行解析。容器解码时,会根据设置(如jsp中,会使用request.setCharacterEncoding("UTF-8")),采用UTF-8或GBK等其中一种编码进行解析。这时,程序无需自己再次解码,便可以获取参数(如使用request.getParameter(paramName))。
但是,有时从客户端提交的URL无法确定是何种编码,如果服务器选择的编码方式不匹配,则会造成中文乱码。为了解决这个问题,便出现了二次URLEncode的方法。在客户端对URL进行两次URLEncode,这样类似上文提到的%E6%98%A5则会编码为%25e6%2598%25a5,为纯ASCII码。Web容器在接到URL后,自动解析一次,因为不管容器使用何种编码进行解析,都支持ASCII码,不会出错。然后在通过编写程序对
4000
容器解析后的参数进行解码,便可正确得到参数。在这里,客户端的第一次编码,以及服务端的第二次解码,均是由程序员自己设定的,是可控的,可知的。
绕过:
有些waf并未对参数进行解码,而后面程序处理业务时会进行解码,因此可以通过二次url编码绕过。例如:
%253cscript%253ealert(1)%253c%252fscript%253e
二、Unicode编码
形式:“\u”或者是“%u”加上4位16进制Unicode码值。Unicode编码可以在js中先被解析,再作为命令执行,而在html上下文中,unicode不会被解析,会直接作为字符串输出。
绕过:
(1)JavaScript的String.fromCharCode(numX),其中numX为Unicode值(十进制),此方法需和eval联合使用。例如:
<script>eval(String.fromCharCode(97,108,101,114,116,40,49,41))</script>
(2)<script>标签中,可以直接先将\u转换为代码,再执行,例如:
<script>\u0061\u006C\u0065\u0072\u0074(1)</script>
三、HTML编码
形式:“”加上十进制、16进制的ASCII码或Unicode编码。浏览器在根据HTML对网页进行渲染时,会先对html编码进行解析,然后再进行渲染,但是该html编码需在“值”当中,比如src属性的值,可用html表示,浏览器会正确解析,但如果src本身使用html编码,则会渲染出错。
绕过:
将属性值,用html编码表示,例如:
<img src=#onerror="alert(2)">
相关文章推荐
- 浅谈常用的几种web攻击方式以及解决办法
- Web入侵安全测试与对策学习笔记之(三)——攻击客户机之绕过对输入选项的限制
- 浅谈常用的几种web攻击方式以及解决办法
- WEB常用攻击手段以及解决办法脑图
- j2me常用的字符,日期,以及转换编码实现
- 黑客常用的攻击方法以及防范办法
- 浅谈常用的几种web攻击方式
- springboot学习笔记-2 一些常用的配置以及整合mybatis
- android 国际区号注册手机号编码 以及常用城市列表
- AJAX笔记一创建XMLHttpRequest对象,以及XMLHttpRequest对象的常用属性
- nginx的web目录下处理中文文件和文件夹以及编码格式问题
- myeclipse的java web项目设置编码方式以及utf-8还是乱码问题
- CSRF学习笔记之CSRF的攻击与防御以及审计【00x1 】
- Android笔记---常用控件以及用法
- Web框架和前端框架以及Ajax的常用框架易混淆(混为一谈)
- web中的cookies以及作用--web testing 学习笔记
- 【Web前端学习笔记】Javascript_02_运算符,控制语句,常用语句,函数定义
- 汇编debug中的常用指令,以及一些常用寄存器的使用方法整理,仅一些笔记,不喜勿喷
- WKWebView 获取标题+进度条+常用代理方法以及native兼容处理
- 【linux学习笔记之一】linux系统目录结构以及常用系统命令