반응형
https://webhacking.kr/challenge/web-38/
Challenge 61
webhacking.kr
[문제]
[풀이]
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
$db = dbconnect();
if(!$_GET['id']) $_GET['id']="guest";
echo "<html><head><title>Challenge 61</title></head><body>";
echo "<a href=./?view_source=1>view-source</a><hr>";
$_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>";
?>
소스코드를 확인하면
필터링이 있고, 15 글자수 제한이 있다.
select 문으로 id를 내림차순 정렬 후 첫번째 데이터만 들고온다.
그 결과값이 admin이면 문제가 풀린다.
select {$_GET['id']} from chall61 order by id desc limit 1
컬럼명을 적으면 될 듯 싶다.
?id=id 로 입력하면 내림차순 정렬 후 첫번째 데이터를 들고와서 test라는 결과가 나온 것을 확인할 수 있다.
이 문제에서는 별칭을 이용해야한다.
별칭은 컬럼명 as 별칭 또는 컬럼명 `별칭`, 컬럼명 별칭 등으로 사용할 수 있다.
별칭을 이용해서 admin as id 해보면 아무 결과가 나오지 않는다.
urlencode 방식으로 입력해본다.
%61%64%6d%69%6e as id
문자열이 너무 길어서 15글자 제한에 걸린다.
admin을 hex로 변환해서 글자수를 줄인 뒤 다시 시도한다.
0x61646d696e as id
이렇게 해도 길다.
별칭은 컬럼명 별칭으로
사용할 수 있기 때문에
0x61646D696e id 이렇게 입력할 수 있다.
?id=0x61646D696e id
입력하면 문제가 풀린다.
반응형