티스토리 뷰

<?php 
  include "./config.php"; 
  login_chk(); 
  dbconnect(); 
  
  // prob, _, . , (), #, - 을 필터링
  if(preg_match('/prob|_|\.|\(\)|#|-/i', $_GET[pw])) exit("No Hack ~_~"); 

  // pw 값이 6글자 초과이면 No Hack 출력
  if(strlen($_GET[pw])>6) exit("No Hack ~_~"); 
  
  // 쿼리 실행
  $query = "select id from prob_nightmare where pw=('{$_GET[pw]}') and id!='admin'"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysql_fetch_array(mysql_query($query)); 
  
  // 쿼리의 결과가 있으면 클리어 !
  if($result['id']) solve("nightmare"); 
  highlight_file(__FILE__); 
?>

18번 Night Mare 의 코드이다.

 

우선 문제와 관련 없는 문자와, 주석 처리를 할 수 있는 몇몇가지들을 필터링하고있고,

pw의 길이를 6자 초과로 입력하지 못하도록 하고있다.

그리고 쿼리부분을 잘 보면 우리가 사용할 수 있는 변수는 pw밖에 없다.

 

따라서 pw뒤의 조건절은 무효화될 수 있도록 하며, 6자리의 문자열을 입력하여 쿼리를 실행하여야 한다.

 

1. 주석에 사용되는 문자가 필터링되고 있는데 조건절을 어떻게 무효화 할 수 있을까?

바로 NUL을 사용하는 것이다.

pw에 %00을 이용하여 여기가 문자열의 끝이다 ~ 라고 표시할 수 있다.

pw=');%00을 입력한다면 아래와 같은 쿼리가 만들어지면서 ; 까지 쿼리로 인식하여 뒤에 있는 조건절은 무효화될 것이다.

select id from prob_nightmare where pw=(''); ') and id!='admin' 

 

2. 6글자가지고 어떻게 인젝션을하지 ...?

이미 우리는 pw 뒤의 조건절을 무효화 하기위해 2글자를 사용했다. 우리에게 남은 총알은 4개 ....

우선 pw에서 필터링 되고 있는 것들을 다시 한 번 확인해보자

prob, _, ., (), # -

'와 )가 필터링안되고 있는 것을 확인할 수 있다.

우선 입력값 앞에 열려있는 홑따옴표와 괄호를 닫아주어야 우리가 조건을 추가할 수 있다.

이렇게 또 2개의 총알을 사용했다.

 

이제 어떻게 조건문을 참으로 만드느냐... 인데 이 케이스는 이전에 webhacking.kr 문제를 풀며 본 적이 있다.

조건절을 위와같이 1=2=3 으로 입력을 한다면

(1=2) 거짓 , (2=3) 거짓

(거짓 = 거짓) 참

거짓을 이용하여 참을 만들 수 있는 것을 볼 수 있다.

 

따라서 괄호를 닫아준 뒤 거짓이 되는 조건을 달아준다면 최종적으로 조건이 참이되어 클리어가 될 것이다.

 

?pw=')=0;%00

 

위와 같이 입력하면 클리어 ~!

'워게임 > Lord of SQL injection' 카테고리의 다른 글

[LOS] 20번. dragon  (0) 2019.05.24
[LOS] 19번. Xavis  (0) 2019.05.24
[LOS] 17번.Succubus  (0) 2019.05.12
[LOS] 16번.ZOMBIE ASSASSIN  (0) 2019.05.10
[LOS] 15번. ASSASSIN  (0) 2019.05.10
댓글