write-up/LOS write-up

LOS (Lord of SQL injection) 문제 14번 giant write-up

정보보호학과 새내기 2021. 7. 7. 14:54
반응형
SMALL

문제 14번 - giant

 

query : select 1234 fromprob_giant where 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__); 
?>

일단 다른 문제들과 마찬가지로 php 코드가 주어져있다.

 

먼저 필터링 함수를 확인해보면 shit을 받는 변수에 1보다 큰 크기의 문자열이 들어가면 안되고 공백, 엔터, \r, 탭을 필터링한다는 것을 알 수 있다. 추가로 i를 통해 대소문자를 구별하지 않는다는 것을 확인 할 수 있다.

<?php 
  if(strlen($_GET[shit])>1) exit("No Hack ~_~"); 
  if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe");
?>

 

또 clear 조건을 확인하기 위해 조건문 코드를 확인해보니 query문을 참으로 만들어줄 문자열(?)이 1234에 들어가면 clear가 된다는 것을 알 수 있다.

<?php 
  $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__); 
?>

 

위에 조건들을 확인해보니 query문에 from과 prob 사이에 공백이 필요하다는 것을 알 수 있는데 shit에 공백을 의미하는 문자를 넣어주면 된다는 것을 알 수 있다. 따라서 앞선 문제에서 사용한 %0a를 사용해보았다. %0a는 엔터랑 같은 의미인데 엔터를 필터링하므로 실패했다. 같은의미를 가지는 공백 문자 우회방법을 찾아보니 다양한 방법이 있었는데 %0b나 %0c가 있었다. 자세한 공백 우회 방법은 다른 게시물에 따로 정리해야겠다.

 

따라서 해당 주소 php 뒤에 shit=%0b를 입력한다.

 

solve

https://los.rubiya.kr/chall/giant_18a08c3be1d1753de0cb157703f75a5e.php?shit=%0b

반응형
LIST