
Challenge 2 시작!

무엇을 의미하는지 모르겠다. 바로 소스코드를 보았다.

주석으로 time 정보가 적혀있다.
그리고 admin.php를 언급하고 있다.

접근해보니 어떤 비밀번호를 입력하라고 한다. 이 비밀번호를 알아내는 것이 이번 문제인 듯 하다.
일단 관리자 페이지에 들어가서 쿠키값을 확인해보았다.

time 이라는 쿠키값이 존재하고 있었다.
혹시나 하고 이 값을 패스워드에 입력해 보았지만 맞지 않았다.
그렇다면 쿠키값은 무엇을 의미할까 생각하다가 값을 1로 바꿔보았다.
그런데 다음과 같이 주석의 time 값이 바뀌는 것을 발견하였다.

이번에는 0으로 바꿔보았다.

0은 그대로다.
1일때 바뀌었다면 참, 거짓이 아닐까 생각했는데 0일때는 그대로였다.
일단은 1=1로 다시 바꿔보았다.

1과 동일하다. 그러면 1=2 는 어떻게 될까?

다르다!
생각한대로 참, 거짓일 때 값이 다른 것 같다.
그럼 이 조건을 이용하면 Blind SQL Injection 을 수행하여 비밀번호를 알아낼 수 있지 않을까?
먼저 비밀번호 정보가 들어있는 테이블을 찾으려면 DB부터 알아야 한다.
DB를 조회하는 select database() 라는 쿼리로 DB의 길이와 값을 알아내는 Python 코드를 작성하였다.

쿼리로 가져온 DB 이름의 길이를 length() 함수를 이용하여 비교한 뒤 같으면 참이 되어 '09:00:01' 가 출력되는 점을
이용하여 작성하였다. DB 이름도 마찬가지로 substr() 함수를 이용하여 각 자리마다 값을 비교하였다.

그 결과, DB명이 chall2 라는 것을 알 수 있었다.
다음은 찾아낸 DB명을 통해 테이블명을 알아내보자!
테이블명을 알아내기 위해서는 메타데이터인 INFORMATION_SCHEMA 를 이용해야 한다. 쿼리는 다음과 같다.
select table_name from information_schema.tables where table_schema='chall2' limit 0,1
limit 0,1 은 테이블의 첫 번째 값만 가져온다는 것으로 limit 1,1 로 쿼리를 보냈을 때 참이 된다면 table이
두 개 이상이라는 의미이다. 일단은 limit 0,1 로 테이블명의 길이와 값을 알아내는 Python 코드를 작성하였다.

쿼리를 제외하고는 DB명을 찾을 때랑 코드가 같다.

admin_area_pw 라는 테이블명을 찾았다!
limit 1,1 로 수정한 뒤 다시 쿼리를 돌려보았다.

테이블이 하나 더 있었다. limit 2,1 로 돌렸을 때는 테이블이 존재하지 않았다.
그럼 테이블은 두개라는 건데 일단은 admin_area_pw 에 문제에서 원하는 답이 있을 것 같다.
다음은 admin_area_pw 테이블의 컬럼 값을 찾아보자!
컬럼 값을 찾는 쿼리는 다음과 같다.
select column_name from information_schema.columns where table_name='admin_area_pw' limit 0,1
이 쿼리를 이용하여 마찬가지로 Python 코드를 작성하였다.

limit 를 이용하여 찾아보니 컬럼은 한 개만 존재하였고 이름은 pw 였다.
이제 거의 다 온 것 같다!
마찬가지로 Python 코드를 이용하여 pw 의 값을 알아내보자!

쿼리는 간단하게 그냥 admin_area_pw 에서 pw를 조회하면 된다.

패스워드는 kudos_to_beistlab 이다.
이 값을 이제 admin.php 에 입력하면 될 것 같다.

성공!!
'WarGame > webhacking.kr' 카테고리의 다른 글
| Challenge 8 (0) | 2020.02.14 |
|---|---|
| Challenge 7 (0) | 2020.02.14 |
| Challenge 5 (0) | 2020.02.08 |
| Challenge 3 (0) | 2020.01.31 |
| Challenge 1 (0) | 2020.01.31 |