아래의 form 은 사용자가 계좌 번호를 입력하도록 하고, 그것이 유효한지 아닌지를 결정합니다. Database안의 다른 엔트리들을 점검하는 참/거짓 시험 개발을 위해 이 form을 사용하십시오.
목표는 cc_number가 4321432143214321인 행에 대한 pins 테이블 안의 name field 값을 찾아내는 것 입니다. field의 타입은 string인 varchar 입니다.
엔트리
Data entry: 저장할 데이터들에 대한 항목으로 보시면 됩니다. 회사 사원에 대한 데이터베이스라면 이름, 나이, 연봉 등이 될 것이고, 도서관 자료인 경우에는 책 이름, 연도, 자료 번호, 소장 위치 등이 될 것입니다.
아래 데이터베이스 구조에서 column 들을 정의한다고 보면 됩니다.
데이터베이스 구조
수 많은 데이터들을 잘 정리해서 데이터베이스(DataBase, DB)에 저장합니다.
DB 서버를 구축하기 위해 OS를 설치하고 DBMS(DataBase Management System)을 설치하게 됩니다. 주로, MSSQL, Maria DB(구, MySQL), Oracle DB 등을 설치합니다.
이 DBMS 안에서 큰 DataBase를 생성합니다. 목적에 따라 학교 구성원 DB, 도서관 자료 DB, 회사 프로젝트 DB, 연간 학업 계획 DB 등 사용하기 나름 입니다. 하나의 DBMS 안에 여러 개의 DB를 생성할 수 있습니다. C 개발할 때 많이 쓰는 Visual Studio에 비유하자면 프로젝트를 생성한다고 보면 됩니다.
이제 DataBase를 세부 분류로 나눕니다. 이것을 Table이라 부릅니다. 학교 구성원 DB라면 교사 Table, 학생 Table, 기타 직원 Table 이 될 것이며, 회사 프로젝트 DB 라면 진행 프로젝트 Table, 완료 프로젝트 Table, 진행 예정 Table 등으로 나뉠 수 있습니다.
(물론, 자세히 들어가면 정규화 등을 통해 효율적으로 만들게 됩니다.)
위와 마찬가지로 비유하자면, 프로젝트 안에 소스 폴더, 라이브러리 폴더 등을 나눈 거와 같다고 보시면 됩니다.
Table에서 자료를 조회하면 표시되는 내용은 엑셀과 같습니다. 따라서 엑셀로 설명하겠습니다.
행/raw/record: 파란색
열/column/field: 빨간색
(그림 참조: http://blog.naver.com/y166le/127426588)
풀이
Blind SQL Injection 이기 때문에 참/거짓으로 풀게 됩니다.
우선, 아래와 같이 입력해 주세요.
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );
그러면 Invalid account number 가 뜨게 됩니다. 값이 거짓으로 판명이 났기 때문입니다.
이번에는 아래와 같이 바꿔서 입력합니다.
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) = 'J' );
이번에는 Account number is valid 가 뜹니다. 값이 참으로 판명됐기 때문입니다.
일반적으로 substring 함수는 인자 값을 시작위치부터 원하는 길이만큼 자르는 함수입니다. 위에 입력한 것은 쿼리의 결과값을 첫 번째부터 한 글자만 가져와 그 다음에 입력한 문자와 비교를 한다는 의미입니다.
따라서, 쿼리 다음의 첫 번째 숫자가 비교할 문자의 위치이기 때문에 이를 바꿔가며 계속 시도하면, 정답은 Jill 이 됩니다. 이를 다시 입력하면 문제는 풀리게 됩니다.