반응형

33-1

 

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 문자열을 주면 다음 단계로 넘어갈 수 있다.

 

33-1 문제 답

 


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

 

POST 방식으로 post 매개변수에 hehe 문자열과 post2 매개변수에 hehe2를 주면 다음 단계로 넘어갈 수 있다.

 

 

Proxy 툴을 사용해서 풀 수 있지만, 개발자 도구 > console 에서 XMLHTTPRequest 클래스를 이용해서 풀었다.

 

 

 

개발자 도구 > Network 탭 > Response 를 보면 위의 사진의 박스처럼 다음 페이지인 33.php가 나왔다.

 

참고) https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/send

 


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 매개변수에 자신의 아이피를 넘겨주면 다음 단계로 갈 수 있다.

 

 

참고) http://www.myipaddress.com/

 


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

 

GET 방식으로 password 매개변수의 값이 time()의 값을 md5로 암호화한 값이랑 같으면 다음 페이지로 이동

 

페이지에 hint로 time() 함수의 결과값을 보여준다.

 

hint 값 참고

 

MD5 암호화

 

 

즉, time 값을 hint로 보여주기 때문에 hint의 값을 복사하여 넉넉히 값을 더해서(대략 25 정도) 아래의 MD5 사이트에서 암호화한 뒤 password 매개변수에 넣어주고 Enter를 입력해서 요청을 보낸 뒤 타이밍이 맞을 때까지 새로고침한다.

 

https://coding.tools/kr/md5

 


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에 1을, POST 방식으로 impost에 1을, Cookie에 imcookie의 값으로 1을 줘서 if문의 조건을 True로 만들면 다음 페이지로 이동할 수 있다.

 

Burp Suite

 

프록시 툴을 이용해 요청을 가로챈 뒤 약간 수정해서 보낸다.

 

1. Method를 GET에서 POST로 수정한다.

2. URL의 뒷 부분에 imget 매개변수를 추가한다.

3. POST 방식으로 보낼 것이기에 POST 방식으로 데이터를 보낸다는 Content-Type와 Cookie 내용을 추가하는데, PHPSESSID는 webhacking.kr에서 개발자 도구 > Application > Cookies에서 본인의 세션 토큰을 확인할 수 있다.

4. impost 매개변수를 추가한다.

 

 


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의 값이 사용자의 IP와 같고, POST 메소드로 kk 매개변수의 값이 HTTP_USER_AGENT의 값과 같으면 다음 페이지로 이동한다.

 

HTTP_USER_AGENT의 값은 hint로 페이지에 출력되어 있다.

 

https://coding.tools/kr/md5

 

 

33-5번에서와 같이 프록시 툴을 이용해서 요청을 가로채 위의 사진 처럼 수정한 후 forward 해준다.

 


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

 

접속자의 IP에서 ' . '을 없앤 후 변수의 이름과 값으로 설정하여 GET 방식으로 요청하면 다음 페이지로 이동할 수 있다.

 

 


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 값을 설정하면 다음 페이지로 넘어갈 수 있다.

 

 


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

 

반복문으로 97 ~ 122까지 +2한 숫자에 매칭되는 ASCII 문자를 합해 GET 방식으로 ans 변수에 값으로 설정한 뒤 요청을 보내면 다음 페이지로 이동할 수 있다.

 

ans = []
for i in range(97, 122, 2):
    ans.append(chr(i))
answer = ''.join(ans)
print(answer)
#include <stdio.h>

int main()
{
    char buf[20];

    for(int i = 97; i <= 127; i+=2)
    {
        printf("%c", i);
    }
    
    return 0;
}

 

위의 python 또는 C 코드 중 하나를 실행해 나오는 정답이 ans 변수의 값이다.

 

 


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를 가져와서 사용자의 IP 길이만큼 반복하는데, 0부터 IP 길이 수까지 ord()를 사용해서 ASCII 문자(0 ~ 자신의 IP 길이의 끝)에 해당하는 ASCII 문자 값으로 변환한다.

(이때 IP 변수에 저장된 값은 ord를 사용해 replace를 해주므로 IP 변수의 길이는 변한다.)

 

.을 없애고 0번째부터 10번째 자리의 값만 가져온 뒤

 

ip * 2를 하는데 이는 눈속임이고, 실질적으로는 ip / 2한 연산이 들어간다.

 

다시 한 번 .을 없애고 answerip/[나누기 연산을 한 결과]_[0번째부터 10번째 자리 값].php로 요청을 하면 된다.

 

<!doctype html>
<html>
	<body>
		<hr>
		Challenge 33-10<br>
		<hr>
		<?php
			$ip = "58.141.234.40";
			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\n");
		?>
	</body>
</html>
ip = "58.141.234.40"
i = 0

while(1):
    if i <= len(ip):
        ip = ip.replace(str(i), str(ord(str(i)[0])))
        i = i + 1
        continue
    if i > len(ip): break

ip = int(ip.replace(".", "")[0:10])

answer = str(ip / 2).replace(".", "")

print("ip : ", ip)
print("answer : ", answer)
print("result : answerip/{0}_{1}.php".format(answer, ip))

 

 

반응형

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

[webhacing.kr] old-12  (0) 2022.05.04
[webhacking.kr] old-11  (0) 2022.05.04
[webhacking.kr] old-14  (0) 2022.04.30
[webhacking.kr] old-10  (0) 2022.04.30
[webhacking.kr] old-01  (0) 2022.04.29

+ Recent posts