김승현

[webhacking.kr] old-02 2번문제 write up 본문

Web/webhacking.kr

[webhacking.kr] old-02 2번문제 write up

kshind 2023. 3. 7. 16:11

문제 분석

2단계에 접속하면 이렇게

Restricted area

Hello stranger. Your IP is logging...이라고 뜬다. 개발자도구 - Elements로 코드를 살펴보자.

살펴보면 주석이 총 두 개가 있는데 하나는 시간이고 하나는 admin.php가 있다는 내용이다.

(첫 번째 주석은 처음 접속하면 원래 내가 접속한 시간이 출력되는데 나는 이미 풀던 중에 찍은 거라 임의의 값이 나옴)

주석에서 알려준 admin.php로 가보자.

admin.php로 가면 secret passwod를 입력하라고 하는데 일단 넘어가자.

개발자 도구 - Application - cookie를 확인해보면 time이라는 쿠키가 있는 걸 확인할 수 있다.

위 사진처럼 특정 숫자를 입력하면 

2070-01-01 09:00:[입력한 값]과 같은 포맷으로 출력된다. 만약 61을 입력한다면 2070-01-01 09:01:01처럼 분으로 넘어감

숫자 말고 논리식을 입력해서 참거짓을 판별할 수도 있는데 1=1을 입력하면 1을, 1=0을 입력하면 0을 출력하기도 한다.

sql 쿼리문을 이용해서 데이터들을 조회해서 secret password를 찾아보도록 하자.

 

풀이

일단 몇 개의 테이블이 있는지부터 확인해 보자.

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

위의 쿼리문을 cookie의 time에 입력하면 테이블의 개수를 카운트해준다.

주석이 이렇게 변경된 걸로 봐선 2개의 테이블이 존재하는 것 같다.

첫 번째 테이블의 이름을 확인해 보자.

(select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema=database() limit 0,1)

위의 코드를 입력하면 첫 번째 테이블의 첫 번째 ascii코드를 얻을 수 있다. 만약 두 번째 글자가 궁금하면 

(table_name,2,1)로 바꾸면 되고 두 번째 테이블에 대해서 하고 싶다면 limit 1,1로 바꾸면 된다.

cookie의 time에 입력하면 이렇게 1분 37초가 됐는데 이건 60 + 37로 97이다. 97은 ascii에서 a를 나타낸다. 위의 코드에서 두 번째, 세번 째 글자부터 마지막 글자까지 반복해 보자. 마지막 글자를 넘어가면 글자가 없기 때문에 해당 내용은

거짓이기 때문에 2070-01-01 09:00:00으로 출력될 것이다. 

이렇게 반복하다 보면

14번째 자리에서 09:00:00이 출력되는 걸 볼 수 있다.

ascii문자들을 다 바꾸면 admin_area_pw라는 13자리 문자열을

얻을 수 있다.

이름만 봐도 admin의 password를 얻을 수 있을 것 같이 생겨서 해당 테이블의 컬럼을 확인해보자.

일단 컬럼의 개수를 확인하자.

(select count(column_name) from information_schema.columns where table_name="admin_area_pw");

위의 코드는 개수를 알려주는 쿼리문이다.

입력해보면 이렇게 1이 뜨고 컬럼의 개수는 한 개라는 걸 알 수 있다. 이젠 한 글자씩 ascii문자 형식으로 알아보자.

select ascii(substr(column_name, 1, 1)) from information_schema.columns where table_name="admin_area_pw")

위의 코드를 입력하면 ascii형식으로 반환되어 무슨 글자인지 알 수 있다.

아니면 대소문자 비교 쿼리문도 사용할 수 있다.

(select ascii(substring((select table_name from information_schema.tables where table_schema='WebHackTest' limit 0,1),2,1)) >= 105)

이렇게 하면 컬럼명이 kudos_to_beistlab인 걸 알 수 있고 이걸 admin.php에 있는 secret password 입력창에 입력하면

나는 이미 풀어서 already solved가 뜨지만 old-2 pwned! 같은 문장이 뜨면서 문제가 해결된다.