[webhacking.kr] 33번 문제 풀이[Python]

3 분 소요

💡 Webhacking.kr challenge(old) 33번 문제에 대한 풀이입니다.

문제

33번 문제는 하나의 단계를 풀면 다음 단계의 주소가 나오는 식으로 연결되며 총 10개의 문제로 구성되어 있습니다. 모든 문제를 파이썬 코드로 풀어봤습니다.

33-1

  • 문제
    <?php
    if($_GET['get']=="hehe") echo "<a href=???>Next</a>";
    else echo("Wrong");
    ?>
    
  • 풀이
    get method로 hehe 변수를 넘겨줍니다.

    def solve_1(session):
        response = session.get("https://webhacking.kr/challenge/bonus-6/?get=hehe")
        next_link = get_link(response)
        print("solve 33-1 :",next_link)
        return next_link
    

33-2

  • 문제
    <?php
    if($_POST['post']=="hehe" && $_POST['post2']=="hehe2") echo "<a href=???>Next</a>";
    else echo "Wrong";
    ?>
    
  • 풀이
    Post method로 ‘post’,’post2’ 변수에 각각 ‘hehe’,’hehe2’를 넘겨줍니다.

    def solve_2(session,next_link):
        url = BASE_URL + next_link
        datas = {
            'post' : 'hehe',
            'post2' : 'hehe2'
        }
        response = session.post(url,data= datas)
        next_link = get_link(response)
        print("solve 33-2 :",next_link)
        return next_link
    

33-3

  • 문제
    <?php
    if($_GET['myip'] == $_SERVER['REMOTE_ADDR']) echo "<a href=???>Next</a>";
    else echo "Wrong";
    ?>
    
  • 풀이
    get method로 나의 아이피를 넘겨줍니다.

    def solve_3(session,next_link):
        url = BASE_URL + next_link
        params = {
            'myip' : ip
        }
        response = session.get(url,params=params)
        next_link = get_link(response)
        print("solve 33-3 :",next_link)
        return next_link
    

33-4

  • 문제
    <?php
    if($_GET['password'] == md5(time())) echo "<a href=???>Next</a>";
    else echo "hint : ".time();
    ?>
    
  • 풀이
    현재 시간을 md5로 해시한 값을 보내줍니다

    def solve_4(session,next_link):
        url = BASE_URL + next_link
        current_time = int(time.time())
        md5_time = hashlib.md5(str(current_time).encode("ascii")).hexdigest()
        params = {
            'password' : md5_time
        }
        response = session.get(url,params=params)
        next_link = get_link(response)
        print("solve 33-4 :",next_link)
        return next_link
    

33-5

  • 문제
    <?php
    if($_GET['imget'] && $_POST['impost'] && $_COOKIE['imcookie']) echo "<a href=???>Next</a>";
    else echo "Wrong";
    ?>
    
  • 풀이
    post method로 데이터를 전송하는데, 매개변수로 ‘imget’, post 데이터로 ‘impost’, 쿠키로 ‘imcookie’를 설정해서 전송해 줍니다.

    def solve_5(session,next_link):
        url = BASE_URL + next_link
        params = {'imget': '1' }
        datas = {'impost': '1'}
        cookies = {'imcookie':'1'}
    
        response = session.post(url,data=datas,params=params,cookies=cookies)
        next_link = get_link(response)
        print("solve 33-5 :",next_link)
        return next_link
    

33-6

  • 문제
    <?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']}";
    ?>
    
  • 풀이
    Cookie로는 ‘test’이름으로 나의 ip를 해시한 값을 보내주고, post data로는 ‘kk’이름으로 USER_AGENT값을 해시해서 보내줍니다.

    def solve_6(session,next_link):
        url = BASE_URL + next_link
    
        cookie_test = hashlib.md5(ip.encode('ascii')).hexdigest()
        cookies = {'test' : cookie_test}
    
        my_user_agent = session.headers['User-Agent']
        data_kk = hashlib.md5(my_user_agent.encode('ascii')).hexdigest()
        data = {'kk':data_kk}
    
        response = session.post(url,cookies=cookies,data=data)
        next_link = get_link(response)
        print("solve 33-6 :",next_link)
        return next_link
    

33-7

  • 문제
    <?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 요청으로 문제에서와 동일하게 ‘.’을 제거한 다음에 전송합니다.

    def solve_7(session,next_link):
        url = BASE_URL + next_link
    
        replaced_ip = ip.replace('.','')
        params = {replaced_ip : replaced_ip}
    
        response = session.get(url,params=params)
        next_link = get_link(response)
        print("solve 33-7 :",next_link)
        return next_link
    

33-8

  • 문제
    <?php
    extract($_GET);
    if(!$_GET['addr']) $addr = $_SERVER['REMOTE_ADDR'];
    if($addr == "127.0.0.1") echo "<a href=???>Next</a>";
    else echo "Wrong";
    ?>
    
  • 풀이
    GET 요청으로 ‘addr’변수에 ‘127.0.0.1’을 넣어서 보내줍니다.

    def solve_8(session,next_link):
        url = BASE_URL + next_link
        params = {'addr' : '127.0.0.1'}
    
        response = session.get(url,params=params)
        next_link = get_link(response)
        print("solve 33-8 :",next_link)
        return next_link
    

33-9

  • 문제
    <?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";
    ?>
    
  • 풀이
    파이썬으로 문제에서 제시한 로직과 동일하게 구현한 다음 보내줍니다.

    def solve_9(session,next_link):
        url = BASE_URL + next_link
        answer = ''
        for i in range(97,123,2):
            answer += chr(i)
        params = {'ans':answer}
    
        response = session.get(url,params=params)
        next_link = get_link(response)
        print("solve 33-9 :",next_link)
        return next_link
    

33-10

  • 문제
    <?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);
    ?>
    
  • 풀이
    파이썬으로 문제에서 제시한 로직과 동일하게 구현한 다음 보내줍니다. 하나 다른점은 파이썬은 4/2가 2.0으로 표시되고, php는 2로 표시되어 결과가 달라서 이부분만 다르게 구현해 줍니다.

    def solve_10(session,next_link):
        url = BASE_URL + next_link
    
        session.get(url)
        my_ip = ip
    
        i = 0
        while(len(my_ip) > i):
            my_ip = my_ip.replace(str(i),str(ord(str(i)[0])))
            i +=1
        my_ip = my_ip.replace('.','')
        my_ip = my_ip[0:10]
        answer = int(my_ip) *2
        # php는 4/2가 2이고, python은 2.0이다.
        answer = int(int(my_ip) /2) if int(my_ip) %2 == 0 else int(my_ip) / 2
        answer = str(answer).replace(".","")
        flag_path  = url[:-11]+ '/answerip/{}_{}.php'.format(answer,my_ip)
        response = session.get(flag_path)
    
        print(response.text)
    

전체 코드

image

댓글남기기