3. Insecure Data Storage(안전하지 않은 데이터 저장소)
[Part 1]
1) 3. Insecure Data Storage - Part1에 접속합니다.
목표: 자격 증명이 저장되는 위치와 방법, 취약한 코드를 찾기
힌트: 불안전한 데이터 저장은 시스템에 기밀 정보를 안전하지 않게 저장한 결과로 암호화가 불충분하거나, 평문으로 저장되거나, 접근 제어 문제가 있는 경우 등을 포함
아마 특정 정보가 저장되는 과정 중 취약한 부분이 있는 것으로 추측됩니다. 우선 이름과 비밀번호를 입력 후 SAVE 버튼을 클릭해 보겠습니다.
2) name에 'test' password에 '123321' 입력 후 SAVE 버튼 클릭 시 성공적으로 저장됐다는 메시지가 출력됩니다. 해당 과정을 상세히 알아보기 위해 출력된 문자열을 jadx에서 검색해 보겠습니다.
3) 해당 문자열이 존재하는 InsecureDataStorage1Activity 내 saveCredentials 메서드를 확인해 보겠습니다. 해당 메서드는 사용자가 입력한 이름과 비밀번호를 'SharedPreferences'에 저장하는데 'SharedPreferences' 앱에서 간단한 데이터를 저장하고 불러오는데 사용되며 여기서 입력된 이름과 비밀번호는 각각 'user', 'password'로 저장됩니다. 그리고 저장이 완료되면 우리가 확인했던 "3rd party~..." 메시지를 출력합니다. 그럼 adb를 통해 앱 내 디렉터리를 확인해 보겠습니다.
4) 설치된 패키지 디렉터리로 이동 시 (/data/data/jakhar.aseem.diva/) 해당 경로 안에 shared_prefs 디렉터리가 존재합니다. 해당 디렉터리로 이동합니다.
5) 해당 디렉터리 안에는 'jakhar.aseem.diva_preferences.xml' 파일이 존재했고 cat 명령어를 통해 확인한 결과 우리가 입력했던 이름과 비밀번호(test/123321)가 저장되어 있는 것을 확인하였습니다.
[Part 2]
1) 4. Insecure Data Storate - Part2에 접속합니다. Part1과 마찬가지로 이름과 비밀번호(test2/123321)를 입력 후 SAVE 버튼을 클릭 시 Part1과 동일한 문자열이 출력됩니다. 해당 문자열을 jadx에 검색하여 문자열이 존재하는 메서드를 확인해 보겠습니다.
2) 해당 메서드는 'EditText'라는 위젯을 통해 입력된 사용자 이름과 비밀번호를 가져와 INSERT 문을 사용하여 테이블 'myuser'에 저장합니다. 코드상으로 비밀번호값이 암호화가 되지 않았으며 사용자 입력값이 직접 쿼리에 들어가기 때문에 SQL Injection 공격에도 취약한 것을 학인할 수 있습니다. 해당 값은 onCreate 메서드를 보면 알 수 있듯이 ids2라는 DB에 저장됩니다.
3) /data/data/jakhar.aseem.diva/databases/ 경로로 이동시 ids2라는 파일이 찾을 수 있는데 sqlite를 통하여 확인해 보겠습니다.
4) 테이블 확인 시 'myuser' 테이블이 있는 것을 확인하였으며 select 명령어를 통해 조회 시 처음 입력했던 아이디와 비밀번호(test2/123321)가 평문으로 저장된 것을 확인하였습니다.
[Part 3]
1) 5. Insecure Data Storate - Part3에 접속합니다. 이름과 비밀번호를 입력 후 SAVE 버튼을 클릭하여 출력된 메시지를 검색. 해당 문자열이 존재하는 메서드로 이동하여 확인해 보겠습니다.
2) 해당 메서드는 사용자 이름과 비밀번호를 파일에 저장하는 메서드입니다. 'Edittext' 위젯을 통해 이름과 비밀번호를 입력받은 후 애플리케이션 디렉터리 경로를 얻어 임시파일을 생성합니다.
생성된 파일에 읽기 및 쓰기 권한을 설정하고 'FileWriter'를 사용하여 파일에 사용자 이름과 비밀번호를 저장한 후 성공했다는 메시지를 표시합니다. 해당 메서드 역시 평문으로 비밀번호를 저장한다는 문제가 있으며 해당 파일이 임시파일이며 다른 앱에서 접근할 수 있는 등 여러 문제점이 발생할 수 있습니다.
3) 패지지 경로(/data/data/jakhar.aseem.diva/)에 이동 후 확인해 보면 기존에는 존재하지 않았던 tmp파일이 생성된 것을 확인하였습니다. cat 명령어를 통해 확인 시 입력했던 이름과 패스워드가 저장되어 있는 것을 확인하였습니다.