EYEN
DIVA 7단계 본문
#1 문제 분석
가. 목적
모든 유저 데이터에 유저 이름 모르고 접근하기를 시도하자.
기본으로 3명의 유저가 있고 하나의 악한 검색을 통해 모든 유저의 데이터를 출력해보자.
나. 활용
소스코드, adb
#2 취약점 정보
가. 취약점
옳지 않거나 없는 입력조건 문제는 입력값이 쓰이기 전에 필터링되지 않거나 유효성을 확인하지 않을 때 발생한다.
외부에서 입력받는 컴포넌트를 개발할 때 유효성을 확인해라. 한명이 admin이면 admin을 찾아봐라
나. 취약점 확인법
sqlinjection 비스무리하게 시도하기
문제에서는 유저 이름만 검색해도 나온다.
다. 취약점인 이유
입력 유효성을 검증하지 않으면 xss, sqlinjection 공격에 취약할 수 있다.
라. 저렇게 개인정보를 출력하는 경우? 혹은 입력값의 유효성을 확인하지 않는 경우?
실수!
#3 코드 분석
내용:
onCreate:
sqli라는 DB를 만듦-> DB에 sqliuser라는 테이블을 만듦-> 테이블에서 스키마들을 정의해줌-> 값넣음 3개
search:
srchtxt라는 입력칸 객체를 만들어서 입력받음-> 커서 객체가
1.
import android.database.Cursor;
특정 데이터베이스 쿼리를 실행한 후, 그 결과로 반환되는 데이터 집합을 순회하고 읽을 수 있는 메서드들을 제공
일반적으로 Cursor는 SELECT 쿼리를 실행한 후 결과 집합을 순회할 때 사용됩니다
2.
Cursor cr = this.mDB.rawQuery("SELECT * FROM sqliuser WHERE user = '" + srchtxt.getText().toString() + "'", null);
커서 객체에서 mDB 데이터베이스에 사용자 입력한 값과 동일한 user가 있는지 퀴리문을 보냄
그리고 출력된 결과들을 cr에 저장
4.
StringBuilder strb = new StringBuilder("");
가변 문자열을 만들기 위한 클래스, 문자열을 동적으로 추가하고 변경할 수 있다.
문자열을 변경할 때마다 새로운 문자열 객체를 생성하는 것보다 효율적이라서 사용
빈문자열로 초기화된 StringBuilder객체를 생성한다
5.
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");
커서 객체가 널이 아니고 커서개수가 0보다 클 때 moveToFirst 실행
그리고 스트링빌더 객체에 쿼리에 대한 응답인 cr을 각각 user, pass, credit card로 옮겨서 출력
끝날 때까지 계속 옆으로 옮겨가면서
처음부터 아예 없으면 사용자가 입력한 값 없다고 출력
#4 취약점 예방
입력값 검증 방법
1. 길이 제한
if (input.length() >= 8 && input.length() <= 20)
2. 형식 검사
String emailPattern = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+"
3. 입력 제한
if (!input.contains(";") && !input.contains("'"))
4. 값의 범위 검사
if (number >= 1 && number <= 100)
5. 입력값 검증 라이브러리 사용-Apache Commons Validator
if (GenericValidator.isEmail(input))