반응형

webhacking.kr 문제 풀이 / Challenge(old) - 16번 문제 (100)

 

key가 입력될 때마다 mv() 함수가 호출되어 별이 이동하게 됩니다.

event.keyCode가 100이면 오른쪽으로 이동, 97이면 왼쪽으로 이동, 119면 위로 이동, 115면 아래로 이동됩니다. 

124면 원하는 페이지로 이동되게 됩니다. 

124에 대한 event.keyCode는 문자 "|"이며, 이 문자를 입력하면 7C.php로 이동하게 됩니다.

<script>
document.body.innerHTML+="<font color=yellow id=aa style=position:relative;left:0;top:0>*</font>";
function mv(cd){
  kk(star.style.left-50,star.style.top-50);
  if(cd==100) star.style.left=parseInt(star.style.left+0,10)+50+"px";
  if(cd==97) star.style.left=parseInt(star.style.left+0,10)-50+"px";
  if(cd==119) star.style.top=parseInt(star.style.top+0,10)-50+"px";
  if(cd==115) star.style.top=parseInt(star.style.top+0,10)+50+"px";
  if(cd==124) location.href=String.fromCharCode(cd)+".php"; // do it!
}
function kk(x,y){
  rndc=Math.floor(Math.random()*9000000);
  document.body.innerHTML+="<font color=#"+rndc+" id=aa style=position:relative;left:"+x+";top:"+y+" onmouseover=this.innerHTML=''>*</font>";
}
</script>

7C.php로 이동하면 100점을 얻을 수 있습니다.

반응형
반응형

webhacking.kr 문제 풀이 / Challenge(old) - 24번 문제 (100)

 

24번 문제입니다.

view-source를 클릭했을 때 아래와 같이 코드가 생성됩니다.

아래 코드를 보면 결국에는 @ip가 "127.0.0.1"이 출력되면 됩니다.

 

$ip는 $REMOTE_ADDR의 값이 넣어지고, str_replace 함수에 의해 몇몇 문자열이 변경됩니다. 

$REMOTE_ADDR값은 $_COOKIE에서 가져오는 값으로 보입니다. 

우선 쿠키에서 REMOTE_ADDR을 변경해 보겠습니다. 

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 24</title>
</head>
<body>
<p>
<?php
  extract($_SERVER);
  extract($_COOKIE);
  $ip = $REMOTE_ADDR;
  $agent = $HTTP_USER_AGENT;
  if($REMOTE_ADDR){
    $ip = htmlspecialchars($REMOTE_ADDR);
    $ip = str_replace("..",".",$ip);
    $ip = str_replace("12","",$ip);
    $ip = str_replace("7.","",$ip);
    $ip = str_replace("0.","",$ip);
  }
  if($HTTP_USER_AGENT){
    $agent=htmlspecialchars($HTTP_USER_AGENT);
  }
  echo "<table border=1><tr><td>client ip</td><td>{$ip}</td></tr><tr><td>agent</td><td>{$agent}</td></tr></table>";
  if($ip=="127.0.0.1"){
    solve(24);
    exit();
  }
  else{
    echo "<hr><center>Wrong IP!</center>";
  }
?><hr>
<a href=?view_source=1>view-source</a>
</body>
</html>

 

현재 COOKIE는 PHPSESSID 값 밖에 없습니다. 

REMOTE_ADDR를 만들어 ip를 입력해보겠습니다. 

 

REMOTE_ADDR를 127.0.0.1로 입력하였더니 client ip가 1로 출력되었습니다. 

(12), (7.), (0.), (..)이 다른 값으로 변경되기 때문에 1로 변경되었습니다.

=> (12)(7.)(0.)(0.)1 

 

그러면 str_replace()를 하여도 127.0.0.1로 만들 수 있는 문구열을 찾아 입력하여 보겠습니다. 

(12) => ( ), (7.) => ( ), (0.) => ( ) , (..) => (.) 으로 변경된다는 사실을 가지고 만들어 보면 아래와 같습니다.

1(12)27(7.)(..)0(0.)(..)0(0.)(..)1 => 112277...00...00...1

 

