WebGoat(웹고트) LAB:SQL Injection - Stage 1:String SQL Injection

WebGoat(웹고트) Stage 1:String SQL Injection

 

(1) Window xp에서 http://victim:8080/WebGoat/attack 사이트로 이동하여 목록에서 Stage 1:String SQL Injection을 찾아 이동합니다.

 

(2) 사용자 입력값이 서버로 넘어가는 과정을 확인합니다.

식별정보는 사용자는 12명 중에 선택해야하고, 인증정보는 패스워드를 입력해야합니다.

 

(3) Neville Bartholomew로 로그인해보겠습니다.

=> 서버로 전달될 때 employee_id=112&password=pass&action=Login 로 전달되어야 합니다.

 

서버 내부에서는 아래와 같이 처리될 것이라 유추

=> select * from 테이블명 where userId = 112 and userPw = 'pass';

 

(3)-1 입력값 검증,제한 없이 그대로 사용되는지 확인해야합니다.

패스워드에 구문오류를 유발할 수 있는 홑따옴표(')를 포함하여 입력합니다.

=> select * from 테이블명 where userId= 112 and userPw = 'pass'';

로그인 시도
로그인 실패

=> 오류를 유발할 수 있는 입력값이 그대로 전달되어 사용되는 것을 확인할 수 있습니다.

 

(3)-2 로그인이 가능하도록 쿼리를 조작합니다.

항상 참이 되는 쿼리를 생성합니다.

=> select * from 테이블명 where userId= 112 and userPw = 'a' or 'a' = 'a';

=> PW input 값은 8글자 이상 입력할 수 없습니다. maxlenght=8 제약이 걸려있습니다.

 

(4) Proxy를 이용하여 서버로 전달되기 전에 데이터를 조작해야합니다. 

(4)-1 비밀번호에 임의의 값을 넣고 로그인을 시도합니다. 로그인을 하기 전 burp sutie에서 Intercept is on으로 설정해준 후 로그인을 시도합니다.

 

(4)-2 password 부분을 다음과 같이 조작하고, Intercept is on을 off로 변경해줍니다.

 

(5) 결과 확인

=> 서버에서는 요청 파라미터 password의 길이가 8글자 이하인지 점검하지 않았습니다. 즉, 입력값의 검증을 수행하지 않았습니다. 클라이언트에 적용한 보안 규칙과 동일 또는 그 이상의 보안 규칙을 적용해야합니다.

=> 쿼리문 생성 및 실행에 그대로 사용하기 때문에 발생하는 문제입니다.(SQL Injection)