單字節字符集: 所有的字符都使用一個字節來表示,比如 ASCII 編碼。
多字節字符集: 在多字節字符集中,一部分字節用多個字節來表示,另一部分(可能沒有)用單個字節來表示。
UTF-8 編碼: 是一種編碼的編碼方式(多字節編碼),它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。
常見的寬字節: GB2312、GBK、GB18030、BIG5、Shift_JIS GB2312 不存在寬字節注入,可以收集存在寬字節注入的編碼。
前提條件
要有寬字節注入漏洞
1、首先要滿足目標程序使用雙/多字節字符集進行解析
2、其次不同字符集范圍不一樣,可能低位不包含單字節字符集的字符,這樣就沒辦法了,所以要保證在該種字符集范圍中包含低字節位,比如 0x5C(01011100) 的字符,即轉義符\。
寬字節帶來的安全問題主要是吃ascll字符(一個字節)的現象
下面就看個利用的例子
https://xxxxx?name=hello%27
name值會在js中,但是輸入的單引號被轉義了,沒辦法逃逸
然后翻看了下頁面源碼及請求頭,發現客戶端編碼是gbk
想必是寬字節注入了,嘗試輸入hello%df%27
沒錯了,就是寬字節了,console都報錯提示引號未閉合了,后面就是構造而外的js代碼,並把后面的對於字符注釋掉,讓語法正確