R's Hacking Daily Log

SQLi (5) - Lab 본문

Port Swigger/SQL Injection

SQLi (5) - Lab

hanhxx 2023. 5. 1. 16:16

이번 글에서는 Blind SQL injection과 관련된 Lab 문제를 풀어보자!!

 

 

첫 번째 Lab )) 

:) 이 lab에서는 sql의 결과나 error 문구가 출력되지 않는 대신 "Welcome back" 문구가 페이지에 나온다고 한다.

:) username & password column을 포함하는 users table이 있고

궁극적인 목표는 admin's password를 알아내 로그인하는 것!

 

 

burp suite를 사용해 lab page를 요청하는 packet을 잡았다.

내용을 보면 Cookie : ~~ 해서 TrackingId의 값이 기재된 부분을 볼 수 있다.

 

 

본격적인 공격에 앞서 "welcome back"문구가 출력된다는 것이 어떤 말인지 확인해 보자.

cookie_value' AND SUBSTR((SELECT password FROM users WHERE username='administrator'), 1, 1) > 'm

만약 admin 계정의 비밀번호 첫 번째 문자가 m보다 큰 알파벳이라면 sql의 결과는 참이므로

"welcome back"이 출력돼야 한다.

 

 

실행해 봤더니 lab page에 조건이 참일 경우에는 welcome back 문구가 출력되고 거짓일 경우에는 아무것도

출력되지 않는 걸 확인할 수 있었다.

 

 

 

그렇다면 admin의 비밀번호를 알아내기 위해 page의 문구 출력 여부를 사용해 보자.

비밀번호 첫 번째 문자가 $value$값과 일치하는 경우만 welcome back 문구가 출력될 것이다.

intruder에서 값을 바꿀 부분을 설정해 주고 payloads로는 숫자 0~9 & 소문자 a~z까지를 넣어주었다.

 

 

첫 번째 문자에 대해 sql을 실행한 결과, 알파벳이 c일 때만 문구가 출력되어 length 값이 다른 걸 알 수 있다.

 

 

이번엔 두 번째 문자를 알아내보자.

value' AND SUBSTR((SELECT password FROM users WHERE username='admin~~'), 2 ,1) = $value$

 

 

n 번째 문자를 뽑아내기 위해서는 substr()의 두 번째 인자값을 n으로 세팅하면 된다. 

 

 

두 번째 문자는 7!

 

 

세 번째 문자는 n이다.

 

이런 식으로 모든 item의 결과가 같을 때까지 실행해 주면 admin의 비밀번호를 알아낼 수 있다.

(item의 결과가 모두 같다 = password 길이를 벗어났다)

 

 

알아낸 비밀번호로 로그인하면 성공!

 

 

!!! administrator's password : c7nk633q0phqtigvag3q


두 번째 lab ))

이번에도 cookie를 이용해 sql을 주입할 예정이다.

이전 lab과 차이점이 있다면 welcome back 문구가 출력되지 않고 error가 출력된다는 것

 

 

lab 1에서 한 것과 비슷하게 $a$를 설정해 준다.

 

 

sql을 간단히 살펴보자면 

id'||(select case when substr(password, 1, 1) = '$a') then to_char(1/0) else '' end fron users where username='administrator')||'

admin의 password 첫 번째 문자가 $s$과 일치하면 1/0 error를 발생시키고, 일치하지 않으면 빈칸을 

trackingId 뒤에 이어 붙이라는 의미이다. 

 

 

따라서 첫 번째 문자를 찾아냈을 경우에만 에러가 발생하고 나머지 경우에는 빈칸이 붙기 때문에 

정상적으로 page가 출력되는 것이다. 

 

첫 번째 문자에 대해 실행해 보니 error가 발생해 length가 굉장히 작은 item 하나를 발견할 수 있다.

비밀번호의 첫 번째 문자는 1!

 

 

자릿수를 증가시키면서 계속 실행하다 보면 전체 password를 알아낼 수 있다.

알아낸 비밀번호로 로그인하면 이번 lab도 성공이다.

 

 

!!! administrator's password = 1bdhnsqklufmgewmq9an


세 번째 lab ))

이번에는 error나 문구가 출력되지 않는다고 한다. 그래서 Cookie를 이용해 delay를 발생시켜볼 것이다.

 

다만 이 lab에서 돌아가는 DB가 무엇인지 모르기 때문에 delay function을 하나씩 실행시켜

response가 느리게 오는 경우를 찾아야 한다. 

 

 

repeater에서 실행해 보니 pg_sleep()을 사용했을 때 response가 느리게 오는 걸 확인할 수 있었다.

이 lab에서는 postgre SQL을 사용하나 보다. 

 

 

다시 proxy로 돌아와서 10초간 delay라고 했으니 pg_sleep(10)을 주입하면

 

 

성공적으로 lab이 풀렸다!!

 

 

(+) web browser 상에서는 개발자 도구를 사용하면 response가 처리되기까지 걸린 시간을 확인해 볼 수 있다.

 

 


네 번째 lab ))

이번 lab에서는 admin의 비밀번호를 알아내기 위해 delay를 사용할 것이다.

 

결과가 true인 경우에만 10초 간의 delay가 발생하도록 sql을 주입했더니

문자 하나만 paylaod 처리가 느린 걸 볼 수 있다. 

 

 

sql을 살펴보면

id' AND SELECT CASE WHEN (SUBSTR(password, 1, 1) = $a$) THEN pg_sleep(10) ELSE pg_sleep(0) END FROM users WHERE username='administrator'--

password 첫 문자를 item과 비교했을 때 일치하면 10초 간 delay를 발생, 불일치하면 delay가 발생하지 않게 된다. 

 

 

앞선 lab과 동일하게 반복해서 sql을 실행하다 보면 비밀번호가 무엇인지 알아낼 수 있다.

 

 

!!! administrator's password = i3fzzywgix7lz7wak1pl

'Port Swigger > SQL Injection' 카테고리의 다른 글

SQLi (6)  (0) 2023.05.14
SQLi (5)  (0) 2023.04.30
SQLi (4)  (0) 2023.04.28
SQLi (3) - Lab  (0) 2023.04.28
SQLi (3)  (0) 2023.04.27
Comments