syurhia 님의 블로그

PortSwigger Blind SQL injection with conditional responses 본문

보안관련/PortSwigger

PortSwigger Blind SQL injection with conditional responses

syurhia 2026. 4. 27. 18:39

이번 문제는 특수한 표현 말고는 아무런 응답도 발생하지 않을 때, SQL Injection을 해서 administrator의 비밀번호를 찾아내는 게 목적이다. Table명과 column명도 이미 알려준 상태이다. 매우 친절하게도.

table명은 users, column명은 password, username이다.

 

참고로 손으로 긴 시간동안 하나하나 확인하고 싶지 않다면 Burp Suite를 이용해서 문제를 풀어야 한다.

 

그림 0. 취약점이 존재하는 사이트

 

이번에는 쿠키 TrackingId쪽에 취약점이 존재한다고 한다. 물론 이 쿠키는 사이트에 접속하는 사람을 구별하기 위한 쿠키에 불과하다만 이번에는 SQL injection취약점이 존재한다..

TrackingId가 서버쪽에 존재하는 Id일 경우에는 "Welcome back!"이라는 문자열이 출력된다. 그림 0과 같이 말이다.

 

여기서 중요한 건, TrackingId의 값에다가 아래의 쿼리를 추가했을 때 "Welcome back!"이 나오는지 확인해줘야 한다. 나오면 sql injection이 발생한다는 뜻이니까.

' AND '1'='1

 

물론 이거하면 "Welcome back!"이 나온다. 그러라고 있는 문제니까 당연하긴 하다.

 

우리가 해야 할 것은 아래와 같은 쿼리를 쿠키에 덮어씌워 비밀번호의 길이를 확인해야 한다.

' AND LENGTH((SELECT password FROM users WHERE username='administrator'))= 17 --

중요한 건 SELECT ...와 같은 쿼리문은 괄호로 덮어줘야 쿼리로 처리된다. 

어쨌든, 이렇게 하면 길이를 확인할 수 있는데, 20문자인 걸 확인할 수 있었다. 

 

그러면 이제 비밀번호를 한 문자씩 확인해보자. 이걸 위해서는 Burp Suite가 필요하다.

 

그림 1. Payload 작성

 

그림 1과 같이 Intruder에서 쿠키에 들어갈 값을 적는다. 여기서 $$는 이 안에 들어갈 문자를 Payload(a~z, 0~9, A~Z)에서 참고해서 바꿔달라는 뜻이다. 쿼리문은 아래와 같다.

' AND SUBSTRING((SELECT password FROM users WHERE username='administrator'),1,1)='$$'--

뜻은 administrator가 들어가는 유저의 password의 첫 번째 문자가 $$이라는 것이다. 

 

SUBSTRING의 두 번째 인자가 문자열의 인덱스이니, 이걸 바꿔주면서 하나씩 비밀번호를 추출하면 된다.

 

그림 2. 비밀번호를 하나씩 추출하는 중

 

비밀번호를 하나씩 추출하는 중이다. N번째 자리의 비밀번호가 맞는 쿼리가 입력이 되었다면 "Welcome back!"이 출력될 테니까, 그게 출력된 Response를 보면 되기는 하지만, 하나하나 보기는 귀찮으니 Length를 보도록 하자.

하나만 5577인데 얘가 "Welcome back!"이 출력된 Response이다.(정답이라는 뜻)

 

참고로 굉장히 느리다. (문자를 하나하나 대조하는 형식이니 그럴만 하다.)

 

그림 3. 로그인 시도

 

이제, 얻어낸 ID와 비밀번호를 입력해보자. 내가 얻어낸 비밀번호는 'xr3bhcealuwiuklm00w2'이다.

그림 4. 성공

짜잔! 성공했다.