MASTG-TEST-0025: 测试注入缺陷
此测试即将更新
此测试目前可使用,但将作为新的 OWASP MASTG v2 指南 的一部分进行全面修订。
通过提交PR帮助我们完成以下工作: MASTG v1->v2 MASTG-TEST-0025: Testing for Injection Flaws (android)
概述¶
要测试注入缺陷,您首先需要依赖其他测试并检查可能已暴露的功能。
静态分析¶
下面显示了一个易受攻击的 IPC 机制示例。
您可以使用 ContentProviders 来访问数据库信息,并且可以探测服务以查看它们是否返回数据。如果数据未正确验证,内容提供程序在与其他应用程序交互时可能会容易受到 SQL 注入攻击。请参阅以下 ContentProvider 的易受攻击实现。
<provider
android:name=".OMTG_CODING_003_SQL_Injection_Content_Provider_Implementation"
android:authorities="sg.vp.owasp_mobile.provider.College">
</provider>
上述 AndroidManifest.xml
定义了一个内容提供程序,它被导出并因此可供所有其他应用程序使用。应该检查 OMTG_CODING_003_SQL_Injection_Content_Provider_Implementation.java
类中的 query
函数。
@Override
public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(STUDENTS_TABLE_NAME);
switch (uriMatcher.match(uri)) {
case STUDENTS:
qb.setProjectionMap(STUDENTS_PROJECTION_MAP);
break;
case STUDENT_ID:
// SQL Injection when providing an ID
qb.appendWhere( _ID + "=" + uri.getPathSegments().get(1));
Log.e("appendWhere",uri.getPathSegments().get(1).toString());
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (sortOrder == null || sortOrder == ""){
/**
* By default sort on student names
*/
sortOrder = NAME;
}
Cursor c = qb.query(db, projection, selection, selectionArgs,null, null, sortOrder);
/**
* register to watch a content URI for changes
*/
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
当用户在 content://sg.vp.owasp_mobile.provider.College/students
处提供 STUDENT_ID 时,查询语句容易受到 SQL 注入。显然,必须使用预处理语句来避免 SQL 注入,但还应应用输入验证,以便只处理应用程序预期的输入。
所有通过用户界面处理传入数据的应用程序函数都应实现输入验证。
- 对于用户界面输入,可以使用Android Saripaar v2。
- 对于来自 IPC 或 URL 方案的输入,应创建一个验证函数。例如,以下确定字符串是否为字母数字:
public boolean isAlphaNumeric(String s){
String pattern= "^[a-zA-Z0-9]*$";
return s.matches(pattern);
}
验证函数的替代方法是类型转换,例如,如果只期望整数,则使用 Integer.parseInt
。OWASP 输入验证备忘单包含有关此主题的更多信息。
动态分析¶
如果已发现本地 SQL 注入漏洞,测试人员应手动使用诸如 OR 1=1--
等字符串测试输入字段。
在已获得 root 权限的设备上,可以使用命令 content
查询内容提供程序的数据。以下命令查询上述易受攻击的功能。
# content query --uri content://sg.vp.owasp_mobile.provider.College/students
可以使用以下命令利用 SQL 注入。用户可以检索所有数据,而不仅仅是 Bob 的记录。
# content query --uri content://sg.vp.owasp_mobile.provider.College/students --where "name='Bob') OR 1=1--''"