Challenge 33

2018. 12. 26. 16:18워게임 리뷰


Challenge no.33

사용 도구 

BurpSuite 

 브라우저

IE 11



# 33-1 분석 

처음 화면에 들어가면 어떤 문서에 대한 경로가 <a> 태그의 href 속성으로 링크가 걸려있고,  아래에는 Wrong 이라는 문자열이 출력되고 있다. 링크를 클릭하면 index.phps에 대한 소스코드가 나오는데 이를 분석해야 한다.

<hr>
Challenge 33-1<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF][각주:1]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>

<?
if($_GET[get]=="hehe") // get 이라는 파라미터를 생성해 hehe라는 값을 넣어 GET 방식으로 서버에 요청하면 
{                             // 다음 화면으로 넘어 간다.
    echo(
"<a href=###>Next</a>"); 
}
else
{
    echo(
"Wrong");  // 맨 처음 화면에 Wrong이 찍힌 이유
}
?>


# 풀이 

URL에 ?get=hehe 입력하고 요청하면 다음 화면으로 넘어갈 수 있다.  아래와 같이 33-1 해결

# 33-2 분석


33-1과 마찬가지로 어떤 조건을 만족해야 다음 화면으로 넘어갈 수 있는 것 같다.  

아까랑 다른 점은 GET 방식이 아닌 POST 방식으로 두 개의 파라미터를 요청해야 한다. 

GET 방식은 URL 자체에 파라미터 값이 노출되므로 쉽게 해결 할 수 있으나, 

POST 방식은 서버로 전송되는 파라미터 값이 URL에 노출 되지 않기때문에 Paros, BurpSuite 등과 같은 프록시 툴을 사용해서 해결해야 한다.


<!-- 생략 -->

if($_POST[post]=="hehe" && $_POST[post2]=="hehe2") // 두 개의 파라미터를 POST 방식으로 보내야 한다.

{
    echo(
"<a href=##>Next</a>");
}
else
{
    echo(
"Wrong");
}

?>


# 풀이

BurpSuite , Paros 같은 프록시 툴을 이용해 문제를 해결 할 수 있다. BurpSuite를 이용해 문제를 풀어보았다.

BurpSuite Proxy 기능을 이용해 /challenge/bonus/bonus-6/33.phps 파일에 대한 요청을 Intercept해서 기존의 GET 방식을 POST 방식으로 변경해 주었다.

  • 요청 방식 전환 방법 : 마우스 우클릭 - [Change request method]



POST 방식으로 변경 후  파라미터로 post=hehe & post2=hehe2 로 작성해서 서버에 요청하면 다음 화면으로 넘어 갈 수 있다. POST 방식이었기에 URL에 파타미터 값이 나오지 않는다.



# 33-3 분석

앞서본 문제들과 마찬가지로 php 파일 소스코드를 보고 특정 파라미터를 웹서버에 전달해 주어야 문제가 해결 된다.

GET 방식으로 myip 라는 파마리터 변수의 값이 $_SERVER[REMOTE_ADDR][각주:2] 값과 같아야 다음 문제로 넘어 갈 수 있다.


<?
if($_GET[myip]==$_SERVER[REMOTE_ADDR]) // 서버 입장에서의 원격 주소라 하면 , 서버에게 요청을 한 클라이언트가 됨. 
{
    echo(
"<a href=##.php>Next</a>");
}
else
{

  echo("Wrong");
}

?>


# 풀이

URL 주소에 myip=xxx.xxx.xxx.xxx 입력 후 서버에 요청하면, 다음 문제로 넘어 갈 수 있게 된다.

( IP 부분은 가림처리 했는데, 실제 문제 풀이 시 myip= 뒤에 자신의 IP 주소를 넣어주면 됨.)


# 33-4 분석

이전 문제들과 다르게 hint가 바로 보여지고 있다. 뭔가 알 수 없는 숫자 값이 적혀 있다. 

PHP 소스코드를 살펴보자. time()[각주:3] 함수는 PHP 에서 타임스탬프 값을 반환하는 함수이다. 

