본문 바로가기
정보보안/wargame

[webhacking.kr] challenge(old). old-02

by 민-Zero 2020. 1. 13.

2번 문제에 들어가게 되면 다음과 같은 화면이 출력된다. 따로 들어갈 수 있는 링크 같은 것은 보이지 않고 텍스트만 존재하기 때문에 해당 페이지의 소스를 확인하자.

첫 번째 주석에 현재의 년, 월, 일 과 시간이 표현되어 있다.

두 번째 주석에 admin.php에 접근하면 엉덩이를 걷어차 버린다는 주석을 확인할 수 있다.

따라서 현재 페이지말고도 admin.php가 존재한다고 유추할 수 있다.

따라서 admin.php에 접근하기 위해 주소창에 웹서버의 web-02 디렉토리 안에 admin.php에 접속할 수 있도록 해보았다.

성공 적으로 admin.php에 접근이 되었다. admin.php에는 type your secret password라는 문구와 함께 패스워드를 제출할 수 있게 되어있다.

아무런 값을 입력해 보니 wrong password라는 알림 창이 뜨게 된다. 그럼 이제 이 password를 찾아야 할 것 같다.

해당 페이지의 쿠키값을 확인해본 결과 time이라는 쿠키 변수가 존재하고 있다.

쿠키값을 임의의 아무 숫자나 입력해보니 현재 시간을 알려주던 주석 값이 2070-01-01 09:01:51로 변경되었다. 그래서 쿠키값에 변화를 주면 무슨 동작이 일어나나 확인하기 위해 True와 False를 입력해 보았다.

아예 자체적으로 True나 1==1 과같은 True를 반환하는 식을 넣어 보니 전부 09:00:01시로 첫 번째 주석이 바뀌는 것을 확인할 수 있고

False값과 False를 반환하는 1==2 같은 식을 전달해보니 09:00:00으로 첫 번째 주석의 시간이 변경되는 것을 확인할 수 있었다.

즉, time 쿠키값이

① True인 경우는 2070-01-01 09:00:01

② False인 경우는 2070-01-01 09:00:00

을 반환하는 것을 알 수 있다.

 

따라서 admin.php의 패스워드를 알아내기 위해 time 쿠키값을 변조하여 sql injection을 시도해야 할 것 같다.

 

쿠키값을 변조를 통해 sql injection을 시도하면 참 거짓에 대한 값을 알 수 있기 때문에 db명을 바로 알아낼 수는 없다. 우선 db명이 몇 글자 인지 알아보기 위해

sql의 length함수를 이용하여 반복적으로 글자 수를 계속 확인해 보았다.

db명의 길이가 6일 때 09:00:01로 바뀌므로 db명의 길이가 6글자 임을 알 수 있게 되었다.

그럼 db명을 알아내기 위해 다음과 같은 반복적인 작업을 시도하면 될 것 같다.

 

첫 번째 글자가 'a'부터 'Z'중 어떤 글자인지 글자가 아니면 숫자 또는 기호가 들어가는지 판단하기 위해 파이썬 에서 아스키코드를 이용하여 글자 수 6개 모두 시도해 보면 된다. 반복적인 작업을 위해 파이썬을 이용해 변조된 쿠키값으로 해당 글자가 맞는지 참 거짓을 판단하기 위해 sql문을 전달하고 그에 따른 참 거짓을 알 수 있는 첫 번째 주석 부분의 문자열이 09:00:01인지 09:00:00인지를 판단해 알맞은 글자를 찾는 동일한 과정을 반복하면 될 것이다.

찾아야 할 순서는 우선 DB이름 -> DB가 가진 table -> 해당 table의 cloumn -> column이 가진 레코드 순서로 찾아내면 된다.

 

DB이름

chall2라는 db명을 알아낼 수 있다.

 

DB가 가진 table

그럼 이제 db명을 알았으므로 해당 db의 테이블명을 알아내야 한다. 위에 사용한 동일한 파이썬 코드에서 time쿠키값에 테이블명을 알아내기 위해 mysql의 메타데이터 INFORMATION_SCHEMA를 사용하여 시도했다.

따러서 chall2 db에는 2개의 테이블이 있음을 알아냈다.  admin_area_pw와 log라는 테이블이 존재하고 우리가 필요한 것은 admin.php의 비밀번호 임으로 admin_area_pw테이블을 사용하여 column을 찾아내고 해당 칼럼의 레코드를 찾아내면 끝이 해결될 것이다.

 

table의 cloumn

column을 찾아내기 위해 동일하게 INFORMATION_SCHEMA.COLUMN을 사용해보면

chall2 db의 admin_area_pw 테이블의 칼럼은 pw 인 것까지 알아냈다.

 

column이 가진 레코드

따라서 해당 칼럼의 레코드만 찾아내면 admin.php의 비밀번호를 알아낼 수 있게 된다. table과 column명을 모두 알기 때문에 select cloumn from table을 사용하여 비밀번호를 찾아내면

kudos_to_beistlab이라는 비밀번호를 찾아낼 수 있다.

 

찾아낸 비밀번호를 admin.php에 입력하면 문제가 풀리게 된다.

댓글