一、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網站衛士,阿里云盾等等)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/43217.html
標籤:其他
