Content Provider組件本地SQL注入漏洞 - ContentProvider.query方法
一、API
1. 繼承關係
【1】java.lang.Object
【2】android.content.ContentProvider
2. 主要方法
【1】query(Uri uri, String[ ] projection, String selection, String[ ] selectionArgs, String sortOrder)
返回Cursor對象或null
【2】insert(),delete(),update()
【3】參考鏈接
https://developer.android.com/reference/android/content/ContentProvider.html
3. 示例
二、觸發條件
1. 定位ContentProvider組件對應的子類
【1】對應到smali語句中的特徵
.super Landroid/content/ContentProvider;
2. 判斷Provider是否對外暴露(exported屬性爲true)
3. 判斷子類中是否調用query方法
->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
4. 找到projection,selection參數對應的寄存器名稱 v1
5. 判斷寄存器V1的賦值來源是否爲拼接字符串
三、漏洞原理
【1】暴露的Provider組件,如果在query()中使用拼接字符串組成SQL語句的形式去查詢數據庫,容易發生SQL注入攻擊
【2】更多內容
https://jaq.alibaba.com/community/art/show?articleid=352
http://wolfeye.baidu.com/blog/sql-injection/
http://www.droidsec.cn/android安全開發之provider組件安全/
四、修復建議
【1】不必要導出的Provider組件,建議顯示設置組件的“android:exported”屬性爲false
【2】使用selectionArgs進行參數化查詢