數據庫使用gbk編碼的時候,會將兩個字符合並成一個中文。
寫在前面吧,對php的代碼審計也會有幫助
直接使用 set character_set_client=gbk 或者是常見的mysql_query("SET NAMES gbk");
都會存在款字節注入。
官方推薦使用Mysql_set_charset('gbk','$conn'),但是也不是完全就沒有問題了
推薦使用mysql_query("SET NAMES gbk");
后set character_set_client=binary。
第三十二關:
這關是寬字節注入漏洞,特殊值字符如單引號都會被轉義 ' -> \'
原理我有點說不清楚:通常來說,一個gbk編碼漢字,占用2個字節。一個utf-8編碼的漢字,占用3個字節。在php中,我們可以通過輸出echo strlen("中");頁面編碼為gbk時輸入2,utf-8時輸入3;mysql在使用GBK編碼的時候,會認為兩個字符為一個漢字,例如%df%5c就是一個漢字(前一個ascii碼大於128才能到漢字的范圍)。我們在過濾 ' 的時候,往往利用的思路是將 ' 轉換為 \' 。所以如果我們輸入%df%27(%27就是單引符號會被轉義成\' 也就是%5c%27),在后台%df會將%5c“吃掉”,組成一個漢字(%df%5c是一個漢字)。
輸入?id=1%df%27,頁面會報錯說明單引符號起作用了。
輸入?id=%df%27 union select 1,2,3 %23
第三十三關:
后台使用的addslashes()做的過濾,繞過手法和上面完全一樣
第三十四關:
和第三十三關一樣,只是將get請求換成了post請求。
第三十五關:
連引號都不需要用了,直接聯合注入就好,不知道這關為什么要這樣,沒摸清用意。
第三十六關:
使用的是mysql_real_eacape_string(),會比addslashes多過濾些東西
還是可以使用寬字節注入。
第三十七關:
將第三十六關的get請求轉成了post請求。