SQLite 數(shù)據(jù)庫(kù)注入總結(jié)

前言

SQLite 是一個(gè)進(jìn)程內(nèi)的庫(kù),實(shí)現(xiàn)了自給自足的、無(wú)服務(wù)器的、零配置的、事務(wù)性的 SQL 數(shù)據(jù)庫(kù)引擎。它是一個(gè)零配置的數(shù)據(jù)庫(kù),這意味著與其他數(shù)據(jù)庫(kù)不一樣,您不需要在系統(tǒng)中配置。SQLite 與 MySQL 還是有些區(qū)別的,SQLite 直接讀寫(xiě)普通磁盤(pán)文件,每一個(gè)數(shù)據(jù)庫(kù)就是一個(gè)文件,可以按應(yīng)用程序需求進(jìn)行靜態(tài)或動(dòng)態(tài)連接其存儲(chǔ)文件進(jìn)行數(shù)據(jù)操作。

SQLite 基礎(chǔ)

在本篇文章中我們使用 SQLite3 來(lái)學(xué)習(xí),SQLite3 的語(yǔ)法與 MySQL 相似。詳細(xì)語(yǔ)法可以在這里學(xué)習(xí):https://www.runoob.com/sqlite/sqlite-tutorial.html。

SQLite 創(chuàng)建數(shù)據(jù)庫(kù)

SQLite 的?sqlite3?命令被用來(lái)創(chuàng)建新的 SQLite 數(shù)據(jù)庫(kù)。您不需要任何特殊的權(quán)限即可創(chuàng)建一個(gè)數(shù)據(jù)。如下:


上面的命令將在當(dāng)前目錄下創(chuàng)建一個(gè)文件 DatabaseName.db,該文件將被 SQLite 引擎用作數(shù)據(jù)庫(kù),并且 sqlite3 命令在成功創(chuàng)建數(shù)據(jù)庫(kù)文件之后,將提供一個(gè)?sqlite>?提示符,該提示符用于交互式的操作庫(kù)內(nèi)的數(shù)據(jù)。我們可以使用?.database?命令來(lái)查看當(dāng)前數(shù)據(jù)庫(kù):



SQLite 附加數(shù)據(jù)庫(kù)

假設(shè)這樣一種情況,當(dāng)在同一時(shí)間有多個(gè)數(shù)據(jù)庫(kù)可用,您想使用其中的任何一個(gè)。SQLite 的?ATTACH DATABASE?語(yǔ)句是用來(lái)選擇一個(gè)特定的數(shù)據(jù)庫(kù)。SQLite 的?ATTACH DATABASE?語(yǔ)句的基本語(yǔ)法如下:


打開(kāi)的數(shù)據(jù)庫(kù)和使用?ATTACH?附加進(jìn)來(lái)的數(shù)據(jù)庫(kù)的必須位于同一文件夾下。如果數(shù)據(jù)庫(kù)尚未被創(chuàng)建,上面的命令將創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。

如下,我們想附加一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù) testDB.db:


如下,執(zhí)行?.database?命令后,可以看到成功附加了一個(gè) TEST:


在特定情況下,我們可以通過(guò)附加數(shù)據(jù)庫(kù)的方式寫(xiě)入 Webshell。

SQLite 創(chuàng)建表

SQLite 的?CREATE TABLE?語(yǔ)句用于在任何給定的數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)新表。CREATE TABLE 語(yǔ)句的基本語(yǔ)法如下:


如下實(shí)例,我們創(chuàng)建了一個(gè)?users?表,ID 作為主鍵,NOT NULL 的約束表示在表中創(chuàng)建紀(jì)錄時(shí)這些字段不能為 NULL:


您可以使用 SQLIte 命令中的?.tables?命令來(lái)驗(yàn)證表是否已成功創(chuàng)建,該命令用于列出附加數(shù)據(jù)庫(kù)中的所有表:


您可以使用 SQLite?.schema?命令得到表的完整信息,如下所示:



SQLite Insert 語(yǔ)句

SQLite 的?INSERT INTO?語(yǔ)句用于向數(shù)據(jù)庫(kù)的某個(gè)表中添加新的數(shù)據(jù)行。語(yǔ)法如下:


下面的語(yǔ)句將在?users?表中創(chuàng)建四個(gè)記錄:



SQLite Select 語(yǔ)句

SQLite 的?SELECT?語(yǔ)句用于從 SQLite 數(shù)據(jù)庫(kù)表中獲取數(shù)據(jù),以結(jié)果表的形式返回?cái)?shù)據(jù)。SELECT 語(yǔ)句語(yǔ)法如下:


