반응형

 

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

 

id 파라미터의 값이 없으면 id의 값을 "guest"로 설정하고, id 파라미터의 값이 있으면 해당 값에서 특수 문자에 슬래시를 추가한다.

 

그리고 특정 패턴에 해당하는 값이 id에 있거나, 글자 길이가 15보다 크면 "Access Denied"를 출력한다.

 

SQL 쿼리문에 id 파라미터의 값이 포함되는데 쿼리를 통해 얻은 값에서 id의 값이 admin이면 문제가 풀린다.

 

'(', ')', select, from, ',', by, '.'를 모든 영문 대소문자(a-zA-Z)에서 찾아 필터링한다.


풀이

 

이번 문제는 where 같은 조건 절의 값을 바꾸는 것이 아니라 파리미터의 값이 그대로 출력하고자 할 컬럼 이름으로 사용되므로 파라미터의 값을 적절히 줘야 한다.

 

문제에서 주어지는 소스 코드를 보면, 내가 입력한 id 파라미터의 값이 SQL 문의 출력하고자 할 컬럼 이름으로 사용된다.

 

SQL 쿼리에서는 id를 내림차순으로 정렬한 뒤 한 개만 출력한다.

 

그리고 이 id의 값이 admin이면 풀린다.

 

그렇다면 추측상 컬럼명이 admin이라고 했을 때 "admin"이랑 같기 때문에 문제가 풀린다.

 

 

하지만 위와 같이 id 파라미터에 admin을 입력하면 문제가 풀리지 않는다.

 

그렇다면 다른 방법으로 SQL에 있는 as(alias) 절을 사용하면 된다.

 

alias는 "컬럼명" as "별칭" 과 같이 사용하는데 컬럼명에 대한 별칭을 설정할 수 있다.

 

아래와 같이 입력하면 id라는 컬럼 별칭으로 "admin"이라는 값이 반환된다.
(참고 : "컬럼명"과 "별칭" 사이의 as는 생략이 가능하다.)

 

('admin' as id) == (id = admin)

 

하지만 문제는 위와 같이 입력하면 addslashes() 함수 때문에 admin을 감싸고 있는 특수 문자 싱글 쿼터 앞에 슬래쉬가 붙게 되어 인식을 못하기 때문에 URL 인코딩을 쓰면 되지만 URL 인코딩은 아래와 같이 15글자를 넘어가게 된다

 

%61%64%6D%69%6E as id

 

그러므로 아래와 같이 16진수 인코딩하고 as를 생략하여 15글자 미만으로 글자수를 맞춰주면 된다.

 

0x61646D696E id

 

반응형

'전쟁 > Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-49  (0) 2022.07.21
[Webhacking.kr] old-7  (0) 2022.07.19
[Webhacking.kr] old-59  (0) 2022.07.19
[Webhacking.kr] old-5  (0) 2022.07.14
[Webhacking.kr] old-39  (0) 2022.07.13

+ Recent posts