安卓Hacking Part 2: Content Provider攻防
在上一期中,我們討論了攻擊及加固Activity組件的方法,今天我們來看看所謂的”Content Provider Leakage”。
什么是Content Provider?
按照Google為Android設計的安全模型,應用的數據屬于私有數據,故默認情況下,應用無法訪問其他應用的私有數據。但當應用需要與其他應用共享數據時,Content Provider就扮演著應用間數據共享橋梁的角色。Content Providers使用標準的insert(),query(),update(), delete()等方法來操作應用的數據,每個Content Provider都對應一個以”content://”開頭的特定URI,任何應用都可以通過這個URI操作Content Provider 應用的數據庫。
某些時候,應用的Content Provider并不是為了與其他應用共享數據,或者是為了與具有一定權限的應用共享數據,在這種情況下,如果應用對權限控制不當就會造成信息泄露。
Android中內置的SMS短信應用就是一個典型的Content Provider的例子,任何應用都能通過這個URI讀取收件箱:content://sms/inbox,但必須在應用的AndroidManifest.xml文件中登記READ_SMS權限。
前期準備:
安裝了Android SDK的電腦
一臺未root的Android設備
示例程序功能測試:
下載了測試應用之后,安裝在一個未root的android設備中
可通過以下命令安裝
#adb install <name of the apk>.apk
我們的目標是尋找該應用是否實現了Content Provider,如果有,我們就需要進一步對其進行測試看是否會造成信息泄露。
相關主題:
信息收集
攻擊脆弱的Content Provider
應用加固
信息收集:
與其他的滲透測試步驟一樣,我們同樣從信息收集入手。假設現在我們都拿到了APK文件,使用我們第一期介紹的方法反編譯該APK文件,檢查在APK的AndroidManifest.xml文件中注冊的content provider。并檢查所有用到了相關URI的smali文件。
Content provider 通常以如下形式在AndroidManifest.xml中注冊
檢查測試應用的AndroidManifest.xml文件:
我們在AndroidManifest.xml文件中發現其中注冊了一個content provider ,并且該content provider 是暴露的(android:exported=”true”),這意味著所有應用都可以訪問這個content provider
攻擊content provider
這是我們這次試驗最有趣的部分了,現在我們嘗試通過這個content provider 去查詢數據,如果有數據返回,就意味著這個content provider 是可以被攻擊的,我們有很多種辦法來進行這個查詢:
1、 使用adb命令
2、 使用一個惡意應用發起查詢
3、 使用Mercury框架(譯者注:以改名為drozer)
使用adb
要使用adb來訪問content provider,測試應用要先安裝在一臺供測試的設備上。
首先獲得一個adb shell (cmd: # adb shell),并使用下面的命令來讀取content provider.比如我現在要去的讀取一個在MyProvider.smali中發現的URI:
Content –query –uri content://com.isi.contentprovider.MyProvider/udetails
不出意外的話,我們就能看到儲存在應用數據庫中的內容了,如下圖所示:
使用惡意應用
我們甚至能自己寫一個簡單的惡意應用來讀取content provider。以下一段讀取收件箱的示例代碼:
使用Mercury框架(drozer)
使用mercury框架,整個攻擊過程將更加簡單和高效。
標題加固應用
1、 設置android:exported 屬性為false:
在我們這個應用的AndroidManifest.xml文件中,我們應該加上以下屬性來對應用進行加固,比如,我們的content provider 的類名是com.isi.contentprovider.MyProvider
如果我再嘗試讀取一個屬性android:exported 為false的content provider就會拋出異常,如圖所示:
注:API level 在17以下的所有應用的android:exported屬性默認值都為true.
2、 通過設置自定義權限來限制對content provider的訪問
我們可以通過自定義權限來對content provider的訪問進行權限控制.這在開發者想對具有特定權限的應用開放訪問的情況下很有用。
標題Content Provider的其他安全問題
SQL注入:如果安全控制不當,Content Provider 會造成客戶端的SQL注入,與傳統的SQL注入攻擊方法類似。
目錄遍歷:如果Content Provider的實現存在問題,可能還會造成目錄遍歷。這與WEB中的目錄遍歷類似,允許攻擊者遍歷并訪問本地文件系統。可通過該漏洞讀取設備中的敏感文件。
智能推薦
安卓復習.Part4
概念 Fragment 表示 FragmentActivity 中的行為或界面的一部分。可以在一個 Activity 中組合多個片段,從而構建多窗格界面,并在多個 Activity 中重復使用某個片段。可以將片段視為 Activity 的模塊化組成部分,它具有自己的生命周期,能接收自己的輸入事件,并且可以在 Activity 運行時添加或移除片段(這有點像可以在不同 Activity 中重復使用的...
安卓復習.Part3
Android UI元素 Android 界面元素主要由5部分組成: 視圖(View) 視圖容器(ViewGroup) 布局管理(Layout) Activity Fragment 視圖View 常見的子類及其功能: 視圖容器 ViewGroup類通常作為其他組件的容器使用。 示意圖: ViewGroup類提供的主要方法: ViewGroup的繼承者大部分位于android.widget包中。 布...
Content Provider與SQLite結合使用
前言 雖然推薦使用數據庫保存結構化的復雜數據,但是數據共享是一個挑戰,因為數據庫只允許創建它的應用訪問。 在Android中共享數據 在Android中,推薦使用content provider方法在不同包之間共享數據。content provider可以被視為一個數據倉庫。它如何存儲數據與應用如何使用它無關。然而,應用如何使用一致的編程接口在它的里面的數據非常重要。content pro...
Android學習羈絆之Content Provider
原文鏈接:Android學習羈絆–>Content Provider Content Provider(內容提供器)主要用于在不同的應用程序之間實現數據共享的功能,它提供了一套完整的機制,允許一個程序訪問另一個程序中的數據,同時還能保證被訪數據的安全性。目前,使用內容提供器是Android實現跨程序共享數據的標準方式。 不同于文件存儲和SharedPreferences存儲中的兩...
(譯)從Content Provider中獲取數據
原文:https://developer.android.google.cn/guide/topics/providers/content-provider-basics.html Content Provider基礎 Content Provider管理對中央數據倉庫的訪問,它是Android應用的一部分,通常會提供自己的UI來使用數據。然而,Content Provider主要是為了給其他應用...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...