寬字節注入
mysql_query("SET NAMES 'gbk'");//設置字符集編碼,對數據庫執行以後的結果進行某種編碼(gbk)而後傳遞給用戶,返回gdk編碼的結果
mysql_set_charset("GBK");//設置字符集編碼,規定當與數據庫服務器進行數據傳送時要使用的默認字符集
mysql_real_escape_string()對參數進行過濾轉移,其相似功能的函數
GBK編碼,針對漢字的一種編碼方式,使用兩個字節編碼一個漢字
漏洞造成原理:對數據庫執行以後的結果進行gbk編碼+執行過濾函數對用戶提交的數據進行過濾=寬字節
測試步驟:
step1:訪問站點../gbksql/01/?id=1'查看返回結果:select* from news where tid='1\",執行結果不受影響
step2:../?id=1%df(爲啥使用df?高位在81之後就能用,81~fe)1%df--->1%df-->
step3:測試sql注入的位置
PDO寬字節注入:
pdo:鏈接數據庫-》設置模板
$id=addslashes($id);
$conn=new PDO("mysql:host=localhost;dbname=dvwa;chartset=utf-8;port=3306","root","root") or die("error");
$conn->exec("set names 'GBK'");
$result_sql=$conn->prepare("select * from users where user_id=?");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
二次編碼注入:瀏覽器會對from提交的數據處理以後進行urldecode
1%25%27
進入後端php第一次解析爲1%27
處理數據
以後由於程序編寫的問題又進行了urldecode
變成1'