No img


[los.eagle-jump]Lord Of Sql Injection gremlin - 3번

Posted by bonggang | 2020. 6. 1. 17:26

문제


https://los.eagle-jump.org/goblin_5559aacf2617d21ebb6efe907b7dded8.php

 

https://los.eagle-jump.org/goblin_5559aacf2617d21ebb6efe907b7dded8.php

 

los.eagle-jump.org

 

문제 해설


0. 소스 코드 확인

<?php 
  include "./config.php"; 
  login_chk(); 
  dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~"); 
  if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~"); 
  $query = "select id from prob_goblin where id='guest' and no={$_GET[no]}"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysql_fetch_array(mysql_query($query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; 
  if($result['id'] == 'admin') solve("goblin");
  highlight_file(__FILE__); 
?>

이전 1, 2번와 비교하면 그래도 만이 심화됐다.

소스코드에서 [', "]를 필터링한다. 즉, 작은따옴표랑 큰따옴표를 쓸 수 없다.

그리고 쿼리문에 id가 이미 명시되어있다.

 

1. geust no 찾기

먼저 id가 admin일 때 문제가 해결되기 때문에 이미 작성된 쿼리문에서 [id='guest' and no=] 부분을 거짓으로 만든 후 id를 다시 입력할 수 있도록 해야한다.

이를 위해 먼저 guest의 no를 찾아보겠다.

1을 넣으니 Hello guest가 나왔다. geust의 no는 1이다. 즉, no는 1이 아닌 다른 값을 넣어줘야한다.

 

2. 쿼리문 작성

no = 0 or id='admin'

하지만 작은따옴표가 필터링되기때문에 다른 방법을 찾아야한다.

 

-> admin이라는 것은 문자열이기때문에, 16진수로 변환시켜주면 작은따옴표로 감싸줄 필요가 없게된다.

 참고: https://l0rq2.tistory.com/17?category=716038

 

즉, no=0 or id=0x61646D696E으로 작성해주면 된다.

 

정답: https://los.eagle-jump.org/goblin_5559aacf2617d21ebb6efe907b7dded8.php?no=0%20or%20id=0x61646D696E

 

결과