프로젝트/Webhacking.kr

[Webhacking.kr] Challenge(old) 61번 문제

Uggjjini 2021. 7. 19. 14:25

문제페이지는 해당 페이지와 같다.

 

해당 페이지에는 view-source 링크만 존재한다.

 

해당 링크를 통해 소스 페이지를 확인해본다.

 

 

 if(!$_GET['id']) $_GET['id']="guest";

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

 

id 파라미터에 addslashes() 함수를 적용해 특수문자가 잘 인식되도록 역 슬래쉬를 추가해주고,  ( ) select from , by . 가 존재하는 경우 대소문자 구분없이 필터링된다.

 

또한 id 파라미터 값이  15자 이상일 경우  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);

 

chall61 테이블에서 id 컬럼을 내림차순으로 정리한 것중 id의 첫번째 줄에서 1개를 가져오는 구문을 생성하여 그 결과의

id 파라미터 값이 admin 인경우 문제가 풀린다.

 

from 이 필터링 되기 때문에 'admin' from chall6 -- 을 넣어 뒤의 조건을 주석처리 시키는 공격은 불가능하다.

 

alias 기능을 사용하여 id 라는 별칭을 만들어 id=admin 를 선언하여 아래 구문과 같이 만들어 준다.

 

SELECT 'admin' as id from chall6 order by id desc limit 1

 

하지만 'admin' as id 로 입력하면 addslashes() 때문에 ' 가 인식을 못하기 때문에  admin 을 hex 값으로 고친다.

그리고 admin 대신 hex값을 사용하면 15자가 넘어가기 때문에 as 를 생략시켜 전송시킨다.

 

 

그러면 해당 문제가 풀리는 것을 확인할 수 있다.