반응형

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