Diva 풀이 7~8번 (Input Validation Issues Part 1~2)

Input Validation Issues - Part 1

Source Code

package jakhar.aseem.diva;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

/* loaded from: classes.dex */
public class SQLInjectionActivity extends AppCompatActivity {
    private SQLiteDatabase mDB;

    /* JADX INFO: Access modifiers changed from: protected */
    @Override // android.support.v7.app.AppCompatActivity, android.support.v4.app.FragmentActivity, android.support.v4.app.BaseFragmentActivityDonut, android.app.Activity
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            this.mDB = openOrCreateDatabase("sqli", 0, null);
            this.mDB.execSQL("DROP TABLE IF EXISTS sqliuser;");
            this.mDB.execSQL("CREATE TABLE IF NOT EXISTS sqliuser(user VARCHAR, password VARCHAR, credit_card VARCHAR);");
            this.mDB.execSQL("INSERT INTO sqliuser VALUES ('admin', 'passwd123', '1234567812345678');");
            this.mDB.execSQL("INSERT INTO sqliuser VALUES ('diva', 'p@ssword', '1111222233334444');");
            this.mDB.execSQL("INSERT INTO sqliuser VALUES ('john', 'password123', '5555666677778888');");
        } catch (Exception e) {
            Log.d("Diva-sqli", "Error occurred while creating database for SQLI: " + e.getMessage());
        }
        setContentView(R.layout.activity_sqlinjection);
    }

    public void search(View view) {
        EditText srchtxt = (EditText) findViewById(R.id.ivi1search);
        try {
            Cursor cr = this.mDB.rawQuery("SELECT * FROM sqliuser WHERE user = '" + srchtxt.getText().toString() + "'", null);
            StringBuilder strb = new StringBuilder("");
            if (cr != null && cr.getCount() > 0) {
                cr.moveToFirst();
                do {
                    strb.append("User: (" + cr.getString(0) + ") pass: (" + cr.getString(1) + ") Credit card: (" + cr.getString(2) + ")\n");
                } while (cr.moveToNext());
            } else {
                strb.append("User: (" + srchtxt.getText().toString() + ") not found");
            }
            Toast.makeText(this, strb.toString(), 0).show();
        } catch (Exception e) {
            Log.d("Diva-sqli", "Error occurred while searching in database: " + e.getMessage());
        }
    }
}

Solution

우선 해당 앱이 실행이 되면, sqli 명의 database가 생성이 된다.

그리고 user VARCHAR, password VARCHAR, credit_card VARCHAR 값을 담는 테이블을 만들어서, john diva admin이라는 3개의 user values를 생성해 insert한다. 실행이되고, 생성된 것을 아래 경로에서 확인할 수 있다.

해당 코드를 보면, 입력값을 받고, user name 값을 이용해 바로 query를 실행한다. 그리고 그 결과로 얻은 값들 user, password, credit_card 값들을 Toast로 화면에 띄워서 보여준다.

이렇게 하면 어떤 검증도 없이 name 값을 입력해서 admin 계정 탈취의 위험이 있다. 실제 본인이 아닌 다른 user의 값을 검색하면 제한된 정보를 보여주거나 혹은 그런 기능을 검증을 통해서 제한시켜야 한다.

Input Validation Issues - Part 2

Source Code

package jakhar.aseem.diva;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.EditText;

/* loaded from: classes.dex */
public class InputValidation2URISchemeActivity extends AppCompatActivity {
    /* JADX INFO: Access modifiers changed from: protected */
    @Override // android.support.v7.app.AppCompatActivity, android.support.v4.app.FragmentActivity, android.support.v4.app.BaseFragmentActivityDonut, android.app.Activity
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_input_validation2_urischeme);
        WebView wview = (WebView) findViewById(R.id.ivi2wview);
        WebSettings wset = wview.getSettings();
        wset.setJavaScriptEnabled(true);
    }

    public void get(View view) {
        EditText uriText = (EditText) findViewById(R.id.ivi2uri);
        WebView wview = (WebView) findViewById(R.id.ivi2wview);
        wview.loadUrl(uriText.getText().toString());
    }
}

Solution

해당 코드에서는 입력창에 url 경로를 입력하면 그 경로를 보여준다. 아래는 https://www.naver.com 경로를 입력창에 입력하면 해당 경로에 접속을 하는 창을 띄워준다.

wview.loadUrl(uriText.getText().toString()); 를 보면 충분한 검증을 하지 않고 해당 경로를 Load하기 때문에 아래와 같이 URL에 내부 파일을 요청할 수 있는 file:// 형식으로 요청하게 되면 해당 경로의 파일 내용을 확인할 수 있다.