
document.write(a.value);
사용자가 입력한 값이 HTML로 해석되면서 공격자가 임의의 태그나 JavaScript 코드를 삽입 가능
webSettings.setJavaScriptEnabled(true);
가 설정되어 있기 때문에 HTML Injection에서 끝나는 것이 아니라 JavaScript 실행까지 이어질 수 있음
#페이로드
<script>javascript:alert(1)</script>
기본적인 <script>alert(1)</script>는 실행되지 않고 해당 페이로드가 실행되는 것을 확인했는데 여기서 javascript:가 js 문법상 label로 해석될 수 있으며 이는 Android Webview에서 document.write()로 동적으로 HTML을 삽입하는 과정의 파싱 및 실행 동작 차이로 확인했다.


문제속 핵심은 다음과 같다
String qry = "SELECT * FROM users WHERE username='" + ((Object) $username.getText()) + "'";
jadx로 역컴파일 하여 확인한 것이므로 (Object)를 제외하고 본다면
SELECT * FROM users WHERE username='(입력값)'
이런식으로 전달될 것이므로 이스케이프하여 페이로드를 작성
# 페이로드
'or 1=1 --

# js 실행 허용
webViewSettings.setJavaScriptEnabled(true);
# file://을 통한 파일 접근 허용
webViewSettings.setAllowFileAccess(true);
# content:// 접근 허용
webViewSettings.setAllowContentAccess(true);
# file:// 페이지의 js가 다른 file:// `리소스`에 접근 허용
webViewSettings.setAllowFileAccessFromFileURLs(true);
# file:// 페이지의 js에 다른 origin 접근 허용
webViewSettings.setAllowUniversalAccessFromFileURLs(true);
setAllowUniversalAccessFromFileURLs(true) 설정으로 인해 file:// origin에서 실행되는 JavaScript의 접근 범위가 확대된다.
문제 코드 속 다음 설정들이 존재하기 때문에 맞춰서 페이로드를 작성해준다.
