WebView webView = new WebView();
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new MyClass(), "mycls");
webView.loadURL("<http://www.foo.com>");
위와 같이 WebView를 생성하면, WebView 내 웹페이지에서 <script>mycls.method();</script> 와 같이 메소드를 호출할 수 있다.
jd-gui로 Java 코드를 확인했다.
webView.getSettings().setJavaScriptEnabled(true);
setJavaScriptEnabled(true)로 설정하여 JavaScript 코드를 webview를 통해 실행 가능하도록 (XSS, SSTI 등 가능) 설정하여 취약하다.
로그인 시 View Statement 메뉴가 있으므로, 해당 메뉴에서 사용되는 코드일 것이다.
PostLogin 코드에서도 statement_button을 클릭하는 경우 viewStatement 함수를 호출하는 것을 확인할 수 있다.
View Statement을 누르면 Toast 메시지로 Statement does not Exist!! 를 출력한다.
Statements_<uname>.html 파일이 존재하지 않기 때문에 해당 Toast 메시지가 출력됨을 알 수 있다.
Statements_<uname>.html 파일이 있는 경우, file://<ExternalStorageDirectory>/Statements_<uname>.html 형태의 url을 로드 해준다.
Environment.getExternalStorageDirectory() : 외부 저장소(SD카드)의 최상위 경로로, /mnt/sdcard 또는 /storage/emulated/0 등에 해당한다.
uname이 username이라고 예측을 하고, /mnt/sdcard 경로에 Statements_jack.html 파일과 Statements_dinesh.html 파일을 만들었다.
html 파일이 로드된 것을 확인할 수 있다.
JavaScript가 Enabled 되어 있고, WebView에서 사용하는 file schema가 file:// 이므로, 애플리케이션 내 정보를 불러오도록 코드를 작성할 수 있다.
어디에서 exploit 코드를 작성할 수 있을까?
DoTransfer.class 코드를 보면, From과 To, Amount에서 값을 가져와서 해당 내용을 Statements_<username>.html 파일에 저장한다. Transfer Failed이어도 실패한 계좌이체 정보를 저장한다.
From, To, Amount 모두 임의의 JavaScript 코드를 작성하여 실행할 수 있고, Amount에 alert 창을 띄우는 코드를 작성한 후 Transfer을 클릭했다.
View Statement에서 위와 같이 JavaScript 코드가 실행되어 alert 창을 띄우는 것을 확인할 수 있다. (XSS 취약점)
(한 번 생성된 Statement 파일을 계속 사용하기 때문에, 다른 스크립트를 넣어서 테스트 해보려면 /mnt/sdcard/ 경로의 Statement_<uname>.html 파일을 삭제해야 한다.)
DoTransfer 코드에서 SharedPreferences sharedPreferences = DoTransfer.this.getSharedPreferences("mySharedPreferences", 0); 으로 mySharedPreferences로 SharedPreferences 객체를 생성하고, mySharedPreferences.xml 파일에는 superSecurePassword가 저장되어있는 것을 확인할 수 있다. SharedPreference는 데이터를 파일 이름으로 xml 파일 형태로 저장해서 관리한다. data/data/(package_name)/shared_prefs/ 경로에 위치한다. 패키지 이름이 com.android.insecurebankv2이므로, /data/data/com.android.insecurebankv2/shared_prefs/mySharedPreferences.xml 에 superSecuredPassword 값을 확인할 수 있을 것이다.
<script>
location.href="/data/data/com.android.insecurebankv2/shared_prefs/mySharedPreferences.xml"
</script>
base64로 인코딩된 superSecurePassword 값을 확인할 수 있다.
디코딩 시 각각 사용자 이름, 패스워드의 민감한 정보임을 알 수 있다.
Exploiting Android WebView Vulnerabilities
Android WebView Vulnerabilities
https://people.eecs.berkeley.edu/~daw/papers/bifocals-wisa13.pdf
[Android Reversing] Application Patching (0) | 2021.07.06 |
---|---|
[Android Reversing] Weak Cryptography implementation (취약한 암호화 취약점) (0) | 2021.07.06 |
[Android Reversing] Insecure Content Provider access (Content Provider 취약점) (0) | 2021.07.06 |
Drozer 설치 (Windows) (0) | 2021.07.06 |
[Android Reversing] InsecureBankv2 설치 (feat. Bluestacks) (0) | 2021.07.02 |