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进行参数化查询