? ? ? ? 注入攻擊是web安全領(lǐng)域中一種最為常見的攻擊方式。注入攻擊的本質(zhì),,就是把用戶輸入的數(shù)據(jù)當(dāng)做代碼執(zhí)行,。這里有兩個關(guān)鍵條件,第一是用戶能夠控制輸入,,第二個就是原本程序要執(zhí)行的代碼,,將用戶輸入的數(shù)據(jù)進(jìn)行了拼接,所以防御的思想就是基于上述兩個條件,。 SQL注入第一次為公眾所知,是在1998年的著名黑客雜志<<>Phrack>上,,一位名叫rfp的黑客發(fā)表了一片題為“NT Web Technolog Vulnerabities”的文章,。 一個簡單的SQL注入的典型例子: var username;username=Request.form(username); var sql="select * from UserTable where name =' " username " ' "; 變量username為用戶所提交,正常情況下,,假如用戶輸入“XiaoMing”,,那么SQL語句會執(zhí)行: select * from UserTable where username='XiaoMing'; 若用戶輸入一段有特別含義的SQL語句,比如: XiaoMing' ;drop table UserTable-- 那么SQL語句在實際執(zhí)行時就會如下: select * from UserTable where username='XiaoMing';drop table UserTable--' 現(xiàn)在變成了查詢后,,再執(zhí)行一個drop表的操作,,而這個操作,,使用戶構(gòu)造了惡意數(shù)據(jù)的結(jié)果。 ? ? ? ? 在SQL注入的過程中,,如果網(wǎng)站的Web服務(wù)器開啟了消息回顯,,則可以根據(jù)回顯的錯誤消息,探測網(wǎng)站用的是什么數(shù)據(jù)庫,,例如:錯誤提示Microsoft.JET Database Engine錯誤,,則說明是通過JET引擎連接數(shù)據(jù)庫,表明數(shù)據(jù)庫為ACESS數(shù)據(jù)庫,,如果是ODBC的話,,則說明是MSSQL數(shù)據(jù)庫。 數(shù)據(jù)庫的判斷方法有很多,,這里大致說下我了解到的幾種方法思路,,不詳細(xì)展開。 第一種基于特定函數(shù):不同的數(shù)據(jù)庫對應(yīng)著的函數(shù)名稱不一樣,,如len()和length(),,@@version()和version()在MSSQL,Mysql數(shù)據(jù)庫中不一樣,,substring()和substr()在oracle和Mysql中不一樣 第二種基于輔助符號的判斷: “ / * ”是Mysql中的注釋符,。 “ --”是Oracle和MSSQL支持的注釋符,";"子查詢標(biāo)識符,,Oracle不支持多行查詢,。結(jié)合以上符合多種作何判斷。 第三種基于錯誤回顯信息判斷:針對數(shù)據(jù)庫引擎的判斷,。 盲注(Blind Injection) 在沒有回顯消息的時候,,可以進(jìn)行SQL盲注,最常見的盲注驗證方法就是構(gòu)造簡單的條件語句,,根據(jù)返回頁面是否發(fā)生改變,,來判斷SQL語句是否得到了執(zhí)行。 1.簡單的 and 1=1 和 and 1=2 例如攻擊者構(gòu)造如下條件的語句: http:///items.php?id=2 and 1=2 SQL語句由于“1=2”是個假命題,,所以攻擊者看到頁面將為空或者是一個出錯的頁面,。 為了進(jìn)一步確定注入是否存在,攻擊者必須再次驗證這個過程: http:///items.php?id=2 and 1=1 如果這個請求頁面正常返回了,,則說明SQL語句的"and"成功執(zhí)行,,那么就可以判斷“id”參數(shù)存在SQL注入漏洞了。 在這個攻擊過程中,,服務(wù)器雖然關(guān)閉了錯誤回顯,,但是通過攻擊者簡單的條件構(gòu)造,再對比返回結(jié)果的差異,就可以判斷出SQL注入漏洞是否存在,,這就是盲注的工作原理,。 Timing Attack(邊信道攻擊) 在Mysql中,有一個benchmark()函數(shù),,用來測試函數(shù)性能的,,benchmark(count,expr)函數(shù)的執(zhí)行結(jié)果就是將expr表達(dá)式執(zhí)行count次數(shù)。因此,,利用這個函數(shù),,可以讓同一個函數(shù)執(zhí)行若干次,使得結(jié)果返回時間比平時要長,;通過時間長短的變化,,可以判斷出注入語句是否執(zhí)行成功。這是一種邊信道攻擊,,這個技巧在盲注中稱為Timing Attack,。 接下來我們使用這種技巧完成攻擊,先構(gòu)造攻擊參數(shù)id值為: 2 UNION SELECT IF(SUBSTRING(cyurrent,1,1)=CHAR(119),BENCHMARK(5000000,ENCODE('MSG','by 5 seconds')),null)FROM(Select Database() as current) as tbl; 這段Payload判斷數(shù)據(jù)庫名的第一個字母是否為小寫的w,。如果判斷為真,,則會通過BENCHMARK()函數(shù)造成較長的時延;如果不為真,,則該語句將很快執(zhí)行完,。攻擊者遍歷所有字母,直到將整個數(shù)據(jù)庫名稱全部驗證完成為止,。與此相似的還可以通過以下函數(shù)獲得一些額外信息: database():當(dāng)前連接的數(shù)據(jù)庫名稱 system_user():數(shù)據(jù)庫的系統(tǒng)用戶 current_user():登錄到數(shù)據(jù)庫的當(dāng)前用戶 last_insert_id():最后一次進(jìn)行插入操作數(shù)據(jù)庫的事務(wù)id 若當(dāng)前數(shù)據(jù)庫用戶(current_user)有寫權(quán)限,。可以將信息寫入本地磁盤中,。比如寫入web目錄中,,攻擊者就可以下載這些文件: 2 Union All SELECT * FROM information_schema.tables where table_schema='mysql' ORDER BY table_name DESC INTO OUTFILE '/path/location/on/server/www/schema.txt ' 或者是寫入一個webshell: 2 Union All SELECT "<? system($_REQUEST['cmd']); ?>" ,2,3,4 INTO OUTFILE "var/www/html/temp/c.php" -- 在不同數(shù)據(jù)庫中,有著類似benchmark()函數(shù),,可以被Timing Attack利用,。例如: MySql數(shù)據(jù)庫中的 benchmark(1000000,expr)和sleep(5) PostgreSQL數(shù)據(jù)庫中的PG_SLEEP(5)和GENERATE_SERIES(1,1000000) MSSQL Server中的 WAITFOR DELAY '0:0:5'? ? 來源:http://www./content-2-47701.html |
|