《Android 滲透測(cè)試學(xué)習(xí)手冊(cè)(六)玩轉(zhuǎn) SQLite》要點(diǎn):
本文介紹了Android 滲透測(cè)試學(xué)習(xí)手冊(cè)(六)玩轉(zhuǎn) SQLite,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
本文由 看雪學(xué)院 飛龍使者 編譯
原文:Learning Pentesting for Android Devices
作者:Aditya Gupta
SQLite 是一個(gè)開(kāi)源數(shù)據(jù)庫(kù),具有許多類似于其他關(guān)系數(shù)據(jù)庫(kù)(如 SQL)的功能. 如果你是應(yīng)用程序開(kāi)發(fā)人員,你可能還會(huì)注意到 SQLite 查詢看起來(lái)或多或少像 SQL 一樣. 在 Android 中選擇 SQLite 的原因是其內(nèi)存占用較低. Android 開(kāi)發(fā)者喜歡 SQLite 的原因是它不需要設(shè)置或配置數(shù)據(jù)庫(kù),并且可以在應(yīng)用程序中直接調(diào)用.
6.1 深入理解 SQLite
正如我們?cè)谏弦徽轮锌吹降?SQLite 數(shù)據(jù)庫(kù)默認(rèn)在 Android 中存儲(chǔ)在/data/data/[package name]/databases/位置,擴(kuò)展名為.db文件(在 Android 的大多數(shù)情況下) . 現(xiàn)在,在我們更深入地探討 SQLite 漏洞之前,我們應(yīng)該清楚地了解 SQLite 語(yǔ)句和一些基本的命令
分析使用 SQLite 的簡(jiǎn)單應(yīng)用
在這里,我們有一個(gè)基本的 Android 應(yīng)用程序,它支持用戶的登錄和注冊(cè),并在后端使用 SQLite. 遵循以下步驟:
讓我們運(yùn)行應(yīng)用程序并分析它創(chuàng)建的數(shù)據(jù)庫(kù). 你可以從http://attify.com/lpfa/vulnsqlite.apk下載漏洞應(yīng)用程序. 用于創(chuàng)建數(shù)據(jù)庫(kù)的代碼示例如以下屏幕截圖所示:
這意味著我們有七個(gè)字段,名稱為id(integer), firstName (text), lastName (text), email (text), phoneNumber (text), username (text), 和 password (text).tableName字段之前叫做USER_RECORDS.
讓我們現(xiàn)在拜訪 adb shell 并檢查數(shù)據(jù)庫(kù).我們可以使用 SQLite 瀏覽器拜訪 SQLite 文件,我們?cè)谏弦徽轮惺褂昧怂?或者我們可以使用命令行工具sqlite3.對(duì)于整個(gè)這一章,我們將使用名為sqlite3的命令行工具,它存在于大多數(shù) Android設(shè) 備中.如果你的 Android 設(shè)備中不存在它,你可以使用 Play 商店中提供的 BusyBox 應(yīng)用程序進(jìn)行安裝.
所以,讓我們繼續(xù)分析數(shù)據(jù)庫(kù).我們需要做的第一件事是使用 adb shell 進(jìn)入設(shè)備.
下一步是拜訪/data/data/[package-name]目錄的位置并查找databases文件夾.一旦我們進(jìn)入了數(shù)據(jù)庫(kù)文件夾,我們會(huì)注意到各種文件.現(xiàn)在,SQLite 數(shù)據(jù)庫(kù)的文件格式大多是前面提到的.db,但它們也可以為.sqlite,.sqlitedb或開(kāi)發(fā)人員在創(chuàng)建應(yīng)用程序時(shí)指定的任何其他擴(kuò)展名.如果你記得上一章中的練習(xí),在查找數(shù)據(jù)庫(kù)文件時(shí),這正是尋找其他擴(kuò)展名的時(shí)候,例如.sqlite.
還有其他可用的選項(xiàng)可用于滲透測(cè)試. 其中之一是.output命令. 這會(huì)自動(dòng)將之后的 SQL 查詢的輸出保存到指定的文件,我們可以稍后拉取,而不是在屏幕上顯示. 一旦我們將輸出保存在文件中,并且想返回屏幕顯示模式,我們可以使用.output命令并將其設(shè)置為stdout,這將再次在終端上顯示輸出 .
在SQLite中,.dump將創(chuàng)建一個(gè)列表,包括從數(shù)據(jù)庫(kù)創(chuàng)建到現(xiàn)在為止所執(zhí)行的所有 SQL 操作. 以下是在當(dāng)前數(shù)據(jù)庫(kù)上運(yùn)行的命令的輸出的屏幕截圖:
現(xiàn)在,我們可以使用以下命令使用sqlite3打開(kāi)數(shù)據(jù)庫(kù):
sqlite3 [databasename]11
在這種情況下,由于數(shù)據(jù)庫(kù)名稱是weak-db,我們可以簡(jiǎn)單地輸入sqlite3 vulnerable-db打開(kāi)它. 我們也可以在給定時(shí)間使用sqlite3打開(kāi)多個(gè)數(shù)據(jù)庫(kù). 要查看加載的當(dāng)前數(shù)據(jù)庫(kù),我們可以鍵入.databases命令列出我們當(dāng)前的數(shù)據(jù)庫(kù),如下面的截圖所示:
現(xiàn)在,我們打開(kāi)數(shù)據(jù)庫(kù)時(shí)要做的第一件事是查看數(shù)據(jù)庫(kù)中包括的表. 表的列表可以由.tables顯示,如以下屏幕截圖所示:
接下來(lái)我們需要做的是通過(guò)執(zhí)行SELECT查詢來(lái)查看列字段中的數(shù)據(jù).
注意
另一個(gè)需要注意的重要事情是,SQL 中使用的大多數(shù)查詢對(duì) SQLite 仍然有效.
使用應(yīng)用程序并為數(shù)據(jù)庫(kù)填充一些信息. 接下來(lái),為了查詢并查看USER_RECORDS表,通過(guò)通配符*指定所有內(nèi)容,我們可以使用以下命令:
SELECT * from USER_RECORDS;11
運(yùn)行上述命令將產(chǎn)生類似于如下所示的輸出:
正如我們?cè)谶@里可以看到的,有兩個(gè)名稱為USER_RECORDS和android_metadata的表. 由于我們對(duì)USER_RECORDS更感興趣,我們將首先繼續(xù)查看表中的各個(gè)列,稍后我們將轉(zhuǎn)儲(chǔ)列字段中的數(shù)據(jù). 為了查看有關(guān)表的更多信息,例如列字段,我們可以使用.schema命令,如下面的截圖所示:
現(xiàn)在,sqlite3也給了我們改變輸出格式,查看額外信息以及所需信息的自由. 所以,讓我們繼續(xù),將查看mode設(shè)置為column,將header設(shè)置為on.
讓我們?cè)俅芜\(yùn)行相同的查詢并檢查輸出,如下面的截圖所示:
此外,所有這些操作都可以從終端執(zhí)行,而不是進(jìn)入 shell,然后啟動(dòng)sqlite3二進(jìn)制. 我們可以直接向 adb shell 傳遞我們的命令并獲得輸出,如下面的截圖所示:
6.2 平安漏洞
Web 應(yīng)用程序和移動(dòng)應(yīng)用程序中最常見(jiàn)的漏洞之一是基于注入的漏洞. 如果按原樣使用用戶提供的輸入,或動(dòng)態(tài) SQL 查詢的保護(hù)很少并且不足夠,SQLite 也會(huì)產(chǎn)生注入漏洞.
讓我們來(lái)看看用于查詢應(yīng)用程序中的數(shù)據(jù)的SQL查詢,如下所示:
String getSQL = "SELECT * FROM " + tableName + " WHERE " + username + " = '" + uname + "' AND " + password + " = '" + pword + "'";Cursor cursor = dataBase.rawQuery(getSQL , null12341234
在前面的 SQL 查詢中,uname和pword字段從用戶輸入直接傳遞到 SQL 查詢中,然后使用rawQuery辦法執(zhí)行. rawQuery辦法實(shí)際上只是執(zhí)行任何傳遞給它的 SQL 查詢.另一個(gè)類似于rawQuery的辦法是execSQL辦法,它和rawQuery一樣脆弱.
前面的 SQL 查詢用于驗(yàn)證用戶的登錄憑據(jù),然后顯示其在注冊(cè)期間使用的信息.所以,這里的 SQL 引擎檢查用戶名和暗碼是否匹配在一行,如果是這樣,它返回一個(gè)布爾值TRUE.
然而,想象一個(gè)場(chǎng)景,我們可以修改我們的輸入,而不是正常的文本輸入,它似乎是應(yīng)用程序的 SQL 查詢的一部分,然后又返回TRUE,從而授予我們身份.事實(shí)證明,如果我們把用戶名/密碼設(shè)為1'or'1'='1或任何類似總是TRUE的查詢,我們就破解了應(yīng)用程序的身份驗(yàn)證機(jī)制,這反過(guò)來(lái)是一個(gè)很大的平安風(fēng)險(xiǎn).另外,請(qǐng)注意,由于使用單引號(hào),在前面輸入中使用的OR將在SQL查詢中被視為OR.這將閉合用戶名字段,并且我們的其余輸入將解釋為 SQL 查詢.你可以從http://attify.com/lpfa/sqlite.apk下載漏洞應(yīng)用程序.這里是攻擊情況下的 SQL 查詢:
SELECT * FROM USER_RECORDS WHERE USERNAME = '1'or'1'='1' AND PASSWORD = 'something'1212
如果應(yīng)用程序檢測(cè)到登錄成功,它會(huì)顯示一個(gè)彈出框,其中包括用戶信息,就像在 SQLite 身份驗(yàn)證繞過(guò)攻擊的情況下一樣,如下面的屏幕截圖所示:
我們還可以在輸入結(jié)尾處附加雙連字符(-),來(lái)使 SQL 查詢的其余部分僅解釋為對(duì)應(yīng)用程序的注釋.
讓我們看看另一個(gè)應(yīng)用程序,這一次,利用 drozer,我們以前使用的工具,來(lái)利用 SQLite 注入漏洞.
這個(gè)應(yīng)用程序是一個(gè)待辦事項(xiàng),用戶可以保存他們的筆記; 該筆記存儲(chǔ)在名為todotable.db的數(shù)據(jù)庫(kù)中,并在應(yīng)用程序中通過(guò)內(nèi)容供應(yīng)器拜訪. 遵循以下步驟:
讓我們繼續(xù),并啟動(dòng) drozer,查看這個(gè)應(yīng)用程序的數(shù)據(jù)庫(kù),如下面的命令所示.軟件包名稱為com.attify.vulnsqliteapp.
adb forward tcp:31415 tcp:31415drozer console connect1212
一旦我們進(jìn)入了 Drozer 的控制臺(tái),我們就可以運(yùn)行finduri掃描器模塊來(lái)查看所有內(nèi)容 URI 和可拜訪的 URI,如下所示:
dz> run scanner.provider.finduris -a com.attify.vulnsqliteappScanning com.attify.vulnsqliteapp...Unable to Query content://com.attify.vulnsqliteapp.contentprovider/Able to Query content://com.attify.vulnsqliteapp.contentprovider/todosAble to Query content://com.attify.vulnsqliteapp.contentprovider/todos/Unable to Query content://com.attify.vulnsqliteapp.contentproviderAccessible content URIs: content://com.attify.vulnsqliteapp.contentprovider/todos content://com.attify.vulnsqliteapp.contentprovider/todos/123456789101112131415161718123456789101112131415161718
接下來(lái),我們將使用 Drozer 中的注入掃描程序模塊檢查應(yīng)用程序中基于注入的漏洞,如下所示:
dz> run scanner.provider.injection -a com.attify.vulnsqliteappScanning com.attify.vulnsqliteapp...Not Vulnerable: content://com.attify.vulnsqliteapp.contentprovider/ content://com.attify.vulnsqliteapp.contentproviderInjection in Projection: No vulnerabilities found.Injection in Selection: content://com.attify.vulnsqliteapp.contentprovider/todos content://com.attify.vulnsqliteapp.contentprovider/todos/123456789101112123456789101112
所以,現(xiàn)在我們可以使用可選參數(shù)來(lái)查詢這些內(nèi)容供應(yīng)器,例如1 = 1,它將在所有情況下返回TRUE,如下面的截圖所示:
此外,我們可以使用 Drozer 模塊app.provider.insert,并通過(guò)指定參數(shù)和要更新的數(shù)據(jù)類型,將我們自己的數(shù)據(jù)插入 SQLite 數(shù)據(jù)庫(kù). 讓我們假設(shè)我們要在數(shù)據(jù)庫(kù)中添加另一個(gè)to-do條目. 因此,我們需要四個(gè)字段:id,category,summary和description,數(shù)據(jù)類型分別為integer,string,string和string.
因此,完整的語(yǔ)法將變成:
run app.provider.insert content://com.attify.vulnsqliteapp.contentprovider/todos/ --integer _id 2 --string category urgent --string summary "Financial Summary" --string description "Submit Annual Report" 1234512345
成功執(zhí)行后,它將顯示完成消息,如以下屏幕截圖所示:
總 結(jié)
在本章中,我們深入了解了 SQLite 數(shù)據(jù)庫(kù),甚至在應(yīng)用程序中發(fā)現(xiàn)了漏洞,并利用 Drozer 來(lái)利用它們. SQLite 數(shù)據(jù)庫(kù)應(yīng)該是滲透測(cè)試人員關(guān)注的主要問(wèn)題之一,因?yàn)樗鼈儼藨?yīng)用程序的大量信息. 在接下來(lái)的章節(jié)中,我們將了解一些不太知名的 Android 利用技術(shù).
維易PHP培訓(xùn)學(xué)院每天發(fā)布《Android 滲透測(cè)試學(xué)習(xí)手冊(cè)(六)玩轉(zhuǎn) SQLite》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/10697.html