md5() 함수[각주:4]는 주어진 문자열에 대한 MD5 해시 값을 반환한다. 


<?
if($_GET[password]==md5(time())) // time() 함수를 통해 현재 UNIX timestamp를 MD5 해시 함수를 거친 해시값을 password 
{                                            /
파라미터로 넘겨주면 된다.

echo("<a href=###>Next</a>");

}
else
{
    echo(
"hint : ".time());
}

?>


# 풀이
개인적으로 굉장히 귀찮고 번거로운 문제였다. 분명 잘 맞춰서 서버에 요청을 했다고 생각했는데 그냥 지나쳐 버리기 일 수 였다. 몇 번의 시도 끝에 가까스로 해결 했다.


# 33-5 분석

별다른 힌트는 없는 것 같다. 소스코드를 한 번 살펴보자.


<?
if($_GET[imget] && $_POST[impost] && $_COOKIE[imcookie])
{
    echo(
"<a href=###>Next</a>");
}
else
{
    echo(
"Wrong");
}

?>

이번엔 세 개의 파라미터를 서버로 전송해야 한다. GET 방식으로 imget / POST 방식으로 impost / COOKIE에 imcookie 를 생성해서 보내야 한다.

# 풀이


각 파라미터를 이름에 맞게 생성하고 값은 모두 1 로 설정해서 서버로 요청을 전송하면 다음 문제로 넘어 갈 수 있는 Next 링크가 생성되었다.

# 33-6 분석

힌트로 웹 브라우저 User-agent가 주어졌다. 

파이썬을 이용한 크롤러 개발 개인 프로젝트를 하며 자주 봤기에 딱 보고 이거다 싶었다. 소스 코드를 한 번 살펴 보자.


<?
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 해시 함수를 거쳐 나온 해시값을 구해서 각 각 쿠키값과 POST 방식으로 서버에 전송하면 된다.

# 풀이

# 33-7 분석

str_replace( )[각주:5] 함수는 주어진 문자열을 지정한 다른 문자로 치환해주는 함수이다.  

<?
$_SERVER
[REMOTE_ADDR]=str_replace(".","",$_SERVER[REMOTE_ADDR]); // IP 주소의  '.' 을 제거


if(
$_GET[$_SERVER[REMOTE_ADDR]]==$_SERVER[REMOTE_ADDR]) // 파라미터 이름과 값에 
{                                                                                     // .을 제거한 IP주소를 대입하여 서버에 전송
    echo(
"<a href=###>Next</a>");
}
else
{
    echo(
"Wrong<br>".$_GET[$_SERVER[REMOTE_ADDR]]);
}

?>

$_SERVER[REMOTE_ADDR] 변수에는 원래 IP 주소가 저장되는데, 첫번째 라인에서 IP 주소에서 ' . '을 제거해서 다시 저장하도록 하 고 있다. GET 방식으로 .을 제거한 IP 주소를 파라미터 이름과 값으로 설정해서 서버로 요청을 보내야 한다. 

# 풀이

# 33-8 분석


<?
extract[각주:6]
($_GET);
if(!
$_GET[addr]) $addr=$_SERVER[REMOTE_ADDR];
if(
$addr=="127.0.0.1")
{
    echo(
"<a href=###>Next</a>");
}
else
{
    echo(
"Wrong");
}
?>

extract( ) 함수는 배열의 키값을 변수로 만들어 주는 함수이다.  소스코드에서 GET방식으로 들어온 파라미터가 아무것도 없으면 addr라는 변수에 내 IP주소를 담게 된다. 이건 간단하게 GET 방식으로 addr 파라미터를 생성해서 서버로 전송하면 된다.

# 풀이
URL 주소에 ?addr=127.0.0.1 입력 후 서버로 요청하면 바로 문제 해결

# 33-9 분석

<?
for($i=97;$i<=122;$i=$i+2)
{
    $ch=chr($i);
    $answer.=$ch;
}
if(
$_GET[ans]==$answer)
{
    echo(
"<a href=###>Next</a>");
}
else
{
    echo(
"Wrong");
}
?>

