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-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() 함수의 결과값을 보여준다.
즉, time 값을 hint로 보여주기 때문에 hint의 값을 복사하여 넉넉히 값을 더해서(대략 25 정도) 아래의 MD5 사이트에서 암호화한 뒤 password 매개변수에 넣어주고 Enter를 입력해서 요청을 보낸 뒤 타이밍이 맞을 때까지 새로고침한다.
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로 만들면 다음 페이지로 이동할 수 있다.
프록시 툴을 이용해 요청을 가로챈 뒤 약간 수정해서 보낸다.
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로 페이지에 출력되어 있다.
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 |