一、SQL Inject 漏洞原理概述
1.1 什么是數據庫注入漏洞
數據庫注入漏洞,主要是開發人員在構建代碼的時候,沒有對用戶輸入的值的邊界進行安全的考慮,導致攻擊者可以通過合法的輸入點提交一些精心構造的語句,從而欺騙后台數據庫對其進行執行,導致數據庫信息泄漏的一種漏洞。
1.2 SQL Inject漏洞的攻擊流程
(1)第一步:注入點檢測
自動方式:使用web漏洞掃描工具,自動進行注入點發現
手動方式:手工構造SQL Inject測試語句進行注入點發現
(2)第二步:信息獲取-通過注入點取期望得到的數據
環境信息:數據庫的類型、版本,操作系統的版本,用戶信息等;
數據庫信息:數據庫名稱,表,字段,字段內容(加密內容的破解)
(3)第三步:獲取權限
獲取操作系統的權限,通過數據庫執行shell,上傳木馬程序。
1.3注入點類型及常見注入類型講解
(1)數字型:user_id=$id
(2)字符型:user_id='$id'
(3)搜索型:text LIKE '%{$_GET['search']}%'"
1.4 演示:SQL Inject-數字型注入
1、來到pikachu平台數字型注入(post)模塊,先測試一下頁面的功能,我們在下拉框內選擇1,點擊查詢。
2、我們猜想整個頁面的邏輯是什么樣的?
3、我們可以通過PHP Study 打開我們的數據庫終端。執行命令:show databases;
顯示我們所有的數據庫。
4、在數據庫命令行工具內執行:show tables;查看pikachu數據庫內的所有表
5、在命令內執行:select username,email from member where id=1; 查詢id=1的用戶名和對應的郵箱。
6、通過上邊在命令行里邊的一同操作,我們猜想:如果系統后台正如我們所想象一樣,將獲取的id的值直接拼接到查詢語句后邊而不加處理,那么我們是不是可以通過抓包、數據重放的方式獲取所有的用戶名和對應的郵箱?下邊我們先去看一下后台代碼。
7、我們先打開burp suite,然后選擇一次id值,查詢。將抓到的數據包發送到重放模塊。
1.5 演示:SQL Inject-字符型注入
1、來到pikachu平台字符型注入(get)模塊,我們先看一下整個模塊的功能。
2、現在我們猜想一下后台的處理邏輯。
3、現在我們構造閉合語句
lucy' or 1=1-- '
首先在lucy后邊加一個單引號進行閉合,然后加上or 1=1,后邊的單引號我們用注釋符—注釋掉。
4、將構造語句復制到查詢框,點擊查詢。就會拿到我們所有的信息。
5、最后我們來看一下代碼
1.6 演示:SQL Inject-搜索型注入
1、我們先來看源碼
2、將構造語句填入搜索框
1.7 演示:SQL Inject-xx型注入
1、我們來看源碼:
2、將構造的源碼輸入到查詢框
1.8 總結
到現在為止,可能會有人疑問,我們做的演示都是在知道源碼的情況下構造語句,那么在真實的環境里我們是不知道源碼的,那么我們該如何構造語句呢?
-
第一種是我們可以根據報錯的辦法,例如:lucy',如果這個時候報錯,說明存在單引號包裹;
-
第二種是我們可以利用and or 等,判定我們的構造語句是否參與了運算。
-
總之,還是要有經驗,這個是一個積累的過程~~大家加油!
二、注入方式get&post的區別
GET方式中使用URL提交注入數據;
POST方式中使用抓包工具修改POST數據部分提交注入。
不管是GET還是POST,都有可能出現SQL注入漏洞,本質上是一樣的!
三、SQL Inject漏洞手工測試
3.1 基於union聯合查詢的信息獲取(select)
1、我們使用pikachu的字符型注入模塊。
首先使用構造語句:lucy' order by [number]判斷表存在幾列。
2、然后使用union關鍵字查詢信息
說明:user() database() 都是SQL語句里邊的函數,具體的講解可以參考我的關於sqli-libs 的博客。在這里我就不多說了。
3.2基於報錯的信息獲取(select/delete/update/insert)
由於我在我關於sqli-labs的博客中對報錯查詢做了詳細的講解。這里只是粗略的講一下,如想深層次了解,請移步我的關於sqli-labs的博客。
在MYSQL中使用一些指定的函數來制造報錯,從而從報錯信息中獲取設定的信息。常用的報錯函數有:
updatexml():對XML文檔數據進行查詢和修改的XPATH函數
extractvalue():對XML文檔數據進行查詢的XPATH函數
floor():用來取整的函數
注意:select/insert/update/delete都可以使用報錯來獲取信息。
條件:后台沒有屏蔽數據庫的報錯,在語法發生錯誤時會輸出在前端。
我們同樣利用字符型注入(get)來進行演示
(1)、select 語句:
(2)、insert 語句
構造語句:xxx' or updatexml(1,concat(0x7e,database()),0) or '
(3)、update 語句:
和insert是一模一樣的,大家可以試一下。
(4)、delete語句:
構造閉合語句:1 or updatexml(1,concat(0x7e,database()),0)
3.3操作系統權限獲取
這里我們講"一句話木馬"這個概念
1、一句話木馬是一種短小而精悍的木馬客戶端,隱蔽性好,且功能強大
2、我們可以通過SQL注入漏洞寫入惡意代碼
例如我們結合into outfile向后台寫入:select 1,2 into outfile "/var/www/html/1.txt"
3、寫入的前提條件:
(1)需要知道遠程目錄,我們作為測試者是一開始是不知道的
(2)需要走遠程目錄有寫入的權限
(3)需要數據庫開啟了secure_file_priv
4、請看到這里的童鞋移步我的關於sqli-labs的博客,對於一句話配合中國菜刀工具控制操作系統有着詳細的介紹。
四、SQL注入漏洞-盲注
在有些情況下,后台使用了錯誤消息屏蔽的方法(例如@)屏蔽了報錯,那么此時無法再根據報錯信息進行注入的判斷。
這種情況下的注入,稱為"盲注"。
4.1(boolian base)類型的盲注
我們直接來看構造語句:
kobe' and ascii(substr(database(),1,1))>113--
布爾類型的回顯結果只有兩種,正確還是錯誤。
我們首先用substr()函數取出database()的第一個字母,然后進行ascii編碼,最后采用二分法判斷,知道找到一個值可以使之輸出正確的結果,得到第一個字母到底是什么,然后取出database()里邊的第二個字母,以此類推……
4.2(time base)類型的盲注
布爾盲注還有正確和錯誤兩種情況輸出,但是在時間盲注類型下,就一種輸出,無論正確與否,都是一種輸出。
我們直接來看構造語句:
kobe ' and if((substr(database(),1,1))='p',sleep(5),null)--
這個構造語句的作用是,首先判斷數據庫的第一個字母是不是p,如果是就延遲5秒,表現出來就是網頁一直顯示在等待加載的狀態,五秒后在返回結果頁面,如果不是,就立即返回結果頁面。
五、基於 http header的注入
有些時候,后台開發人員為了驗證客戶端頭信息(比如常用的cookie驗證)或者通過http header頭信息獲取客戶端的一些信息,比如useragent、accept字段等。然后會客戶端的http header信息進行獲取並且用SQL進行處理,如果此時沒有足夠的安全考慮則可能會導致基於http header的SQL Inject漏洞。
下面就這個場景下的SQL注入做演示。
1、我們來到pikachu的"http header"注入模塊,打開burp suite抓包工具,開啟瀏覽器代理,執行下圖中的操作。
2、打開burp suite,將截取到的數據包發送到重放模塊。
3、構造報錯注入語句:firefox' or updatexml(1,concat(0x7e,database()),0) or '
4、除了在user agent處存在注入點,我們還猜想系統是否會對http header當中的cookie進行分析,驗證用戶名和密碼。
5、我們執行上圖的操作后,會在右側的輸出欄的底部發現報錯,說明我們的猜想是正確的。我們同樣構造注入語句:admin ' and updatexml(1,concat(0x7e,database()),0)—
六、SQL注入表列名猜解-暴力破解在SQLI上的應用
當我們沒有權限讀information_schema這個數據庫的時候,或者我們面對的數據庫不是MySQL的時候,那么我該如何獲得列名和表名?
這個時候我們考慮采用暴力破解的方式。
首先我們得有一個構造好的語句:kobe' and exists(select * from aa)#
這個語句的作用是,aa作為變量,用exists()函數判斷我們要查詢的數據庫是否存在,若存在就會返回一個正確的結果。
1、我們利用pikachu字符注入模塊,開啟burp suite,然后將構造好的語句輸入。
2、來到burp suite將抓到的數據發送到暴力破解模塊。
3、執行破解后,我們來看結果
七、使用SQL-map進行SQL Inject漏洞測試
1、我們利用布爾類型的盲注模塊做演示:在模塊里邊的查詢框內隨便輸入一個值,點擊查詢。
2、打開sqlmap工具
-D pikachu -T users –columns查詢users表內的字段
-D pikachu -T users -C username,password –dump查詢字段內容
這里就不展示了。
八、SQL注入漏洞常見的防控措施
1、代碼層面
(1)對輸入進行嚴格的轉義和過濾
(2)使用預處理和參數化(Parameterized)
實例:
2、網絡層面
(1)通過WAF設備啟用防SQL注入策略(類似的防護系統)
(2)雲端防護(360網站衛士,阿里雲盾等等)