WebGoat

WebGoat (5)

홍시뗄레 2025. 3. 17. 17:49

[실습2-11] SQL Injection(advanced) -2

내 계정이 아니라 Tom 계정으로 로그인하는 것이 목표이다.

우선 회원가입 시도를 해보자. 다 test로 계정을 만들어주었다.

이렇게 버프 스위트로 잡으면 밑에 이렇게 뜬다.

response를 보면 user test created라고 뜬다. 그럼 이제 이 request를 리피터에 넣고 다시 시도해보자.

다시 send하면 이미 test 라는 사용자 계정이 존재한다고 뜬다. 그러면 test1로 시도해보자.

이렇게 test1가 성공적으로 만들어졌다고 뜬다. 이로써 유추할 수 있는 게 생겼다. 

먼저 중복 조회를 하고, insert를 하는 것 같다.

test' 라고 쓰니 문제가 발생한 것으로 보인다.

test'||'라고 쓰니까 이미 존재한다고 한다. sql injection에 취약하다는 것을 확인할 수 있다!

해당 부분이 취약하다. 

이제 tom도 해보자.

tom도 계정이 존재한다. 이제 얘 패스워드를 알아내야 한다. 

 

select * from member where username=''

얘는 원래 상태이고

select * from member where username='tom' and length(password)>0--'

tom' and length(password)>0--'

이 값을 넣어주자.

tom'+and+length(password)>0--'

이렇게 넣어야 공백 문자를 포함할 수 있다.

이렇게 넣어보면 0보다 당연히 크기 때문에 이미 있다고 뜬다. 계속해서 뒤에 있는 숫자를 늘려가며 created가 뜰 때까지 해보아야 한다. 

23라고 하면 created라고 뜨고, 22라고 하면 이미 존재한다고 하므로 password 길이는 23자임을 확인할 수 있다.

다음으로는 하나하나씩 알아내야 한다.

tom'+and+substring(password,1,1)='a'--'

이렇게 하나하나씩 하기엔 너무 힘들다.

 

Blind-Based 데이터 추론 기법

1) 순차 탐색

2) 이진 탐색 => 32 ~ 126

여기서 크기가 더 큰지 확인해보는 것. 

3) 비트 탐색 

 

이진 탐색으로 해보자.

tom'+and+ascii(substring(password,1,1))>80--'  

이미 존재한다고 뜨면 참이라는 뜻이다. 다음에는 100으로 해서 어쩌구저쩌구 찾아보자. 

찾아보니 116번이다.

첫번째 문자는 t라는 것을 알 수 있다. 

두번째는 104. h이다. 

세번째는 105. i이다.

네번째는 115. s이다. 

이렇게 계속해서 하면 답이 나온다. 

 

thisisasecretfortomonly

 

휴 힘들었다

이렇게 하나하나 23자리까지 다 하면 끝!

'WebGoat' 카테고리의 다른 글

WebGoat (6)  (0) 2025.03.18
WebGoat (4)  (0) 2025.03.17
WebGoat (3)  (0) 2025.03.12
WebGoat (2)  (0) 2025.03.10
WebGoat(1)  (0) 2025.03.10