[webhacking.kr] old-33

asdf·2일 전

web

목록 보기
3/10

https://webhacking.kr/challenge/bonus-6/

GET&POST 관련 문제입니다. 총 10개의 Challenge로 구성되어 있으며, 각 문제를 해결하면 다음 문제로 이동할 수 있는 경로를 생성합니다.

33-1

<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 링크가 나타난다.
URL 뒤쪽으로 ?get=hehe를 추가하면 Next가 나타난다.

33-2

<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";
?>

2번 문제는 GET이 아닌 POST를 사용해야 한다. POST는 URL로 변수 값을 지정할 수 없기 때문에 python으로 POST 전송을 수행하겠습니다.

import requests

url = "https://webhacking.kr/challenge/bonus-6/lv2.php"
data = {"post" : "hehe", "post2" : "hehe2"}

response = requests.post(url, data = data)
print(response.text)

post와 post2 값을 지정해준 뒤 response를 출력하면 <a href=33.php>Next</a> 처럼 Next 경로를 얻을 수 있습니다.
https://webhacking.kr/challenge/bonus-6/33.php 로 이동하겠습니다.

33-3

<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 값을 $_SERVER['REMOTE_ADDR']으로 변환하여 전송해야 하는 문제입니다.
$_SERVER['REMOTE_ADDR']는 현재 웹 페이지에 접속한 사용자의 IP 주소를 가져올 때 사용하는 변수입니다.
내 아이피 확인(https://ip.pe.kr/) 사이트에서 IP를 확인할 수 있습니다.
확인한 후 ?myip=내 아이피를 URL 뒤에 붙여 GET 전송을 수행하면 Next를 얻을 수 있습니다.

33-4

<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();
?>

4번 문제는 time()을 md5 해시로 암호화한 값을 GET으로 전송하는 문제입니다.

import requests
import hashlib
import time

url = "https://webhacking.kr/challenge/bonus-6/l4.php"
password = hashlib.md5(str(int(time.time()) + 1).encode()).hexdigest()
print("password: ", str(int(time.time()) + 1).encode())
data = {"password" : password}

response = requests.get(url, params=data)
print(response.text)

hashlib을 사용하여 md5 해시 함수로 암호화를 수행할 수 있습니다.
password 값을 time()을 md5로 암호화한 값으로 설정합니다. time + 1을 한 이유는 네트워크 지연을 보정하기 위한 것입니다.
코드를 실행하면 <a href=md555.php>Next</a>를 얻을 수 있습니다.

33-5

<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라는 cookie를 TRUE로 만들어야 하는 문제입니다.

import requests

url = "https://webhacking.kr/challenge/bonus-6/md555.php"
get_data = {"imget" : "1"}
post_data = {"impost" : "1"}
my_cookies = {"imcookie" : "1"}

response = requests.post(url, params=get_data, data=post_data, cookies=my_cookies)
print(response.text)

requests의 cookies로 쿠키를 설정할 수 있습니다. requests.post의 params를 이용하면 GET과 POST를 동시에 전송할 수 있습니다.
실행 결과는 <a href=gpcc.php>Next</a>입니다.

33-6

<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의 쿠키 값은 md5($_SERVER['REMOTE_ADDR']), kk는 md5($_SERVER['HTTP_USER_AGENT']))를 POST로 전송해야합니다.
$_SERVER['HTTP_USER_AGENT']는 접속한 사용자가 어떤 브라우저(Chrome, Safari 등)와 어떤 운영체제(Windows, Mac, iOS 등)를 사용해서 웹사이트에 접속했는지에 대한 정보를 담고 있는 변수입니다.

import requests
import hashlib

url = "https://webhacking.kr/challenge/bonus-6/gpcc.php"
post_data = {"kk" : hashlib.md5("python-requests/2.32.5".encode()).hexdigest()}
my_cookies = {"test" : hashlib.md5("MY IP".encode()).hexdigest()}

response = requests.post(url, data=post_data, cookies=my_cookies)
print(response.text)

한 번 실행을 하여 얻은 hint를 그대로 md5로 암호화를 하여 전송하였습니다.
결과는 <a href=wtff.php>Next</a> 입니다.

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으로 IP에서 .을 제거한 값을 변수 이름과 값에 넣어 전송하는 문제입니다.

import requests
import hashlib

url = "https://webhacking.kr/challenge/bonus-6/wtff.php"
replace_ip = "MY IP".replace(".", "")
get_data = {replace_ip : replace_ip} 

response = requests.post(url, params=get_data)
print(response.text)

결과는 <a href=ipt.php>Next</a>입니다.

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";
?>

다음은 GET으로 addr에 값을 127.0.0.1으로 변경하여 전송하는 문제입니다.

import requests

url = "https://webhacking.kr/challenge/bonus-6/ipt.php"
get_data = {"addr" : "127.0.0.1"} 

response = requests.post(url, params=get_data)
print(response.text)

다른 문제들과 동일하게 GET 전송을 하면 됩니다.
결과는 <a href=nextt.php>Next</a>입니다.

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";
?>

php에서 .=는 python의 +=과 동일한 동작을 수행합니다.

for($i=97;$i<=122;$i=$i+2){
  $answer.=chr($i);
}
echo($answer);

를 실행하여 answer를 계산하면 acegikmoqsuwy 가 나옵니다.

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);
?>

IP 주소에 대해 for문이랑 연산들과 replace가 수행됩니다. python으로 옮겨서 계산하기는 귀찮기때문에 fopen 대신 echo로 답을 얻어줍시다.

$ip = "MY IP";
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);
echo("answerip/{$answer}_{$ip}.php");

값을 얻은 후 https://webhacking.kr/challenge/bonus-6/answerip/{$answer}_{$ip}.php로 접속하면 문제를 해결할 수 있습니다!

profile
Rainy Waltz(a_hisa)

0개의 댓글