前置技能
1.什么是SQL注入 所謂SQL注入,就是通過把SQL命令插入到 Web表單提交 或 URL 或 頁面請求等的查詢字符串中,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令。 注:從這句話看出常見的注入點(diǎn)在 a. web表單 b. URL鏈接中 c. 登錄框(頁面請求查詢) 2.SQL注入原理 SQL注入(SQLInjection)是這樣一種漏洞:當(dāng)我們的Web app 在向后臺數(shù)據(jù)庫傳遞SQL語句進(jìn)行數(shù)據(jù)庫操作時(shí)。如果對用戶輸入的參數(shù)沒有經(jīng)過嚴(yán)格的過濾處理,那么攻擊者就可以構(gòu)造特殊的SQL語句,直接輸入數(shù)據(jù)庫引擎執(zhí)行,獲取或修改數(shù)據(jù)庫中的數(shù)據(jù)。 SQL注入漏洞的本質(zhì)是把用戶輸入的數(shù)據(jù)當(dāng)做代碼來執(zhí)行,違背了“數(shù)據(jù)與代碼分離”的原則。 SQL注入漏洞有兩個(gè)關(guān)鍵條件,理解這兩個(gè)條件可以幫助我們理解并防御SQL注入漏洞:
我們以DVWA漏洞演示環(huán)境舉列子 我們在輸入框中輸入1,點(diǎn)擊submit,頁面返回如圖紅框中數(shù)據(jù)。 這里有經(jīng)驗(yàn)的滲透老司機(jī)就知道,是web應(yīng)用查詢了數(shù)據(jù)庫,獲取了useid為1的數(shù)據(jù)。 這里我們大膽猜測一下這里的SQL語句長什么樣子呢 select Firstname, sunname from XXX where userid= 我們輸入的ID 當(dāng)我們在輸入框中輸入1時(shí)sql語句為: select Firstname, sunname from XXX where userid= '1' 由回顯數(shù)據(jù)我們得到Id為1的firstname,sunname的字段內(nèi)容 但是當(dāng)我們在輸入框中輸入如下內(nèi)容時(shí) 1' union select 1,database()%23(‘%23’為’#’的url編碼,’#’為mysql注釋符,注釋掉后面的語句) 此時(shí)執(zhí)行的數(shù)據(jù)庫命令是: select Firstname, sunname from XXX where userid= '1' union select 1,databsae()# 不僅可以得到id為1的firstname,sunname字段內(nèi)容,還可以得到當(dāng)前數(shù)據(jù)庫名 這樣如果攻擊者構(gòu)造更多的SQL語句,哪么數(shù)據(jù)庫里的信息都會被攻擊者得到,造成數(shù)據(jù)泄露。 3.SQL注入的產(chǎn)生
4.SQL注入的作用
5.常見的SQL注入分類 A.按照數(shù)據(jù)庫執(zhí)行結(jié)果是否顯示到頁面上分類 a.SQL回顯注入(數(shù)據(jù)庫的執(zhí)行結(jié)果直接顯示到頁面上) SQL回顯注入又可以分為: 01:union聯(lián)合查詢注入 02:報(bào)錯(cuò)注入 b.SQL盲住(不顯示到頁面上) SQL 盲住又可以分為: 01:布爾盲住 02:時(shí)間注入 B.按照注入點(diǎn)類型來分類
C.按照數(shù)據(jù)提交的方式來分類 這種分類其實(shí)只是 HTTP 傳遞數(shù)據(jù)的方式不同,嚴(yán)格來講和 SQL 沒多大關(guān)系,但是在編寫 PoC (漏洞驗(yàn)證程序)的時(shí)候,這會影響到我們的代碼中發(fā)送數(shù)據(jù)的形式,所以我在這里提出來了。
|
|