#0. 학습 목표
가. 코드 해석을 빠르게 하도록 디바의 코드 한 줄 한 줄이 무슨 의미인지 알기.
나. 나중에 비슷한 코드를 봤을 때 취약점인 줄 알도록 취약점 있는 코드와 취약점 원인인 라인알기, 보호기법이 씌워진 코드와 비교하기
#1 문제 분석
가. 목적
민감정보가 어디에서 어떻게 저장되고 취약한 코드가 어디있는지 알기
나. 활용
소스코드, adb
#2 취약점 정보
가. 취약점
myuser라는 테이블에 VARCHAR형의 user, passwd라는 이름으로 저장된다는 것을 알 수 있다.
나. 민감정보가 저장되는 곳을 노출하는 게 취약점인 이유
공격자가 공격할 SQL쿼리문을 결정할 때 유용하게 쓰임
#3 코드 분석
java 코드이다.
1.
public class InsecureDataStorage2Activity extends AppCompatActivity
이 클래스는 InsecureDataStorage2Activity.java파일에 정의되어있을 것.
2.
private SQLiteDatabase mDB;
SQLiteDatabase는 안드로이드에서 SQLite 데이터베이스를 다루는 데 사용되는 클래스, DB를 생성 관리, 데이터 쿼지 및 조작시 사용
mDB는 SQLite 데이터베이스에 대한 참조를 저장하는 변수
3.
this.mDB = openOrCreateDatabase("ids2", 0, null);
ids2: 데이터베이스의 이름
0: 읽기와 쓰기 모두가 가능한 데이터베이스의 모드
null: DB를 열 때 사용할 CursorFactory
4.
this.mDB.execSQL("CREATE TABLE IF NOT EXISTS myuser(user VARCHAR, password VARCHAR);"
mDB라는 DB객체에서 SQL문 실행
myuser라는 테이블 없으면 만들기 user password 모두 VARCHAR형
대놓고 DB를 노출하는 모습! sql injection시 유용하게 쓰일 정보인 듯하다.
5.
catch (Exception e) {
Log.d("Diva", "Error occurred while creating database: " + e.getMessage());
Diva는 로그 태그, e.getMessage(): 오류메시지 받아오는 메서드
6.
setContentView(R.layout.activity_insecure_data_storage2);
레이아웃에 activity~storage2.xml에 있다는 뜻
8.
EditText usr = (EditText) findViewById(R.id.ids2Usr);
ids2Usr라는 id를 가진 view에서 값을 가져와 EditText형으로 바꿔서 입력칸 usr변수에 저장
9.
this.mDB.execSQL("INSERT INTO myuser VALUES ('" + usr.getText().toString() + "', '" + pwd.getText().toString() + "');");
mDB객체에서 SQL문을 실행하여 사용자로부터 입력받은 값에서 텍스트 가져와서 스트링형으로 변환해서 insert하는 메서드
10.
this.mDB.close();
아까 연 mDB 객체 닫기
#4 취약점 예방