APP測試練手筆記(1)代碼保護與應用配置
來自專欄 Zero-Security-Team4 人贊了文章
進入安全圈成為一名混子後的最大感受:緊張
尤其是乙方安服一天出兩份報告,而我偶爾出一份的時候。
以及師傅對我說:「這個站有好多漏洞,你待會好好看看的時候」
MMP,你們怎麼回事,還讓不讓人快樂的摸魚了。
言歸正傳,還是好好記錄下自己最近學習移動應用安全測試的流程吧,就當做筆記了,順便應付下李哥,畢竟當初說過要好好搞專欄的,一鴿就是兩月。。。。
目前的移動應用越來越多,應用市場裡面,各種奇葩功能的APP都有,來YY一個場景,看你在這個時間段,使用了多少應用。
首先假設你有一個女朋友,你今天要跟她出去約會。約會總不能幹聊天吧,淘票票買電影票對吧,美團得找個吃飯的地方把。離開家去約會地點得滴一下吧。微信聊天總不能不回吧,你見到女友後,進行各種活動的時候得拍照P圖吧,兩人玩半天總有累的時候,是該地圖上找個附近的房間休息一會兒吧,這時候得去小超市買點東西吧,哦豁,你的花唄又該派上用場了。
所以說你就光找女朋友玩個一天就得用上數個應用,花上***錢。
要是你使用的這些應用存在漏洞呢,泄露了某些無意義的數據還好,要是涉及到某些私密的東西就比較刺激了。
雖然可能沒有Web那麼頻繁,但是關於android app的安全漏洞也在不斷地出現,在面對一個安卓應用時,如何對它進行安全測試呢。
一. APP安全測試關注點
1) 敏感數據暴露
1 明文傳輸用戶名、密碼和驗證碼等敏感信息
2 不安全的本地存儲
3 泄漏後台伺服器地址,導致伺服器可控(如果該項產生問題,可以轉入Web方式進行測試)
4 邊信道信息泄露
2) 鑒權機制缺陷
5 未使用有效的 token 機制,導致可以繞過鑒權(舉個簡單的列子,返回包修改,繞過登錄限制)
6 傳輸數據可修改,造成越權訪問
7 登錄設計缺陷,存在被暴力破解風險
8 利用業務邏輯缺陷製作簡訊炸彈
3) 釣魚劫持風險
9 關鍵頁面存在釣魚劫持風險,導致用戶信息泄露
4) 代碼層面保護不足
10 可以重新編譯,自簽名打包
11 WebView 漏洞
12 Web表單設計缺陷,存在SQL注入等漏洞。(其實struts2,上傳等Web方面的常規漏洞也是存在的)
5)公共組件漏洞
13 組件 Content Provider 配置錯誤,導致數據泄漏(這個組件還會引起sql注入,敏感目錄列表,還可以查看與下載敏感文件,比如etc/shadow等)
14 組件 Activity 配置錯誤,導致登錄頁面被繞過(這個組件出問題的話,可以導致一些需要手勢,賬戶密碼等鑒權的頁面被繞過)
15 組件 Service 配置錯誤,導致非法許可權提升
16 組件 Broadcast Receiver 配置錯誤,導致拒絕服務、非法越權
6)應用配置錯誤
17 開啟 allowbackup 備份許可權,存在備份數據泄露風險
18 開啟 Debuggable 屬性,存在應用信息篡改泄露風險
7)XcodeGhost 病毒
19 下載非官方開發工具,導致 IOS 版本 APP 被植入惡意代碼(這個比較有名,但是是屬於IOS安全的範疇,還要拖入IDA進行逆向分析,而由於自身能力不足。貧窮等諸多原因,從來沒關注過這一項)
8)開發者證書不規範
二. APP安全測試流程
你以為我會嚴格照著上面的流程來測?不存在的,一會兒反編譯,一會ADB調試的,一會兒又抓包的,多累啊(關鍵是我不太熟練),下面我主要分代碼與應用配置,四大組件,以及APP業務邏輯與常規漏洞三個方面來做個練習。(ps: 全程以某個誘導充錢的約炮APP為例)
1) 代碼與應用配置方面的問題:
(1)代碼保護不足,可重新編譯打包
問題描述:破解者通過反編譯後得到程序源代碼,修改後重新編譯、簽名並安裝。
在重新打包的過程中,破解者可能注入惡意代碼,或者修改軟體邏輯繞過鑒權等。
步驟:首先使用ApkTool對目標APK文件進行反編譯(加殼的暫未學習)
命令:apktool.bat d -f target.apk -o outputfile
然後會在目標文件夾下生成反編譯好的文件,其中重點關注的是AndroidManifest.xml這個配置文件。其他的assets,lib,res等則是一些資源,以及庫文件。例外要記住的一點是,使用Apktool反編譯生成的並不是java源碼,而是smali文件。
反編譯完成之後,我們嘗試修改其中某些應用圖標文件,看看能夠重新進行編譯,並實現簽名安裝:
重新編譯依舊使用ApkTool : java -jar apktool.jar b APKFile
重新打包之後,可以在DIST文件夾里看到APK文件
接著使用用 ApkToolBox 對未簽名的 APK 文件進行簽名
最後進入虛擬機裡面安裝看看,是否存在一定的完整性驗證機制。
效果:可以正常安裝,但是TM的我寫的那兩小字不見了,不知道是字太小了,還是啥原因。
整改建議:通過檢查程序安裝後 classes.dex 文件的 Hash 值,判斷軟體是否被重
打包並進行提示
(2) allowbackup 備份許可權是否存在數據泄露風險
問題描述:被測應用的 AndroidManifest.xml 文件中 allowBackup 屬性值被設置
為 true,可通過 adb backup 對應用數據進行備份,在無 root 的情況下可以導出用戶存儲數據,造成數據泄露。
步驟:在配置文件中查看allowBackup的設置
很不幸:漏洞存在,實錘了。
整改建議 將參數 android:allowBackup 屬性設置為 false,防止數據泄漏
(3)Debuggable 屬性是否存在應用信息篡改泄露風險
問題描述:被測應用的 AndroidManifest.xml 文件中 Debuggable 屬性值被設置為
true,可以設置斷點來控制程序的執行流程,在應用程序運行時修改其行為。
步驟:在 AndroidManifest.xml 中搜索 Debuggable 屬性,檢查是否被設置為 true。
經驗證,好像Debuggable沒有打開。。。。
(4)信任所有證書漏洞。
問題描述:很早以前提出的漏洞,在安卓配置文件中直接選擇信任所有證書(不論是官方CA還是個人的自簽名證書,沒有對證書的安全性進行檢查,可以導致中間人攻擊和劫持)
步驟:將APK拖入JEB,改之理,androidKiller等工具進行反編譯,全局搜索ALLOW_ALL關鍵字(現在安卓SDK都升級到高版本了,基本上不存在這個東西了吧)
整改建議: 升級使用的存在安全問題的SDK.改SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER為SSLSocketFactory.STRICT_HOSTNAME_VERIFIER驗證。
(5)開發者證書規範測試
問題描述:主要是查看證書是否滿足規範性,是否過期。
步驟: JEB CA查看頁面, java JDK 自帶的keytool工具
只有個地名,emmmmmm.
(6)關鍵頁面是否存在釣魚劫持風險,導致用戶信息泄露
問題描述:劫持釣魚,指惡意應用針對正常應用的特定界面進行仿冒替換,誘騙
用戶在仿冒界面操作,達到釣魚目的。此類攻擊,多針對 APP 的鑒權或支付場
景,誘騙用戶輸入關鍵隱私信息,如賬號、登陸密碼和支付密碼等,達到隱私竊
取的目的。
步驟:獲取棧頂 Activity 名稱,查看關鍵 Activity 是否可被釣魚劫持。
測試包含敏感信息的界面(登錄,支付等)查看是否有加釣魚劫持保護,如
提示用戶等。
經過測試,未發現有劫持問題。或許是我側漏了?
整改建議:
1.當應用程序具有支付等敏感頁面時,通過獲取棧頂 Activity,判斷當前運行
的是否本程序,一旦發現應用被切換(可能被劫持),給予用戶提示以防範釣魚程序的欺詐。建議在關鍵類的 onpause 中實現釣魚劫持防護功能。
2.使用 HTML5 架構或 android+HTML5 混合開發,實現登陸、支付等關鍵頁面,降低被劫持的風險。
(7)WebView 漏洞
問題描述:在 webView 下有一個非常特殊的介面函數 addJavascriptInterface,能實現本地 java 和 js 的交互。被測應用中存在 WebView 漏洞,沒有對註冊 JAVA類的方法調用進行限制,導致攻擊者利用 addJavascriptInterface 這個介面函數穿透 webkit 控制 android 本機。
檢查方法和步驟:利用反編譯軟體 dex2jar 和 jdgui.exe 得到java源代碼。然後全局搜索addJavascriptInterface介面,判斷版本,以及是否存在過濾。
Android sdk int > 17 => Android 4.2以上,做了版本限制
整改建議:
1.Android 4.2 之前版本對 addJavascriptInterface 的輸入參數進行過濾;
2.Android 4.2 及之後版本,使用聲明 @JavascriptInterface 來代替
addjavascriptInterface。
3.控制相關許可權或者儘可能不要使用 js2java 的 bridge。
(8)不安全的本地存儲
問題描述:安卓開發者使用多種方法將數據存儲在安卓應用中,而存儲在本地的
數據文件如果未加密,易造成敏感信息泄漏。
檢查方法和步驟:
1. Shared Preferences 是用 key‐value 來存儲私有的原始數據的 xml 文件。數據類
型有布爾型,浮點型,整形,長整型和字元串。存儲的路徑為:/data/data/<package name>/shared_prefs/<filename.xml>。直接打開查看是否有敏感數據
2.SQLite 資料庫是輕量級基於文件的資料庫。這些文件通常以db或者sqlite 結尾。安卓默認提供了大量 SQLite 支持。應用的資料庫一般存儲在下面的地方:/data/data/<package name>/databases/<databasename.db>,可以使用 SQLite 資料庫直接打開查看是否有敏感數據
3. 檢查 SD 卡目錄中是否存在敏感數據。
整改建議:對存儲在本地的數據文件進行加密。
(9)邊信道信息泄露
問題描述:當 APP 處理用戶或其它數據源輸入的數據時,可能會把數據放在不
安全的位置,容易導致邊信道被攻擊者利用造成信息泄露
檢查方法和步驟:adb logcat > output.txt
adb logcat|grep 「cookie」
這個APP本來就是用來騙傻子充錢的,手機註冊功能,密碼找回等功能點都沒有,唯一功能點就是能夠充值VIP。所以測試的時候邊信道信息泄露暫時沒有發現。
整改建議:
1. 在日誌中對於密碼等敏感信息進行加密存儲。
2. 對敏感信息的緩存進行加密
針對APP的代碼保護與應用配置測試就記錄到這裡,下一篇更新有關四大組件的安全測試。
推薦閱讀:
※使用Netcat進行黑客攻擊
※Win7網路安全 禁止不良頁面自動下載
※美國國家網路空間安全態勢感知協調機制
※黑客如何用谷歌伺服器儲存惡意文件並上傳Web shell
※工具介紹 Shellsploit,ShellCode生成器
TAG:網路安全 |