0x03-OWASPJuiceShop-Injection-DatabaseSchema

目錄

小調整

Heroku 的部署方式有一些問題。第一,需要科學上網,那麼需要 Burp Suite 抓包的時候就比較麻煩。第二,XXE的練習在 Heroku 上做不了。

那麼就部署到本機吧。kali 是在虛擬機上,有必要的時候只需要回到上一個快照就可以了。

kali 是自帶 10.20.1 版本 node 的,不需要另外安裝。

在這裏插入圖片描述

但是在按照 From Source安裝的時候碰到一些問題,啓動的時候總是拋出這樣的錯誤

在這裏插入圖片描述

最後是通過 Packaged Distributions 安裝。這是下載編譯好的包的地址

在這裏插入圖片描述

注意,下載對應的 node 版本的包文件。

在這裏插入圖片描述

解壓之後按照流程 npm start 即可。瀏覽器訪問 localhost:3000

今日目標

Database Schema.

在這裏插入圖片描述

可以學到什麼?

因爲同屬一個注入漏洞的範疇,不再寫漏洞的原理。需要了解 SQL 注入漏洞原理的小夥伴可以參看這個系列的第一篇文章

關於 Database Schema 這個挑戰,可以學到如下要點:

  • 如何使用 union select 模糊測試目標 table 有多少列
  • 如何 union select 合併顯示想要的數據
  • SQLite 及 MySQL 的 schema 概述

什麼是 UNION ?

看一下 W3C 對於 UNION 操作的解釋

在這裏插入圖片描述

UNION 可以用來合併兩個及以上 SELECT 表達式的結果,一起展示。

三個小要求:

  • 每個在 UNION 操作符中的 SELECT 表達式必須有相同的列數
  • 選擇的每一列數據類型必須一致 (文檔中居然用的 similar,相似,有點不解,後期會查詢補正)
  • 選擇的每一列數據的順序必須一致

這裏不舉例了,實例參見 W3C 對於 UNION 操作的解釋

如何使用帶有空格的請求頭?

首先用 Burp 截取一下請求。可以看到是一個 GET 請求。

在這裏插入圖片描述

那麼如果想在參數 q 後面放入一段惡意的 SQL 請求,如

test')) UNION SELECT * FROM TEST -- 

該怎麼做呢?

要做的是在使用空格的地方輸入加號 +,才能使惡意代碼正常執行。其他的例如直接輸入空格,或者使用 %20 URL encode,都是不行的。大家可以嘗試一下。

如何使用 UNION 模糊測試數據表有多少列?

首先,找到可以注入的點。然後,構造惡意 SQL 表達式,使用如下代碼嘗試獲取一張表的列數

UNION SELECT [1,[2,[3,[4]]]] FROM table_name

當然不要忘了之前講過的,在空格的地方輸入加號 +

在本次練習中的測試方式如下

在這裏插入圖片描述

只要看到右邊的報錯,說明列數不正確。

那麼就繼續增加選擇的列數,直到沒有錯誤返回,說明列數正確

在這裏插入圖片描述

SQLite 及 SQL 的 schema

這是 Wiki 對於什麼是 Database Schema 的解釋。

這翻譯過來太多術語,還需要大家自行閱讀理解。簡單來說,通過查看 schema,可以瞭解一個數據庫的數據是如何組織的,以及很多其他諸如權限等的重要敏感信息。

這裏 SQLite System Schema 有獲取 SQLite 數據庫Schema 的方式。

這裏 MySQL System Schema 有獲取 MySQL 數據庫 Schema 的方式。

關於 Schema,後面會用整篇的篇幅來講一下 MySQL 的 Schema,在滲透測試中十分重要。

如何利用這個漏洞?

這個練習中,如何知道是這個搜索請求有漏洞並不重要,重要的是明白背後的原理。這個漏洞在應用最上方的搜索欄,這個 URL 中的參數 q 可以被注入。

在這裏插入圖片描述

記住我們的目標是,導出數據庫所有的 Schema。

用 Burp 攔截請求,轉到 Repeater。隨意插入一端惡意代碼,服務端報錯。

在這裏插入圖片描述

可以肯定這個 q 參數可以被注入。

可以看到後臺的 SQL 請求是這樣的:

SELECT * FROM Products WHERE ((name LIKE '%';%' OR description LIKE '%';%') AND deletedAt IS NULL) ORDER BY name

我會做的第一步,是構造一個語法 SQL 請求,註釋掉第一個條件之後的部分,也就是 name LIKE 之後的部分。這個 SQL 請求是這樣的:

# 這裏的 asdf 隨意,也可以爲空
asdf')) -- 

執行之後服務端正常返回。

在這裏插入圖片描述

下一步,就是要確定 SQLite 的 Schema 在什麼地方。

上文提到的這篇文章,給出了答案。

文中提到,所有的 SQLite 數據庫都有一張系統表 SQLITE_MASTER,裏面包含了表名和索引名。那麼,只要導出這張表中的

在這裏插入圖片描述

另外,文中還提到了,SQLITE_MASTER 中的 sql 一切,包含了建表時的原始表達式。也意味着,只要獲取到 sql 列的內容,就可以完整複製整個數據庫。

在這裏插入圖片描述

確定了 Schema 就在 SQLITE_MASTER 表中,那麼就可以使用 UNION 先模糊測試一下該表有多少列。參照本文之前的方法,可以看到該表有 9 列。

在這裏插入圖片描述

因爲其中一列爲 sql,所以,最終的 SQL 請求爲:

# sql 放在任意位置都可以
')) UNION SELECT sql,2,3,4,5,6,7,8,9 FROM SQL_MASTER -- 

數據庫 Schema 導出完成。

在這裏插入圖片描述

SQLite 驗證

實踐中學習是最好的方式。在本地 SQLite3 中測試一下文中的說法是否正確。

這裏有 SQLite 數據庫的操作文檔

創建一個測試數據庫。

在這裏插入圖片描述

創建一張表。

在這裏插入圖片描述

使用 .schema 查看 sqlite_master 表,可以看到 sql 列。

在這裏插入圖片描述

查看 sql 列的內容,就是 COMPANY 表的建表語句。

在這裏插入圖片描述

再創建一張 COMPANY_2 表,此時 sql 列就會包含兩張表的建表語句,也就印證了,只要獲取到 sql 列的內容,就可以複製整個數據庫結構。

在這裏插入圖片描述


參考鏈接:

  • https://www.w3schools.com/sql/sql_union.asp
  • https://www.sqlite.org/faq.html#q7
  • https://en.wikipedia.org/wiki/Database_schema
  • https://www.tutorialspoint.com/sqlite/index.htm
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章