[Webhacking.kr] Challenge old-33
Challenge old-33번 문제다. Challenge 33-1이라고 나와있는걸 보니 33번은 여러 작은 문제들로 이루어져 있을것 같다는 생각이 들었다. 소스코드를 살펴보자.
<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"라는 값을 전해주면 된다. 주소 뒤에 ?get=hehe를 붙여 해결해보자.
활성화된 Next 버튼으로 넘어가보쟈
소스코드를 살펴보자.
<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"를 넘겨주면 되겠다. 버프수트를 사용할 수도 있을거 같지만 귀찮으니깐 브라우저의 개발자도구를 활용해 해결해보자
기존의 소스코드에 위의 사진처럼 form 태그를 추가해주면 아래와 같이 text칸이 추가된다.
위의 칸에 각각 hehe와 hehe2를 입력하고 제출을 눌러주면?
으익 귀차나~
<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";
?>
곧바로 Challenge 33-3의 소스코드를 살펴보자. 쉽다! $_SERVER['REMOTE_ADDR']은 접속자의 ip 주소를 의미하기 때문에 myip라는 이름으로 GET방식을 이용해 나의 ip주소를 넘겨주면 된다.
Challenge 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();
?>
아항 password라는 이름으로 GET방식을 이용하여 현재 시간을 md5 암호화한 값을 넘겨주면 된다. 저 힌트는 현재 시간을 의미하는 숫자였다. 여기서 주의할 점은 현재 시간은 계속해서 바뀌기 때문에 100정도를 더한 값을 md5 암호화해서 넘겨주다보면,,, 언젠가는 맞을거에요오,,,도젼
대략 7분 정도를 도전한 결과..
후,,,씨 또 Next다.
<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";
?>
imget이라는 이름으로 GET 방식 데이터 하나, impost라는 이름으로 POST 방식 데이터 하나, imcookie라는 이름으로 Cookie값.
이 3개가 존재하면 된다. 그럼 하나하나 추가해주자. GET과 POST는 앞서 추가했던 방법과 똑같이 하니 따로 설명은 하지 않고 쿠키값만 알아보자.
imget이라는 쿠키가 기존에 존재하지 않았기에 editthiscookie를 이용해 추가해줘야 한다.
editthiscookie에서 +를 눌러 추가해주자. name은 imcookie, value는 아무거나~
위와 같이 해주면~?~?~?~??~?~?
률류~
힌트부터 버프수트를 켜야만 할거같은 느낌이 싸아악 든다. 소스코드를 살펴보자.
<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']}";
?>
어 뭐야 아니다. 내 ip주소를 md5암호화 한 값을 test라는 이름의 쿠키값으로, hint라고 주어진 $_SERVER['HTTP_USER_AGENT']도 md5 암호화하여 kk라는 이름으로 POST 방식을 이용해 전해주면 된다. 그럼 진행해보쟈
아니 언제 끝나???????
<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주소를 공개하지 못하기에 예시를 들어 설명해보겠다.
ip주소가 만약 123.456.78이라고 가정해보면 php 첫번째 줄에 의해 $_SERVER['REMOTE_ADDR']에는 12345678이 저장된다. 두번째 줄에서 12345678이라는 이름의 GET 방식 데이터가 12345678이라면 Next 버튼이 뜨는 방식이다. 이렇게 해주면?
<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이라는 이름의 값이 전해지지 않았다면 $addr은 나의 ip 주소값이고, 만약 $addr이 "127.0.0.1"이라면 Next 버튼이 활성화되게 된다.
GET방식으로 위 사진과 같이 주니 간단하게 풀렸다.
<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";
?>
반복문을 통해 $answer는 "acegikmoqsuwy"이 될것이다. 이는 chr이라는 함수는 인자로 주어진 수를 문자로 바꾸는 함수로서, 숫자를 아스키코드로 보아서 숫자가 의미하는 문자로 바꾸게 된다. 예를 들어 97은 a이고 반복문에서 마지막으로 들어가게 되는 숫자인 121은 y를 가리킨다. 이를 ans라는 이름을 사용해GET방식으로 전해주면 된다.
<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주소가 저장된다.
ip주소의 길이(이건 모두 똑같나? 나의 경우는 11이다)를 반복하면서 ord함수를 이용해 숫자로 문자열을 대치한다.(이게 뭔 말이야씨)
ord 함수는 chr 함수의 반대라고 생각하면 된다. chr 함수는 숫자를 인자로 넣으면 그 숫자가 가리키는 문자를 반환하는 함수였던 반면, ord함수는 문자를 인자로 받고 그 문자를 가리키는 숫자를 반환한다.
흐름을 살펴보자. $i가 0일 때 아이피주소에 있는 0을 0을 가리키는 숫자(아스키코드표 참조, 48)로 대치한다. 이런 행위를 11(아이피 주소의 길이)까지 반복한다. 그런데 나는 귀찮으니깐 이 명령을 포함해 밑의 명령까지 컴퓨터의 도움을 받아보려고 한다.
로컬환경에 php가 깔려있다면 그걸 써도되고(예를 들어 비트나미라던가..?) 나는 나의 aws 서버를 이용했다. web.php과 web2.php라는 파일을 만들어주고 각각 다음과 같이 입력했다.
<?php
$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 $answer;
?>
<?php
$ip = 내 아이피 주소~;
for($i=0;$i<=strlen($ip);$i++) $ip=str_replace($i,ord($i),$ip);
$ip=str_replace(".","",$ip);
$ip=substr($ip,0,10);
echo $ip;
?>
이렇게 입력하고 파일을 웹브라우저에서 열면 web.php에서 $answer이, web2.php에서 $ip가 출력될 것이다!!!!!!
$f=fopen("answerip/{$answer}_{$ip}.php","w");
소스코드에 있던 위 코드를 생각해 bonus-6 디렉토리 아래에 있는 /answerip/{$answer}_{$ip}.php로 접속하면???????
하아아아아ㅏ아아아ㅏ앙 드뎌 깼다 진짜 울뻔ㅠㅠㅠㅠ
댓글
이 글 공유하기
다른 글
-
[root-me.org - Web-Client] Javascript - Obfuscation 1
[root-me.org - Web-Client] Javascript - Obfuscation 1
2020.09.14 -
[root-me.org - Web-Client] Javascript - Authentication
[root-me.org - Web-Client] Javascript - Authentication
2020.09.14 -
[LOS / LORD OF SQL INJECTION] gremlin
[LOS / LORD OF SQL INJECTION] gremlin
2020.08.16 -
[Webhacking.kr] Challenge old-11
[Webhacking.kr] Challenge old-11
2020.08.15