klaus

[Lord of SQL Injection] giant 14번 (feat. 공백 우회) 본문

모의해킹/Wargame

[Lord of SQL Injection] giant 14번 (feat. 공백 우회)

klus! 2022. 12. 21. 16:23

0.자이언트

 

1. 전체 코드

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(strlen($_GET[shit])>1) exit("No Hack ~_~"); 
  if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe"); 
  $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__); 
?>

2. 중요코드 분석

if(strlen($_GET[shit])>1) exit("No Hack ~_~"); 
if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe"); 
$query = "select 1234 from{$_GET[shit]}prob_giant where 1";
if($result[1234]) solve("giant");

1) strlen함수를 보면 shit의 입력값의 길이는 1보다 작아야 합니다.

2) Preg_match함수를 보면

- (공백)

- \n

- \r

- \t 을 필터링합니다.

3) query를 보면 from와 prob_giant사이에 GET [shit] 입력해주면 solve 됩니다. 

 

3. solve

먼저,  공백 값을 입력하기 위한 문제 및 hex는 아래와 같습니다.

 

[공백 우회]

문자 16진수(Hex)   설명
tab %09 \t 필터링되어 불가능
line feed %0a \n 필터링되어 불가능
vertical tab %0b  
form feed %0c  
carriage return %0d   \r 필터링되어 불가능
/**/   shit의 길이는 1보다 작아야하기 때문에 불가능

new line        : '\n', 0x0a, 화면에 출력 시 다음 행으로 줄을 바꿉니다.

carriage return : '\r', 0x0d, 행의 처음으로 커서를 이동합니다.

form feed       : '\f', 0x0c, 프린트 출력 시 현재 페이지를 마칩니다.

 

필터링되는 것을 제외하고는 vertical tab와 form feed 사용하여 문제를 풀어보도록 하겠습니다.

 

스포주의!

더보기

?shit=%0b

?shit=%0c

 

 

 

참고 : 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mtjeaids&logNo=70053523593

https://minimonk.net/1814

Comments