DIVA闖關-APP測試
DIVA簡介:
DIVA(該死的不安全和易受攻擊的應用程式)是故意設計的存在很多漏洞的Android app。
原始碼連結:https://github.com/payatu/diva-android
apk檔案連結:http://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz
闖關工具:
環境部署:
-
將adb通過USB與夜神模擬器進行通訊。
要在通過USB連線的裝置上使用adb,必須在裝置的系統設定中啟用USB除錯。在搭載 Android 4.2 及更高版本的裝置上,“開發者選項”螢幕預設情況下處於隱藏狀態。開啟夜神模擬器,點選設定->關於平板電腦,可以看到Android 版本為7.1.2,點選版本號7次,即可啟用開發者模式,返回上一螢幕,開發者選項->USB除錯即開啟USB除錯功能。 現在可以將adb連線模擬器。
從Nox/bin/目錄進入命令列,輸入連線命令,並驗證裝置是否已連線。
輸入 adb connect 127.0.0.1:62001 或 adb connect 127.0.0.1:52001 即可以連線到adb 檢視連線情況輸入命令 adb devices
返回以下內容說明成功。
擴充套件:Android 11 及更高版本支援使用 adb從工作站以無線方式部署和除錯應用。例如,可以將可除錯應用部署到多臺遠端裝置,而無需通過 USB 實際連線裝置。這樣就可以避免常見的 USB 連線問題,例如驅動程式安裝方面的問題。
詳情:https://developer.android.google.cn/studio/command-line/adb -
將靶場拖進模擬器,開啟靶場。
開始闖關:
第一關 不安全的日誌輸出
產生原因:由於app程式碼中將敏感資訊(如憑據,會話ID,財務詳細資訊等)通過log.e輸出,所以在app的表單中輸入的內容,可以在相關的日誌中輸出。
-
提交資料後,輸入命令adb logcat檢視日誌
也可以進入互動式shell,輸入ps | grep -i diva先找到diva的pid值(2732),再通過logcat | grep [pid]獲取日誌資訊。
-
可以通過反編譯在logActivity.class中看到程式碼中使用了log.e輸出。
第二關 硬編碼—第一部分
硬編碼
- 某些需要比較字串的值為硬編碼,如:啟用碼
- 加密的key或者salt為硬編碼,如MD5的salt
- 直接檢視原始碼,發現vendor key的值
第三關 不安全的資料儲存—第一部分
產生原因:使用了SharedPreferences類,該類是Android平臺上一個輕量級的儲存類,主要是用來儲存一些常用的配置,本例中是用該類儲存了使用者名稱和密碼,因此是具有風險的。SharedPreferences類儲存的資料會以.xml的形式儲存在/data/data/app的包名/shared_prefs目錄下。
-
首先隨意輸入使用者名稱和密碼 admin/admin 點選儲存
-
進入shell模式,在/data/data/jakhar.aseem.diva/shared_prefs/目錄中檢視jakhar.aseem.diva_preferences.xml檔案,也可以輸入adb pull /data/data/jakhar.aseem.diva/shared_prefs ./將檔案複製出來檢視
-
在InsecureDataStorage1Activity.class中可以看到產生風險的地方
第四關 不安全的資料儲存—第二部分
產生原因:將敏感資料儲存在本地的sqlite3資料庫中,對應的資料庫目錄: /data/data/app的包名/databases
-
同樣先輸入admin/123456
-
進入/data/data/jakhar.aseem.diva/databases/目錄中sqlite3檢視資料庫檔案ids2
-
在InsecureDataStorage2Activity.class中可以看到產生風險的地方
第五關 不安全的資料儲存—第三部分
產生原因:將敏感資料儲存在臨時檔案中,對應的臨時檔案目錄: /data/data/app的包名/
-
同樣輸入之後,進入/data/data/jakhar.aseem.diva/目錄中檢視該目錄下臨時檔案uinfo-1464421317tmp
-
在InsecureDataStorage3Activity.class中可以看到產生風險的地方
第六關 不安全的資料儲存—第四部分
產生原因:將敏感資料儲存在sd卡中,對應的目錄一般在: /mnt/sdcard,也可以通過logcat檢視儲存路徑。
-
進入/mnt/sdcard/目錄中檢視儲存sd卡的檔案.unifo.txt
-
在InsecureDataStorage4Activity.class中可以看到產生風險的地方
第七關 輸入校驗問題—第一部分
產生原因:某些不安全控制元件內輸入sql或其他資料庫的一些語句,因為在使用前未進行檢驗長度和過濾等操作,從而達到欺騙伺服器執行惡意程式碼影響到資料庫的資料
-
首先輸入test'和test''試探一下,test'什麼也不返回,而test''正常返回
-
輸入萬能密碼test' or '1'='1嘗試,即得到了所有使用者的資料
-
在SQLInjectionActivity.class中可以看到並沒有對輸入資料進行處理且語句直接拼接
第八關 輸入校驗問題—第二部分
產生原因:在處理轉跳時存在漏洞,導致允許從http域跨向file域,實現跨域漏洞,在 File 域下,同源策略跨域訪問則能夠對私有目錄檔案進行訪問
-
輸入一段url點選可以看到訪問了這個頁面
-
將http協議換成File協議,檢視之前儲存在sd卡的賬號檔案
-
在InputValidation2URISchemeActivity.class中可以看到並沒有對輸入資料進行處理直接loadUrl
擴充套件:webview域控制不嚴格漏洞
先看Android裡的WebViewActivity.java,當其他應用啟動此 Activity 時, intent 中的 data 直接被當作 url 來載入(假定傳進來的 url 為 file:///data/local/tmp/attack.html ),其他 APP 通過使用顯式 ComponentName 或者其他類似方式就可以很輕鬆的啟動該 WebViewActivity 並載入惡意url。解決方案:
對於不需要使用 file 協議的應用,禁用 file 協議:
對於需要使用 file 協議的應用,禁止 file 協議載入 JavaScript。
方法分析:
1、setAllowFileAccess()
使用 file 域載入的 js程式碼能夠使用進行同源策略跨域訪問,從而導致隱私資訊洩露,如果不允許使用 file 協議,則不會存在上述的威脅,但同時也限制了 WebView 的功能,使其不能載入本地的 html 檔案。2、setAllowFileAccessFromFileURLs()
設定為false,禁止從 file url 中載入的 js 程式碼讀取其它本地檔案,在Android 4.1前預設允許,在Android 4.1後預設禁止。3、setAllowUniversalAccessFromFileURLs()
設定為false,禁止從 file url 中載入的 js 程式碼可以訪問其他的源(包括http、https等源)。
第九關 訪問控制問題—第一部分
-
點選按鈕獲取到API 憑據
-
而我們的目標是不使用按鈕就獲取到API憑據。
檢視diva-beta.apk/AndroidManifest.XML檔案,檢視和供應商API憑據提供相關的activity
通過觀察程式碼發現,這個activity被intent filter所“保護”,當intent filter被activity等元件使用,這個activity可能會被外部任何應用程式所呼叫
-
adb啟動activity元件,輸入命令
$adb shell am start jakhar.aseem.diva/.APICredsActivity 或者 $adb shell am start -n jakhar.aseem.diva/.APICredsActivity -a jakhar.aseem.diva.action.VIEW_CREDS am start: 啟動activity 管理工具 -a:指定action -n:指定完整 component 名 命令詳情:https://developer.android.google.cn/studio/command-line/adb#am
-
之後模擬器上就彈出了之前的憑據頁面
第十關 訪問控制問題—第二部分
-
從題目裡可得註冊後才能擁有tveeter API Credentials,所以要通過不註冊來獲取API Credentials
-
嘗試上一關的方式
結果跳到了未註冊時的activity,這表明程式做了相應的措施
-
檢視原始碼APICreds2Activity.class
可以看到,getIntent獲取到上個activity傳來的boolean值(2131492985),當這個值為false時才視為使用者已註冊,再看看上個activity,檢視AccessControl2Activity.class
這個類中bool值是通過單選項來決定的,而且把值傳給下個activity,這時我們可以使用–ez來傳遞一個boolean鍵值對,但是還要獲取到2131099686值對應的key值是什麼。
-
一般情況下使用apktool反編譯的字串檔案存放在apktoo/diva-beta/res/vaules/strings.xml檔案下,在反編譯的情況下所有的索引值都儲存在strings.xml同目錄下的public.xml檔案中,所以,我們現在public中檢視16進位制的2131099686(0x7f060026)對應的name值
然後再strings檔案下查詢chk_pin,最後得到key 為check_pin
-
最後adb啟動activity命令,成功彈出
$adb shell am start -a jakhar.aseem.diva.action.VIEW_CREDS2 -n jakhar.aseem.diva/.APICreds2Activity --ez check_pin false
第十一關 訪問控制問題—第三部分
-
由題可知,這是個私人筆記app,一開始需要設定密碼才能使用,現在我們嘗試不設定密碼就開始使用。
-
同樣檢視AndroidManifest.XML檔案
這裡使用了ContentProvider,android:enabled表示是否能由系統初始化,android:exported表示是否能被其他應用使用,android:authorities標識這個ContentProvider,呼叫者可以根據這個標識來找到它,看到2個值都為true,我們就可以使用content://訪問裡面的資料了,檢視包含content://的字串檔案apktool/diva-beta/smali/jakhar/aseem/diva/NotesProvider.smali
和我們在AndroidManifest所看到的一樣
-
我們可以使用以下命令隨意的訪問該uri
$adb shell content query –-uri content://jakhar.aseem.diva.provider.notesprovider/notes
第十二關 硬編碼—第二部分
-
檢視原始碼Hardcode2Activity.class,這裡使用了DivaJni類
點選檢視 DivaJni.class
這裡載入了divajni庫,一般庫檔案都放在/lib下,在目錄下找到libdivajni.so檔案,linux下可以使用strings方便的檢視二進位制檔案裡的字串
$strings libdivajni.so
-
逐個嘗試,發現olsdfgad;lh成功
第十三關 輸入校驗問題—第三部分
-
正常輸入
-
當輸入超級多的資料時,程式崩潰了
-
檢視logcat可以發現緩衝區溢位了
-
檢視原始碼,可以看到這裡使用的是strcpy,使用strcpy_s更加安全