728x90
<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(strlen($_GET[shit])>1) exit("No Hack ~_~"); // shit의 값의 길이가 1보다 크면 안됨.즉 1이어야함.
  if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe"); // 스페이스, 개행(%0a), Carriage Return(%0d), Tab(%09) 안됨
  $query = "select 1234 from{$_GET[shit]}prob_giant where 1"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result[1234]) solve("giant"); 
  highlight_file(__FILE__); 
?>

from과 prob_giant 사이에 띄울 수 있는 길이가 1인 구분자가 필요하다. 

sql의 공백(띄어쓰기) 우회는 다음과 같은 방법이 있다.

1) 개행(\n): 열은 유지한 채 커서를 한 칸 밑으로 이동. %0a

2) Carriage Return(\r): 커서를 왼쪽 끝으로 이동. %0d

3) Tab(\t): 커서를 오른쪽으로 Tab 만큼 이동. 키보드의 Tab키. %09

4) 주석(/**/): SQL에서 여러 줄을 주석처리.

5) 괄호(()): 문자(열) 양 옆에 괄호를 삽입하여 띄어쓰기 대신 문자(열)를 구분.

6) +: MySQL에서 띄어쓰기 역할. ex) select+1,+2; = select 1,2; 와 동일한 결과.

7) vertical tab(\v): 아래로 6줄 이동. %0b

8) form feed(\f): 프린트 출력 시 다음 페이지의 시작 부분으로 이동. %0c

해당 문제는 %0b 또는 %0c를 사용하면 풀린다.

답: ?shit=%0b

728x90

'Lord of SQL Injection' 카테고리의 다른 글

succubus  (0) 2022.12.23
assassin  (0) 2022.12.23
bugbear  (0) 2022.12.22
darkknight  (0) 2022.12.22
golem  (0) 2022.12.22

+ Recent posts