如下我們查詢剛剛創(chuàng)建的?users?表:



SQLite 注釋

與 MySQL 常見(jiàn)的注釋符?#?不同,SQLite 的注釋符以兩個(gè)連續(xù)的 "-" 字符(ASCII 0x2d)開(kāi)始,并擴(kuò)展至下一個(gè)換行符(ASCII 0x0a)或直到輸入結(jié)束,以先到者為準(zhǔn)。

您也可以使用 C 風(fēng)格的注釋?zhuān)?/*?開(kāi)始,并擴(kuò)展至下一個(gè)?*/?字符對(duì)或直到輸入結(jié)束,以先到者為準(zhǔn)。SQLite 的注釋可以跨越多行。



SQLite sqlite_master 表

sqlite_master?表是 SQLite 的系統(tǒng)表,是為每個(gè) SQLite 數(shù)據(jù)庫(kù)自動(dòng)創(chuàng)建的特殊表。該表記錄該數(shù)據(jù)庫(kù)中保存的表、索引、視圖、和觸發(fā)器信息,每一行記錄一個(gè)項(xiàng)目。在創(chuàng)建一個(gè) SQLite 數(shù)據(jù)庫(kù)的時(shí)候,該表會(huì)自動(dòng)創(chuàng)建。如下查看?sqlite_master?表的結(jié)構(gòu),發(fā)現(xiàn)其包含 5 列:


type:其值為 "table" 或者 "index"。

name:這個(gè)表的名稱(chēng)或者索引。

sql:創(chuàng)建表所使用的完整的 SQL 語(yǔ)句。

可知,sqlite_master?表中的?sql?字段中記錄著你建表留下的完整的記錄,也就是說(shuō)我們?cè)谧⑷氲臅r(shí)候可以通過(guò)查詢?sqlite_master?表來(lái)獲取數(shù)據(jù)庫(kù)中的表名以及表結(jié)構(gòu),這就像我們?cè)?MySQL 注入中查詢?information_schema?一樣。

同時(shí),由于使用?CREATE?或?DROP?創(chuàng)建或銷(xiāo)毀表在實(shí)際上與從特殊的?sqlite_master?表中執(zhí)行?INSERT?或?DELETE?語(yǔ)句相同,所以當(dāng)我們?cè)谔厥馇闆r下可以通過(guò)操作?sqlite_master?表來(lái)創(chuàng)建或刪除數(shù)據(jù)庫(kù)表。

常見(jiàn)注入姿勢(shì)

SQLite 注入的基本操作與 MySQL 注入相似,MySQL 有的 SQLite 基本都有,一個(gè)最大的不同就是沒(méi)有?information_schema。

我們以下編寫(xiě)測(cè)試代碼進(jìn)行演示:

index.php



測(cè)試閉合方式

正常查詢:

嘗試閉合單引號(hào):

發(fā)現(xiàn)報(bào)錯(cuò),說(shuō)明當(dāng)前閉合方式為單引號(hào)。

然后嘗試使用分號(hào)?;?閉合 SQL 語(yǔ)句:

1';

也可以使用?--?進(jìn)行注釋?zhuān)?/p>

1' --

