跳过内容

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 注入,但还应应用输入验证,以便只处理应用程序预期的输入。

所有通过用户界面处理传入数据的应用程序函数都应实现输入验证。

public boolean isAlphaNumeric(String s){
    String pattern= "^[a-zA-Z0-9]*$";
    return s.matches(pattern);
}

验证函数的替代方法是类型转换,例如,如果只期望整数,则使用 Integer.parseIntOWASP 输入验证备忘单包含有关此主题的更多信息。

动态分析

如果已发现本地 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--''"