**编码之详细剖析**
Unicode编码 ISO(国际标准化组织)指定包括地球上所有文化、所有字母和符号的编码,使用两个字节表示一个字符,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
具体存储就由:UTF-8、UTF-16等实现。
Unicode编码我们就简单称其为JavaScript编码。
&#x、\u都可以用来表示一串Unicode编码。(可以记住这种标识) 以下我用"test"这个单词来举例编码(我在后面备注了是哪种编码):
\u0074\u0065\u0073\u0074 (Javascript编码也是Unicode编码) t e s t (Javascript编码也是Unicode编码) t e s t (Javascript编码也是Unicode编码) t e s t(HTML实体编码) %74%65%73%74 (URL编码)
第一、二、三个都有&#x、\u这种相关字,所以就是Javascript编码,也是Unicode编码。而第四个一般是做XSS脚本容易被实体编码防止XSS攻击,举例:alert(1),这样一个弹窗js如果被实体编码,左尖括号和右尖括号都会被编码成<、&rt。最后一个比较常见,地址栏中发起请求时,url会被编码,做过sql注入就知道。
接下来详细说一下各种解码: HTML解码 以javascript:alert(1)为例子: 1.未编码:可以弹窗。 2.href中的r进行编码:不会弹出,变成文本文档。(因为这种编码会整个格式的一个解析,导致解析器没办法构建自己的DOM树,没办法编码解析。) 3.javascript中r进行编码:可以弹窗。 4.alert(1)中的r进行编码:可以弹窗。
小结:1,4可以解析,2不可以;所以当1方法被网站waf拦截,可以尝试用4这种方法进行绕过。
URL解码: 同样以javascript:alert(1)为例子: 1.未编码:可以弹窗 2.href中的r进行编码:不可以弹窗。(URL编码破坏了DOM树结构) 3.javascript中r进行编码:不可以弹窗。(URL编码破坏了协议类型) 4.alert(1)中的r进行编码:可以弹窗。
JavaScript编码: 同样以javascript:alert(1)为例子: 1.未编码:可以弹窗 2.href中的r进行编码:不可以弹窗。(DOM树结构被JS编码破坏) 3.javascript中r进行编码:不可以弹窗。(协议类型被JS破坏了) 4.alert(1)中的r进行编码:可以弹窗。 5.alert(1)中的(进行编码:不可以弹窗。(不能对控制字符编码)
在了解了以上三种基础编码之后,得出非常重要的知识点结论: 解码顺序是:JS<URL<HTML 也就是说最先进行HTML解码,再URL解码,最后是JS解码。 原理:当浏览器接收到一个 HTML文档的时候,他要先解析文档本身,然后去构建自己的DOM树结构,构建好之后,对内容第一次解析,解析肯定围绕HTML文档本身展开的,解析HTML编码成功之后,再去解析各个标签的属性,比如a标签,img标签等。这些标签内部可能它有属性是url属性的,这时候会尝试url解码,url里面可能会有伪协议,他最后去执行一个伪协议的解码。所以解码顺序就出来了。
有了上面的理解,接下来说一下二层混淆编码: 同样对于javascript:alert(1): 1.alert(1)中的r进行js编码,后url编码:可以弹窗 2.alert(1)中的r进行js编码,后html编码:可以弹窗 3.alert(1)中的r进行url编码,后html编码:可以弹窗
原理:根据解码顺序:JS<URL<HTML,第一个没有HTML编码,只有js和url,先对js编码,再url编码,刚好和解码顺序相反。符合,所以可以弹窗。同理二和三都可以。
最后,来一下三层混淆解码: 同样对于javascript:alert(1): alert(1)中的r进行js编码,后url编码,再html编码:可以弹窗。 原理:编码顺序和解码顺序刚好相反。
最后来做个练习题: %5Cu006a%5Cu0061%5Cu0076%5Cu0061%5Cu0073%5Cu0063%5Cu0072%5Cu0069%5Cu0070%5Cu0074%5Cu0028%5Cu0032%5Cu0033%5Cu0032%5Cu0033%5Cu0029 将以上编码还原出来: 我们依次做解码,按照解码顺序:JS<URL<HTML。(可以在线搜索网站加解码) 先进行HTML解码: %5Cu006a%5Cu0061%5Cu0076%5Cu0061%5Cu0073%5Cu0063%5Cu0072%5Cu0069%5Cu0070%5Cu0074%5Cu0028%5Cu0032%5Cu0033%5Cu0032%5Cu0033%5Cu0029 再进行URL解码: \u006a\u0061\u0076\u0061\u0073\u0063\u0072\u0069\u0070\u0074\u0028\u0032\u0033\u0032\u0033\u0029 在进行JS解码,也就是Unicode解码: javascript(2323) 完毕!
|