i 값이 97부터 2씩 증가하며 122 까지 26번 반복문을 수행한다.  
반복문 내부에서 $ch 변수에 chr( ) 함수[각주:7]를 통해 ascii code 에 해당하는 문자로 변환해서 $answer 변수에 추가해서 저장하고 있다. 
ascii code 97번은 문자 'a'를 나타낸다. 즉 변수 $answer는  a,b,c,d,e, ... , y, z 중에서 홀수 번째에 해당하는 문자들로 구성된 문자열이다.
GET방식으로 전송받은 ans 파라미터 값이 $answer와 같으면 문제를 해결 할 수 있다

# 풀이
$answer = acegikmoqsuwy 이다. URL에 ?ans= acegikmoqsuwy를 추가하고 서버로 전송하면 문제 해결.

# 33-10 분석


이젠 'Wrong' 이라는 문자열 조차 없다. 곧바로 소스코드를 확인해 보자.

<?
$ip
=$_SERVER[REMOTE_ADDR];  // 내 IP 주소룰 ip 변수에 대입
for(
$i=0;$i<=strlen($ip);$i++) // ip 변수에 저장된 IP 주소의 길이만큼 반복문 수행
{
    $ip=str_replace($i,ord($i),$ip); // 문자열을 ascii 10진수로 변환
}
$ip=str_replace(".","",$ip); // . 제거
$ip=substr($ip,0,10); // ip 변수의 index 0번째 부터 10번째 문자열을 추출

@
mkdir("answerip/$ip");  // 폴더 생성 명령어 

$answer=$ip*2;
$answer=$ip/2;
$answer=str_replace(".","",$answer);
$pw="###";


$f=fopen("answerip/$ip/$answer.$ip","w");
fwrite($f,"Password is $pw\n\nclear ip : $_SERVER[REMOTE_ADDR]");
fclose($f);
?>

앞에 나왔던 문제들의 소스코드보다 길고, 복잡해 보이나 하나하나 분석해보면 별거 아니다.

 노란색 블럭
내 IP 주소의 길이 만큼 반복문을 수행하며 IP주소를 10진수 ASCII로 변환한다. 그 다음 .을 제거한 값의 0번째 부터 10번째 까지 값을 $ip 변수에 저장한다.

녹색 블럭
$answer 와 $ip 변수의 값으로 이루어진 경로에 특정 파일명으로 새로운 파일을 생성하고, 그 내용으로 패스워드와 클리어한 IP가 기록되도록 한다.

# 풀이
구축해놓았던 Centos 웹서버를 이용해 PHP 소스코드를 약간 수정해서 answer 값과 ip 값을 출력했다. 


Password 부분은 텍스트를 잘못 입력했다. 저값은 ip 변수를 출력한 것이다. 이 값들을 이용해서 파일이 생성된 경로와 파일명을 입력해 이동해보면, 아래와 같이 Password 값과 문제를 클리어 한 내 IP가 브라우저에 출력된다.  여기서 얻은 Password를 가지고 Auth에 입력하면 완전히 문제가 해결된다.





본 게시글은 webhacking.kr 문제를 풀며 풀이과정을 정리한 글 입니다.




  1. 클라이언트에게 요청받은 서버 php 문서의 이름 반환 [본문으로]
  2. 해당 php파일을 요청한 대상, 즉 클라이언트 IP [본문으로]
  3. 유닉스 타임스탬프로써 현재 시간을 반환하는 함수 출처 [본문으로]
  4. 문자열의 MD5 해시값을 반환해주는 함수 출처 [본문으로]
  5. 문자열 치환 함수 출처 [본문으로]
  6. >출처 [본문으로]
  7. 숫자에 해당하는 아스키코드 문자를 반환하는 함수 출처 [본문으로]

'워게임 리뷰' 카테고리의 다른 글

Challenge 2 - 풀이중  (0) 2019.01.13
Challenge 1  (0) 2019.01.13
Challenge 10  (0) 2018.12.26
DB 별 주석처리 방법  (0) 2018.12.25