前言:
SQL注入漏洞從1998年圣誕節(jié)大火以來,長盛不衰,雖然開發(fā)人員想出各種方法對它進(jìn)行圍追堵截,卻始終不能趕盡殺絕。這一系列的文章會從最基本的東西開始,為大家剖析SQL注入,從動態(tài)網(wǎng)站架構(gòu)開始,借助源代碼,講解注入原理。逐步講解各種數(shù)據(jù)庫的注入語句(包括access,mysql,sqlserver,oracle,postgresql),再到各種注入技巧(HTTP頭注入,偽靜態(tài)注入,Base64注入,偏移注入(包括多級偏移注入),盲注,注入中轉(zhuǎn)等等),再差一足不同的類型注入(cookie注入,POST注入),最后介紹各種注入工具的使用(SQLMAP,穿山甲,胡蘿卜)最后的最后說一下注入的挖掘(注意,這是一個很長的故事,主要是筆者在學(xué)習(xí)過程當(dāng)中作為總結(jié),復(fù)習(xí)用途。所以內(nèi)容也是多方參考,如果侵犯到您的權(quán)益,請聯(lián)系我進(jìn)行刪除。PS:何處是參考內(nèi)容我會標(biāo)注)
0x1動靜態(tài)網(wǎng)站架構(gòu)(注入產(chǎn)生的條件)
說到注入,就難以避免一個問題:“任何網(wǎng)站都存在注入嗎?”答案是否定的,我們都知道,靜態(tài)網(wǎng)站是不存在注入的,那么,為什么呢?我們不妨從動靜態(tài)網(wǎng)站的架構(gòu)來分析一下。
下圖是筆者鼠繪的兩張架構(gòu)圖。


不難看出,當(dāng)用戶瀏覽靜態(tài)網(wǎng)站和動態(tài)網(wǎng)站時,靜態(tài)網(wǎng)站背后的故事要簡單很多,而我們的SQL注入,就產(chǎn)生在用戶發(fā)送http請求這一過程當(dāng)中,該http請求中包含了惡意語句,服務(wù)器卻將它編譯執(zhí)行,web服務(wù)器再將它交給數(shù)據(jù)庫處理,結(jié)果就非常糟糕了。好好品味一下這一過程,就出現(xiàn)了SQL注入產(chǎn)生的條件。
1、必須是動態(tài)網(wǎng)站
2、執(zhí)行的語句必須是可控的
下面,我們借助代碼做一個更加深入的分析。
下面是一個php腳本文件的源代碼:
$con =mysql_connect('127.0.0.1','root','root');//連接數(shù)據(jù)庫
$id = GET_['id'];
mysql_select_db('數(shù)據(jù)庫名',$con);//mysq_select_db函數(shù)指定查詢的數(shù)據(jù)庫
$sql = "select * from 表名 where id=$id";//用一個變量來存放查詢的SQL語句。
echo mysql_result(mysql_query($sql),0,'username');
從攻擊者的角度來看,發(fā)生了下面幾件事,通過url(也就是發(fā)送http請求)為變量id以get方式傳入?yún)?shù)值,拼接SQL語句,代入數(shù)據(jù)庫執(zhí)行。如果攻擊者傳入惡意的語句,那么很不幸,直接帶入數(shù)據(jù)庫執(zhí)行了,it’s
terrible!
這一節(jié)我們介紹了注入攻擊發(fā)生的過程,相信大家也想明白了,注入語句本質(zhì)上就是數(shù)據(jù)庫語句,所以,我們下面依次說明不同數(shù)據(jù)庫的注入方式。