ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <Webhacking.kr> old-33
    Wargame/Webhacking.kr 2021. 12. 15. 23:21

    old-33

    ■Challenge 33-1

    "Wrong"만 보인다.

    view-source를 통해 소스 코드를 살펴보면

    <hr>
    Challenge 33-1<br>
    <a href=index.txt>view-source</a>
    <hr>
    <?php
    if($_GET['get']=="hehe") echo "<a href=???>Next</a>";
    else echo("Wrong");
    ?>

    GET 방식으로 전달받은 get이 "hehe"이면 Next가 출력된다고 한다.

     

    페이지에 입력 폼이 없지만 GET 방식이므로 URL에 ?get=hehe를 입력하면

    Next를 통해 어디로 접속할 수 있다.

    Next를 누르면 다시 "Wrong"을 출력한다.

     

    ■Challenge 33-2

    그런데 Challenge 33-1에서 Challenge 33-2로 바뀐 것을 확인할 수 있다.

    view-source를 살펴보면

    <hr>
    Challenge 33-2<br>
    <a href=lv2.txt>view-source</a>
    <hr>
    <?php
    if($_POST['post']=="hehe" && $_POST['post2']=="hehe2") echo "<a href=???>Next</a>";
    else echo "Wrong";
    ?>

    소스 코드도 바뀌었다.

    이번엔 POST 방식으로 전달받은 post가 "hehe"이고, post2가 "hehe2"면 Next가 출력된다.

     

    개발자 도구(F12)를 통해

    <form action="./lv2.php" method="post">
        <input type="text" name="post" value="hehe">
        <input type="text" name="post2" value="hehe2">
        <input type="submit">
    </form>

    위 구문을 HTML에 넣어 수정하면

    제출하면 다시 Next를 출력하고

    Next를 누르면

    ■Challenge 33-3

    Challenge 33-3으로 바뀌었다.

    다시 view-source를 살펴보면

    <hr>
    Challenge 33-3<br>
    <a href=33.txt>view-source</a>
    <hr>
    <?php
    if($_GET['myip'] == $_SERVER['REMOTE_ADDR']) echo "<a href=???>Next</a>";
    else echo "Wrong";
    ?>

    GET 방식으로 전달받은 myip가 자신의 IP 주소와 같으면 Next를 출력한다.

    ?myip={자신의 IP 주소}를 입력하면

    Next를 누르면

    ■Challenge 33-4

    Challenge 33-4로 바뀌었고, 힌트가 주어졌다.

    이번에도 view-source를 통해 소스 코드를 살펴보면

    <hr>
    Challenge 33-4<br>
    <a href=l4.txt>view-source</a>
    <hr>
    <?php
    if($_GET['password'] == md5(time())) echo "<a href=???>Next</a>";
    else echo "hint : ".time();
    ?>

    GET 방식으로 전달받은 password가 time() 값을 md5()한 값이면 Next를 출력한다.

     

    php에서 time()은 1970년 1월 1일 0시 0분 0초부터 지금까지의 시간을 초로 나타낸다.

    힌트로 주어지는 것이 time()의 값인 것 같다.

    타이밍을 아무리해도 맞추지 못하였다.

    그래서 그냥 Python Selenium을 통해 현재 시간에 맞는 값을 자동으로 넣게했다.

    import time
    import hashlib
    import math
    from selenium import webdriver
    
    driver = webdriver.Chrome("./chromedriver")
    driver.implicitly_wait(3)
    driver.get("https://webhacking.kr/login.php")
    
    driver.find_element_by_name('id').send_keys('ID')
    driver.find_element_by_name('pw').send_keys('비밀번호')
    driver.find_element_by_class_name('submit').click()
    
    driver.get("https://webhacking.kr/old.php")
    driver.get("https://webhacking.kr/challenge/bonus-6/")
    driver.get("https://webhacking.kr/challenge/bonus-6/l4.php")
    t = hashlib.md5(str(math.ceil(time.time())-2).encode()).hexdigest()
    driver.get("https://webhacking.kr/challenge/bonus-6/l4.php?password=" + str(t))

    ■Challenge 33-5

    이번에도 view-source를 통해 소스 코드를 살펴보면

    <hr>
    Challenge 33-5<br>
    <a href=md555.txt>view-source</a>
    <hr>
    <?php
    if($_GET['imget'] && $_POST['impost'] && $_COOKIE['imcookie']) echo "<a href=???>Next</a>";
    else echo "Wrong";
    ?>

    GET 방식의 imget과 POST 방식의 impost 그리고 imcookie의 쿠키값이 참이면 Next를 출력한다.

     

    먼저 콘솔 창에 document.cookie='imcookie=1'을 입력해준다.

    그 뒤 URL에 ?imget=1을 입력해주고, 

    그리고 2번째를 풀 때 처럼 입력 폼을 만들어 값을 주고 제출하면

    (URL이 ./md555.php?imget=1 인 상태에서 해야하는 듯)

    ■Challenge 33-6

    Challenge 33-6은 User-Agent가 출력되어 있다.

    마찬가지로, 소스 코드를 살펴보면

    <hr>
    Challenge 33-6<br>
    <a href=gpcc.txt>view-source</a>
    <hr>
    <?php
    if($_COOKIE['test'] == md5($_SERVER['REMOTE_ADDR']) && $_POST['kk'] == md5($_SERVER['HTTP_USER_AGENT'])) echo "<a href=???>Next</a>";
    else echo "hint : {$_SERVER['HTTP_USER_AGENT']}";
    ?>

    test 쿠키의 쿠키값이 자신의 IP 주소에 md5 해시 함수를 적용한 값이고,

    POST로 전달하는 kk는 브라우저 정보에 md5 해시 함수를 적용한 값이어야 Next를 출력한다고 한다.

     

    콘솔 창에 document.cookie='test={자신의 IP 주소 md5 값}'을 입력하고,

    입력 폼을 만들어 힌트의 나온 값을 md5로 인코딩하여 POST로 넘겨주면 된다.

     

    ■Challenge 33-7

    소스 코드를 살펴보면

    <hr>
    Challenge 33-7<br>
    <a href=wtff.txt>view-source</a>
    <hr>
    <?php
    $_SERVER['REMOTE_ADDR'] = str_replace(".","",$_SERVER['REMOTE_ADDR']);
    if($_GET[$_SERVER['REMOTE_ADDR']] == $_SERVER['REMOTE_ADDR']) echo "<a href=???>Next</a>";
    else echo "Wrong<br>".$_GET[$_SERVER['REMOTE_ADDR']];
    ?>

    GET으로 받은 $_SERVER['REMOTE_ADDR']이 $_SERVER['REMOTE_ADDR']와 같으면 된다.

    여기서 $_SERVER['REMOTE_ADDR']은 str_replace()를 사용하여 IP 주소에서 '.'을 뺀 것이므로

    URL에 ?{IP 주소에서 . 뺀 것}={IP 주소에서 . 뺀 것}을 입력하면

    ■Challenge 33-8

    소스 코드를 보면

    <hr>
    Challenge 33-8<br>
    <a href=ipt.txt>view-source</a>
    <hr>
    <?php
    extract($_GET);
    if(!$_GET['addr']) $addr = $_SERVER['REMOTE_ADDR'];
    if($addr == "127.0.0.1") echo "<a href=???>Next</a>";
    else echo "Wrong";
    ?>

    extract()는 배열 속의 키 값을 변수화 시켜주는 함수다.

    addr 변수에 값이 없으면 addr은 IP 주소를 의미한다.

    이 addr이 127.0.0.1이면 Next를 출력한다.

    따라서 그냥 URL에 ?addr=127.0.0.1을 하면

    ■Challenge 33-9

    소스 코드를 살펴보면

    <hr>
    Challenge 33-9<br>
    <a href=nextt.txt>view-source</a>
    <hr>
    <?php
    for($i=97;$i<=122;$i=$i+2){
      $answer.=chr($i);
    }
    if($_GET['ans'] == $answer) echo "<a href=???.php>Next</a>";
    else echo "Wrong";
    ?>

    변수 i가 97부터 122까지 2씩 증가하면서 변수 answer에 chr($i)가 추가된다.

    (.= : 우항의 피연산자를 좌항 피연산자 문자열에 추가)

    즉, a 부터 z까지 한 칸씩 띄우면서 answer에 추가된다.

    URL에 ?ans=acegikmoqsuwy를 입력하면

    ■Challenge 33-10

    드디어 마지막 문제다.

    소스 코드를 살펴보면

    <hr>
    Challenge 33-10<br>
    <a href=forfor.txt>view-source</a>
    <hr>
    <?php
    $ip = $_SERVER['REMOTE_ADDR'];
    for($i=0;$i<=strlen($ip);$i++) $ip=str_replace($i,ord($i),$ip);
    $ip=str_replace(".","",$ip);
    $ip=substr($ip,0,10);
    $answer = $ip*2;
    $answer = $ip/2;
    $answer = str_replace(".","",$answer);
    $f=fopen("answerip/{$answer}_{$ip}.php","w");
    fwrite($f,"<?php include \"../../../config.php\"; solve(33); unlink(__FILE__); ?>");
    fclose($f);
    ?>

    1. 변수 ip는 IP 주소를 뜻한다.

    2. 0부터 ip의 길이까지 증가하면서, str_replace(바꿀 문자열, 치환할 문자열, 대상 문자열)을 통해 i가 ord(i)로 치환된다. 3. str_replace(".", "", $ip)를 통해 ip에 있는 점을 제거한다.

     

    4. substr(문자열, 시작위치, 추출할 문자 개수)을 통해 ip의 처음부터 10개를 가져온다.

    5. 변수 answer는 ip에 2를 곱한 값이다.

    6. 변수 answer는 ip에 2를 나눈 값이다.

    7. 변수 answer는 str_replace()를 통해 answer에 있던 점을 제거한다.

    8. fopen()은 파일을 여는 함수고, w는 파일모드 중 쓰기 전용을 뜻한다.

       현재 URL에서 "../answerip/{$answer}_{$ip}.php"을 입력한다.

    문제가 풀리게 된다.

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

    <Webhacking.kr> old-29  (0) 2021.12.21
    <Webhacking.kr> old-25  (0) 2021.12.19
    <Webhacking.kr> old-26  (0) 2021.12.12
    <Webhacking.kr> old-27  (0) 2021.12.12
    <Webhacking.kr> old-23  (0) 2021.12.06
Designed by Tistory.