이렇게 입력하면 100점을 획득한 것을 볼 수 있습니다.

반응형
반응형

webhacking.kr 문제 풀이 / Challenge(old) - 26번 문제 (100)

아래 코드를 보면 두번째 php 코드가 중요해 보입니다. 

$_GET['id']가 /admin/ 패턴일 경우에는 "no!"를 출력하고 종료됩니다. 

urldecode($_GET['id']) 함수로 반환된 문자열이 "admin"이면 solve() 함수를 call하게 됩니다. 

urldecode($_GET['id']) 함수가 "admin"이 반환할 수 있도록 "admin"을 url로 인코딩하여 입력해 보겠습니다. 

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 26</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }    
a { color:lightgreen; }
</style>
</head>
<body>
<?php
  if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
  $_GET['id'] = urldecode($_GET['id']);
  if($_GET['id'] == "admin"){
    solve(26);
  }
?>
<br><br>
<a href=?view_source=1>view-source</a>
</body>
</html>

 

url 코드는 아래 표를 이용해보겠습니다. 

admin은 url 코드로 %61%64%6d%69%6e인데, 이 값을 입력해보겠습니다.

%61%64%6d%69%6e를 입력해도 preg_match()함수에서 디코딩 되어 "no!"를 출력하는 것으로 보입니다. 

%61%64%6d%69%6e를 한번 더 인코딩해서 입력해 보도록 하겠습니다.

 

%61%64%6d%69%6e를 인코딩하면, %2561%2564%256d%2569%256e 이 됩니다. 

이 값을 넣어보도록 하겠습니다.

그러면 100점을 획득한 것을 볼 수 있습니다.

 

반응형
반응형

webhacking.kr 문제 풀이 / Challenge(old) - 18번 문제 (100)

 

view-source를 클릭하면 아래와 같이 코드가 출력됩니다. 

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 18</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
input { background:silver; }
a { color:lightgreen; }
</style>
</head>
<body>
<br><br>
<center><h1>SQL INJECTION</h1>
<form method=get action=index.php>
<table border=0 align=center cellpadding=10 cellspacing=0>
<tr><td><input type=text name=no></td><td><input type=submit></td></tr>
</table>
</form>
<a style=background:gray;color:black;width:100;font-size:9pt;><b>RESULT</b><br>
<?php
if($_GET['no']){
  $db = dbconnect();
  if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
  $result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2

  if($result['id']=="guest") echo "hi guest";
  if($result['id']=="admin"){
    solve(18);
    echo "hi admin!";
  }
}
?>
</a>
<br><br><a href=?view_source=1>view-source</a>
</center>
</body>
</html>

 

php 코드를 보면 우선 db에 접속을합니다.

그리고 no값을 받아 preg_match 함수로 패턴매칭 수행 후 일치하면 No Hack 메세지 출력 후 종료됩니다. 
preg_match 값과 일치하지 않으면 $result 수행 후 id값 비교하여, id가 guest일 경우, "hi guest"를 출력하고, id가 admin일 경우 "hi admin"를 출력 후 solve 함수가 호출됩니다. 

 

admin의 no는 2라고 합니다. 

admin이 되기 위해서는 $_GET[no]가 2가 되어야 하고, 'guest'는 검색되지 않아야 하기 때문에, 

-1 or no = 2로 입력이 되어야합니다. 

<?php
if($_GET['no']){
  $db = dbconnect();
  if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
  $result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2

  if($result['id']=="guest") echo "hi guest";
  if($result['id']=="admin"){
    solve(18);
    echo "hi admin!";
  }
}
?>

 

우선 1을 입력하면, hi guest가 출력됩니다. 

or ""로 입력하였더니, no hack이라고 출력됩니다. 

여기에서 eregi() 와 비슷하게 공백이 있으면 필터링 되기 때문에, URL창에 url코드로 no를 입력하도록 하겠습니다. 

 

space(tab)은 %09입니다. 

이 코드를 이용하여 url 코드를 작성하도록 하겠습니다.

 

+로 되어 있는 부분을 %09로 바꾸면 아래와 같이 점수를 획득할 수 있습니다.

반응형

+ Recent posts