Wargame/webhacking.kr

Challenge old 61 (200)

마띠(쥔장) 2020. 2. 18. 01:53

Challenge old 마지막 문제ㅠ

깔끔하게 소스만 있네요..

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

 

이번 문제의 핵심은 여기네요

$result = mysqli_fetch_array(mysqli_query($db,"select {$_GET['id']} from chall61 order by id desc limit 1"));

order by id desc limit 1에서

"order by desc"는 "내림차순으로"

"limit 1"은 "1개만(최대 1개까지)" 입니다

즉 id를 내림차순으로 정렬했을 때 가장 첫 번째 자료를 select한다는 것 같네요

그리고 그 id가 admin이면 풀립니다

 

일단 id의 기본값은 guest, 쿼터 외 여러 문자열과 부호들이 필터링되고 있고

안봐도 admin 역시 필터링 돼있을 게 뻔하죠,, 길이 제한도 있어오 15자 이하만 됩니다

 

먼저 ?id=id로 모든 id를 가져와 봤어요

가장 마지막 알파벳, 내림차순에서는 가장 첫번째인 'test'가 출력됩니다

 

그럼 admin을 우회해야 하는데 매일 쓰는 char()은.. 괄호가 걸려서 패스

같은 이유로 함수로 우회하는 방법은 다 막힙니다

그래서 hex값인 0x61646d696e을 넘겨볼게요

아무일 x

 

이쯤에서 코드를 다시 볼 필요가 있었다

$result = mysqli_fetch_array(mysqli_query($db,"select {$_GET['id']} from chall61 order by id desc limit 1"));

{$_GET['id']}에 'admin'이 들어간다고 해도 chall61이라는 테이블에 admin 값이 없는거다..

따라서 먼저 테이블 내 id 칼럼 속에 admin을 넣어주고! select 해야한다!

 

그래서 어떻게 넣어줄까 찾아보니 '컬럼 별칭Alias'이란 게 있어따

컬럼 별칭 - 원래 이름대신 내가 설정한 별칭으로 컬럼명을 대체할 수 있다

 

예를 들어, select b a는 b(원래 컬럼명)를 a로 부르겠다는 뜻이고 결과적으로 a 컬럼 안에 b값이 속하게 된다.

컬럼 별칭을 사용해서 우리가 필요한 '이 칼럼에 이 값 넣기'를 할 수 있는거당

 

그럼 select {$_GET['id']} from chall61 order by id desc limit 1에서

select 다음을 'admin id'로 설정하면 id 컬럼에 admin 값이 들어가고 admin을 select하게 됩니다

따라서 ?id=admin id를 넣을 건데, admin은 hex값으로 넣어볼게요

?id=0x61646d696e id

728x90