也可以使用?/*?進(jìn)行注釋?zhuān)?/p>

1'/*

查詢 SQL 語(yǔ)句字段數(shù)

與 MySQL 一樣,我們可以使用?UNION?語(yǔ)句來(lái)查詢字段數(shù):




可知當(dāng)前字段數(shù)為 4,并且可以在 1、2、3 這三個(gè)位置回顯。

查詢表名和列名

這里直接通過(guò)查詢?sqlite_master?表來(lái)實(shí)現(xiàn):


如上圖所示,得到了當(dāng)前表創(chuàng)建時(shí)的語(yǔ)句:


從語(yǔ)句中我們得知當(dāng)前表名為?users,其中有?id、username、password、age?這四個(gè)字段。

當(dāng)存在多個(gè)表時(shí),我們可以用?limit?關(guān)鍵字逐行讀取,也可以使用?group_concat?關(guān)鍵字進(jìn)行聚合:



查詢數(shù)據(jù)

得到表明和字段名之后我們便可以查詢數(shù)據(jù)了:


布爾盲注

根據(jù)查詢正確或錯(cuò)誤時(shí)的頁(yè)面回顯來(lái)判斷數(shù)據(jù)內(nèi)容:


在爆?sql?字段時(shí)最好先 hex 編碼一下。下面給出一個(gè)二分法盲注腳本:




時(shí)間盲注

SQLite 沒(méi)有?sleep()?函數(shù),但是有個(gè)?randomblob(N)?函數(shù),其作用是返回一個(gè) N 字節(jié)長(zhǎng)的包含偽隨機(jī)字節(jié)的 BLOG。 N 是正整數(shù)??梢杂盟鼇?lái)制造延時(shí)。

并且 SQLite 沒(méi)有?if,所以我們需要使用?case...when?來(lái)構(gòu)造查詢語(yǔ)句:


執(zhí)行 payload 后將有一段時(shí)間的延時(shí)。

SQLite 注入寫(xiě)入 Webshell

還記得我們之前說(shuō)的 SQLite 附加數(shù)據(jù)庫(kù)嗎?當(dāng)在同一時(shí)間有多個(gè)數(shù)據(jù)庫(kù)可用,您想使用其中的任何一個(gè)。SQLite 的?ATTACH DATABASE?語(yǔ)句是用來(lái)選擇一個(gè)特定的數(shù)據(jù)庫(kù),使用該命令后,所有的 SQLite 語(yǔ)句將在附加的數(shù)據(jù)庫(kù)下執(zhí)行。


如果附加的數(shù)據(jù)庫(kù)不存在,則會(huì)先創(chuàng)建該數(shù)據(jù)庫(kù),如果數(shù)據(jù)庫(kù)文件路徑設(shè)置在 WEB 目錄下,就可以實(shí)現(xiàn)寫(xiě)入 Webshell 的功能。

如下我們?cè)?SQLite 中執(zhí)行以下語(yǔ)句:


如上圖所示,成功在 WEB 目錄匯總生成了 shell.php,訪問(wèn) shell.php 即可:

而在實(shí)際的 SQLite 注入中,寫(xiě) Webshell 并沒(méi)有那么簡(jiǎn)單,比如我們之前的測(cè)試代碼:

index.php


其中使用的是?query()?函數(shù)來(lái)執(zhí)行 SQL 語(yǔ)句,這樣的話就無(wú)法執(zhí)行分號(hào)?;?后面的內(nèi)容,但如果我們將?query()?換成?exec(),此時(shí)將造成堆疊注入,這樣便可以寫(xiě) Webshell 了,并且?exec()?函數(shù)執(zhí)行后沒(méi)有回顯。我們?cè)谧⑷氲臅r(shí)候執(zhí)行以下 payload 就行了:


如下成功連接 Webshell:

SQLite 加載動(dòng)態(tài)庫(kù)

為了方便開(kāi)發(fā)者可以很輕便的擴(kuò)展功能,SQLite 從 3.3.6 版本開(kāi)始提供了支持?jǐn)U展的能力,通過(guò)sqlite_load_extension API(或者?load_extension?函數(shù) ),開(kāi)發(fā)者可以在不改動(dòng) SQLite 源碼的情況下,通過(guò)動(dòng)態(tài)加載的庫(kù)(so/dll/dylib)來(lái)擴(kuò)展 SQLite 的能力。與 MySQL 中 UDF 類(lèi)似,如果我們讓 SQLite 加載惡意的動(dòng)態(tài)庫(kù),那我們便可以達(dá)到執(zhí)行系統(tǒng)命令的目的。

下面我們嘗試通過(guò)?load_extension?加載惡意擴(kuò)展實(shí)現(xiàn)反彈 Shell。

首先根據(jù) SQLite?官網(wǎng)的例子,編寫(xiě)一個(gè) so 擴(kuò)展:



然后編譯:


然后直接加載:


如下圖所示,成功反彈 Shell:

借助 SQLite 動(dòng)態(tài)加載的這個(gè)特性,我們可以通過(guò)文件上傳等方式在一個(gè)可預(yù)測(cè)的存儲(chǔ)路徑中預(yù)先放置一個(gè)覆蓋 SQLite 擴(kuò)展規(guī)范的動(dòng)態(tài)庫(kù),然后通過(guò) SQL 注入漏洞調(diào)用?load_extension,就可以很輕松的激活這個(gè)庫(kù)中的代碼,直接形成了遠(yuǎn)程代碼執(zhí)行漏洞:

而在 Android 平臺(tái)中有漏洞利用經(jīng)驗(yàn)的人應(yīng)該都很清楚,想要把一個(gè)惡意文件下載到手機(jī)存儲(chǔ)中,有許多實(shí)際可操作的方式,例如收到的圖片、音頻或者視頻,網(wǎng)頁(yè)的圖片緩存等。


但是默認(rèn)情況下?load_extension?是被禁用的。

參考文獻(xiàn)

最后

關(guān)注私我獲取【網(wǎng)絡(luò)安全學(xué)習(xí)攻略·資料包

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容