ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Webhacking.kr] Challenge 2
    Wargame/Webhacking.kr 2022. 12. 9. 07:57
    반응형

    Challenge 2를 풀어보자.
    L.O.S를 풀면서 어느 정도 SQL Injection에 익숙해졌으므로, 묵혀뒀던 문제를 풀어본다.

    문제 화면을 보면 제한 구역이라는 말로 접속을 환영해준다.
    중요한 부분은 없는 것 같으니 페이지 소스를 보도록 하자.

    <Challenge 2의 문제 화면>


    페이지 소스를 보면 방금의 환영 문구와 함께 다른 두 개의 구문이 보인다.
    처음 것은 시간을 보여주는 듯하고, 두 번째 것은 admin.php라는 힌트를 주는 것 같다.

    <Challenge 2의 source 페이지>


    힌트를 받았으니 이용을 해주는 것이 맞는 것 같다.
    url에 admin.php를 입력하니 비밀번호를 입력하는 페이지가 나왔다.
    비밀번호를 알아내 이 곳에 입력을 하면 문제가 해결될 것이라고 생각한다.

    <admin.php 비밀번호 입력 페이지>


    앞의 Challenge 처럼 Cookie 값에 힌트가 있을 것이라 생각해 확인을 해보았다.
    PHPSESSID와 time 두 가지의 Cookie가 있다.
    PHPSESSID는 놔두고, time을 건드려보면 다른 힌트가 나타날 것 같다.

    <Cookie>


    우선 time의 Value로 1을 입력하였다.
    그랬더니, 시간이 바뀌는 것을 확인할 수 있었다.

    <time의 Value로 1 입력 결과>


    1 외에도 time의 값이 변할 때마다 시간이 변하는 것을 확인할 수 있었다.
    그런데 0을 입력하니, location.href 함수가 나왔다.
    어쩌면 거짓에 대해 결과가 다를 수도 있겠다는 생각에 거짓 값을 입력하였다.
    그 결과, 09:00:00이 출력되는 것을 확인할 수 있었다.

    <거짓 입력의 결과>


    이를 통해 time의 변화로 참과 거짓, 그리고 그 결과 값도 얻을 수 있다는 것을 알았다. (Blind SQL Injection)
    L.O.S와는 달리 입력에 대한 제한 사항이 없으므로, 차례대로 비밀번호를 구해보도록 하자.

    먼저 Table의 갯수를 구해보도록 하자.
    select 문을 입력하여 Table의 갯수를 확인하니 시간의 초가 2가 되었다.
    이것의 의미는 Table의 갯수가 2개라는 의미이다.

    <Table의 갯수>


    다음으로 Table 이름의 길이를 구할 건데, limit 함수를 이용해 처음 것부터 구해보도록 하자.
    처음 Table 이름의 길이는 13이 출력된다.

    <첫 Table 이름의 길이>


    Table 이름의 길이를 알았으니, 이제 Table 명을 알면 된다.
    ascii, substr 함수를 이용해 이름을 한 글자씩 비교하며, time의 변화를 확인한다.
    60초 이후 1분이 되니, 뒤의 숫자에 60을 더하면서 답을 구하면 된다.
    97 100 109 105 110 95 97 114 101 97 95 112 119의 결과가 나오는데, admin_area_pw이다.

    이런 식으로 두 번째 Table 명도 구하면 log가 나온다.

    <Table의 이름>


    다음으로 Table의 Column을 확인해야 한다.
    이번 문제의 목표는 비밀번호를 구하는 것이니, "admin_area_pw" Table을 확인하도록 하자.

    우선 Column이 몇 개 있는지 확인하는데, 결과 값으로 1이 나왔다.

    <Column의 갯수>


    다음으로 Column 명의 길이를 구한다.
    Table 명의 길이를 구하는 것과 같은 방법으로 입력하면 2가 나온다.

    <Column의 길이>


    Column 명을 알아보도록 하자.
    길이가 2밖에 되지 않아 금방 구할 수 있는데, 결과로 112 119가 나오고 이는 pw를 의미한다.

    <Column의 이름>


    필요한 모든 정보를 알아냈다.
    이제 이 정보들을 이용해 비밀번호를 찾으면 문제는 해결된다.

    "admin_area_pw" Table의 "pw" Column에서 select 문을 이용해 비밀번호를 구하도록 하자.
    먼저 비밀번호의 길이를 구하였는데, 그 길이가 17글자다..

    <비밀번호의 길이>


    17 글자나 되는 비밀번호를 일일이 찾으려니 힘들었지만, 결국 구할 수 있었다.
    그 결과로 107 117 100 111 115 95 116 111 95 98 101 105 115 116 108 97 98이 나왔다.
    이것을 ascii 코드를 이용해 변환하니, kudos_to_beistlab이 비밀번호라는 것을 알 수 있었다.

    <비밀번호 구하기>


    admin.php 페이지로 와 구한 비밀번호를 입력하니 old-02 Pwned! 알림창이 나타나며 문제가 해결되었다.

    <Challenge 2 완료>


    SQL Injection에 조금 익숙해졌다고 생각해, 오랜만에 도전한 문제인데 아직 한참 멀었다.
    반복 작업을 하지 않기 위해 파이썬 코드를 사용했지만, 에러가 나왔다.
    문제를 푸는 방법은 알게 되었지만, 너무 비효율적으로 해결을 해버렸다.
    코드에 대해 더 공부해, 다시 도전하여 쉽게 풀 수 있도록 해야겠다.

    반응형

    'Wargame > Webhacking.kr' 카테고리의 다른 글

    [Webhacking.kr] Challenge 6  (0) 2023.01.14
    [Webhacking.kr] Challenge 5  (0) 2023.01.13
    [Webhacking.kr] Challenge 4  (0) 2023.01.12
    [Webhacking.kr] Challenge 3  (0) 2022.12.11
    [Webhacking.kr] Challenge 1  (0) 2022.09.14

    댓글

Designed by Tistory.