Season 1/워게임

Old - 33 Write Up

작성자 - LRTK

이번 문제는 엄청 길어질 거 같아서 하나씩 나눠서 정리하였다.

 

33-1 풀이

view-source에서 코드를 살펴보니, 다음 문제로 넘어갈 힌트를 얻을 수 있었다.

 

<?php
if($_GET['get']=="hehe") echo "<a href=???>Next</a>";
else echo("Wrong");
?>

Get 메소드로 get=hehe를 서버로 보내면, 다음 문제로 넘어갈 수 있는 a태그가 출력되는 것을 알 수 있었다.

 

a태그가 출력되었고, 나는 다음 문제로 넘어갔다.


33-2 풀이

<?php
if($_POST['post']=="hehe" && $_POST['post2']=="hehe2") echo "<a href=???>Next</a>";
else echo "Wrong";
?>

이번 문제는 Post 메소드로 post=hehepost2=hehe2를 넘겨줘야 다음 문제로 넘어 갈 수 있었다.

 

Post 메소드로 위의 값을 서버로 보내서 다음 문제로 넘어갈 수 있었다.


33-3 풀이

문제 페이지에서 출력되는 텍스트는 같으니, 코드만 정리노트에 적겠다.

<?php
if($_GET['myip'] == $_SERVER['REMOTE_ADDR']) echo "<a href=???>Next</a>";
else echo "Wrong";
?>

파라미터 이름이 myip라서, 나의 IP를 넣으면 되는지 아니면 서버의 IP 주소를 넣으면 되는지를 몰라서 $_SERVER['REMOTE_ADDR'])에 대해서 알아보았다.

 

그 결과 웹서버에 접속한 접속한 IP의 주소를 갖고 있는 배열이였다.


서버에 내 IP를 보내기 위해 나의 외부 IP 주소를 알아내기 위해 네이버에 검색하여 알아낸 후, Get 메소드로 서버에 전달하였다.

 


다음 문제로 넘어갈 수 있었다.


33-4 풀이

<?php
if($_GET[‘password’] == md5(time())) echo “<a href=???>Next</a>”;
else echo “hint : “.time();
?>

이번에는 현재 시간을 MD5으로 해쉬화한 값을 Get 메소드로 서버에 전달해야한다.

 

나는 현재 페이지에 출력된 값을 100 증가하여, MD5 해쉬화 후 나온 값을 서버에 계속 전달할 것이다.

 

그럼 어느 순간 내가 보낸 시간이 도달하면 문제가 풀리는 것이다.

다음 문제로 넘어가겠다.


33-5 풀이

<?php
if($_GET[‘imget’] && $_POST[‘impost’] && $_COOKIE[‘imcookie’]) echo “<a href=???>Next</a>”;
else echo “Wrong”;
?>

이번에는 Get, Post, Cookie 값이 동일해야 다음 문제로 넘어갈 수 있었다.

 

POST /challenge/bonus-6/md555.php?imget=1 HTTP/1.1
Host: webhacking.kr
Cookie: PHPSESSID=r0sakaqij4i0q7dk82fis0kchg; imcookie=1
Cache-Control: max-age=0
Sec-Ch-Ua: " Not A;Brand";v="99", "Chromium";v="90"
Sec-Ch-Ua-Mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close
Content-Type: application/x-www-form-urlencoded

impost=1

위와 같이 메소드를 POST로 지정하여, URL에 imget 파라미터를 지정, Body에 impost를 지정, Cookie에 imcookie를 지정하여 서버로 전달하였다.

 

다음 문제로 넘어갈 수 있었다.


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’]}”;
?>

이번 문제는 내 외부 IP를 MD5 해쉬화한 값, USER_AGENT 값을 MD5 해쉬화한 값을 구하여 각각 Cookie와 kk 파라미터에 지정해야한다.

 

POST /challenge/bonus-6/gpcc.php HTTP/1.1
Host: webhacking.kr
Cookie: PHPSESSID=r0sakaqij4i0q7dk82fis0kchg; test=MD5(외부 IP)
Cache-Control: max-age=0
Sec-Ch-Ua: " Not A;Brand";v="99", "Chromium";v="90"
Sec-Ch-Ua-Mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close
Content-Type: application/x-www-form-urlencoded

kk=3651f072395347537c74089989c88a66

위와 같이 Cookie와 kk 파라미터를 보내고 다음 문제로 넘어갈 수 있었다.


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’]];
?>

이번 문제는 나의 외부 IP 주소에서 .를 제거한 값을 Get 메소드로 전달하면 된다.

 

다음 문제로 넘어갈 수 있었다.


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이 되야지만, 다음 문제로 넘어갈 수 있다.

 

addr=127.0.0.1를 넘겨주고, 다음 문제로 넘어갈 수 있었다.


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

이번엔 아스키코드 97부터 122번까지 2씩 증가하여 나온 값을 answer에 넣어줘야한다.

간단하게 코딩으로 하지않고, 직접 구해보았다.

 

acegikmoqsuwy이라는 값을 구하였고, 값을 Get 메소드로 전달하였다.

다음 문제로 넘어갈 수 있었다.


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

answer이 구해지는 코드를 파이썬으로 구현하였다.

 

ip = input()

start = 0
end = len(ip)
while start <= end:
    ip = ip.replace(str(start), str(ord(str(start)[0])))
    start += 1
    end = len(ip)

ip = ip.replace(‘.’, ‘’)[:10]
answer = str(int(ip) / 2).replace(‘.’, ‘’)
print(f'answerip/{answer}_{ip}.php')

이때 파이썬과 PHP 간의 차이점을 알 수 있었다.

 

PHP의 For문 같은 경우,
ip의 길이를 최대 반복 수로 지정하였는데 ip의 길이가 증가할 때마다 최대 반복 수가 그것을 반영하여 반복 수가 증가하였다.

 

Pytho의 경우,
한번 지정된 최대 반복 수는 고정이다.

 

이것을 몰라서 계속 잘못된 곳을 찾고 있었는데, PHP로 반복문의 반복 수를 찍어보니 알 수 있었다.
그래서 파이썬으로 구현된 코드는 for문으로 구현하지 않고 while문으로 구현하였다.

 

출력된 값을 answerip/{$answer}_{$ip}.php에 대입하여 서버로 전달하였다.
이때 IP의 값은 ip = ip.replace(‘.’, ‘’)[:10]의 값이다.

 

이렇게 개고생을 하여 flag를 획득할 수 있었다.

'Season 1 > 워게임' 카테고리의 다른 글

Old - 42 Write Up  (0) 2021.05.17
Old - 36 Write Up  (0) 2021.05.17
Old - 23 Write Up  (0) 2021.05.17
Old - 20 Write Up  (0) 2021.05.17
Old - 1 Write Up  (0) 2021.05.17
Contents

이 글이 도움이 되었다면, 응원의 댓글 부탁드립니다.