常見編碼
文本編碼
常見的文本編碼方法有:ANSI(多字節(jié))的ASCII編碼怀大、GB2312、GBK潜慎、GB18030、UNICODE垒手。
我相信有不少人都搞不拎清這幾個編碼有什么區(qū)別倒信,這里就不講故事說這些網(wǎng)頁編碼的發(fā)展歷史了鳖悠,我們從下面這個維恩圖來解釋竞穷,這幾個編碼的區(qū)別瘾带。
字符編碼 | 包含內(nèi)容 |
---|---|
ASCII | 英文字符 |
GB2312 | 在ASCII編碼內(nèi)容的基礎(chǔ)上朴恳,增加了6k+的常用漢字 |
GBK | 在GB2312的基礎(chǔ)上于颖,增加了繁體字及其他各種漢字字符等 |
GB18030 | 在GBK的基礎(chǔ)上嚷兔,增加了少數(shù)民族語言系統(tǒng)中的字符 |
UNICODE | 包含了世界上任何一個文字和標(biāo)志 |
寬字節(jié)編碼
寬字節(jié)也叫多字節(jié)冒晰。英文字符大小為2個字節(jié)的叫寬字節(jié)同衣,相對的,英文字符大小為1個字節(jié)的叫窄字節(jié)壶运。
編譯器默認(rèn)的中文字符占2個字節(jié),英文字符占1個字節(jié)蒋情。
利用寬字節(jié)編碼的注入,是利用單字節(jié)字符(例如引號這種符號)占寬字節(jié)的低字節(jié)部分棵癣,只要在前面增加一個高字節(jié)辕翰,就會被組成合法字符狈谊,從而繞過限制金蜀。
具體的利用刷后,在后面寫到相關(guān)漏洞攻擊時具體寫。
字符集 | 高字節(jié)范圍 | 低字節(jié)范圍 |
---|---|---|
GB2312 | A1 - F9 | 40 - 7E尝胆、A1 - FE |
GBK | 81 - FE | 40 - EF |
GB18030字符集為多字節(jié)护桦,范圍為:1字節(jié)從00到7F; 2字節(jié)高字節(jié)從81到FE,低字節(jié)從40到7E和80到FE;4字節(jié)第一三字節(jié)從81到FE,第二四字節(jié)從30到39因妙。
UTF標(biāo)準(zhǔn)
UTF標(biāo)準(zhǔn)為面向傳輸?shù)臉?biāo)準(zhǔn)痰憎,解決了UNICODE如何在網(wǎng)絡(luò)上傳輸?shù)膯栴}。
顧名思義以故,UTF-8就是每次8個位傳輸數(shù)據(jù)蜗细,UTF-16就是每此16個位傳輸數(shù)據(jù)。在傳輸過程中怒详,從UNICODE到UTF時炉媒,需要通過一些算法和規(guī)則的轉(zhuǎn)換,并不是直接的對應(yīng)的昆烁。
文件BOM頭
為了避免在文本文件中輸入的字符與該應(yīng)用本身默認(rèn)的編碼方式不符吊骤,從而導(dǎo)致重新打開新建的文本文件時出現(xiàn)亂碼,微軟公司搞了個BOM頭的東西善玫。
它會在文件開始的地方插入三個不可見的字符(即BOM)水援,用于然后編輯器識別文件的正確編碼方式密强。
URL編碼
由于URL只能通過ASCII字符集在因特網(wǎng)進(jìn)行發(fā)送茅郎,所以必須將URL進(jìn)行URL編碼。
非ASCII字符使用"%"后跟兩位的十六進(jìn)制數(shù)來替換或渤,URL中的空格一般使用"+"來替換系冗。
HTML實(shí)體編碼
命名實(shí)體
格式: 以&
開頭,;
結(jié)尾薪鹦。例如惯豆,±
的命名實(shí)體為±
字符編碼
一般為十進(jìn)制、十六進(jìn)制楷兽、Unicode編碼等华临。
格式: 以&#
開頭芯杀,;
結(jié)尾。例如雅潭,≤
的十進(jìn)制字符編碼為≤
JS編碼
JS的四種字符編碼策略:
- 三個八進(jìn)制數(shù)字揭厚,如果不夠個數(shù)扶供,前面補(bǔ)0,例如“e”編碼為“\145”
- 兩個十六進(jìn)制數(shù)字椿浓,如果不夠個數(shù)太援,前面補(bǔ)0,例如“e”編碼為“\x65”
- 四個十六進(jìn)制數(shù)字轰绵,如果不夠個數(shù)粉寞,前面補(bǔ)0,例如“e”編碼為“\u0065”
- 對于一些控制字符唧垦,使用特殊的C類型的轉(zhuǎn)義風(fēng)格(例如\n和\r)
CSS編碼
格式: 以\
開頭液样,后跟1~6位的十六進(jìn)制數(shù)。例如鞭莽,e可以編碼為“\65”或“65”或“00065"。
復(fù)合編碼
就是一個語句中有多種編碼方式的內(nèi)容澎怒,在瀏覽器解析過程中,語句解析順序即從外向內(nèi)喷面。
例如語句:
<td onclick=”openUrl(add.do?userName=’<%=value%>’);”>點(diǎn)我呀</td>
最里面<%=value%>
在URL中出現(xiàn),第二層openUrl(add.do?userName=’<%=value%>’);
在JS中出現(xiàn)琳状,最外層是HTML中的一部分。所以在解碼時的順序應(yīng)為:HTML解碼→JS解碼→URL解碼念逞,編碼順序就是解碼順序的反一下。
以上編碼在XSS漏洞挖掘中非常的有用翎承,在其他注入攻擊中也會用到。在前端安全方面叨咖,編碼安全問題是很重要的,一開始覺得難沒關(guān)系仰剿,可以慢慢深入學(xué)習(xí)痴晦,畢竟一口吃不成胖子嘛~
在線編解碼工具: https://evilcos.me/lab/xssor/
序列化編碼問題
Java序列化問題
PHP序列化問題
Python序列化問題
因?yàn)榘仔∨智懊娴膬?nèi)容看著看著去看編碼繞過產(chǎn)生XSS了,所以后面序列化編碼問題來不及寫了誊酌。明天補(bǔ)上好啦~迫不及待想寫XSS系列2333