일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- THM
- active recon
- Cryptography
- php 파일 업로드하기
- file upload
- php login page
- php
- active reconnaissance
- Cookie
- php file upload
- War Game
- 파일 업로드 취약점
- Authentication
- Server Side Request Forgery
- access control
- over the wire
- BANDiT
- Leviathan
- Reconnaissance
- Recon
- sql injection
- overthewire
- php 로그인 페이지 만들기
- tryhackme
- ssrf
- SQLi
- OS Command Injection
- privilege escalation
- php To Do List
- FTZ
- Today
- Total
R's Hacking Daily Log
SQLi (5) - Lab 본문
이번 글에서는 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 |