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