[LOS] 8. Troll

힌트

  • 이전 문제의 preg_match 들과 이번 문제의 2번째 preg_match 의 차이점
  • DB에서는 대문자와 소문자를 구분하지 않는다.

풀이

코드 해석

<?php  
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");
  if(preg_match("/admin/", $_GET[id])) exit("HeHe");
  $query = "select id from prob_troll where id='{$_GET[id]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if($result['id'] == 'admin') solve("troll");
  highlight_file(__FILE__);
?>

preg_matchadmin을 필터링하는 문제이다.
이 부분을 우회하면 문제를 해결할 수 있다.

문제 풀이

대문자 소문자 혼용

여기서 preg_match 함수를 조금 알아야 할 필요가 있다.
첫 번째 preg_match에는 패턴 구분자 뒤에 i가 붙어있지만 두 번째 preg_match에는 i가 없다.
여기에서 i가 붙으면 대소문자를 구분하지 않고 필터링을 하지만 두 번째 preg_match에는 i가 없어서 정확히 소문자로 이루어진 admin만을 필터링한다.

따라서 ADmiN과 같이 소문자와 대문자를 섞으면 preg_match 함수에서는 필터링 되지 않지만, DB에서는 admin으로 인식되어 성공적으로 preg_match 를 우회할 수 있다.

https://los.rubiya.kr/chall/troll_05b5eb65d94daf81c42dd44136cb0063.php?id=ADmiN

좋은 웹페이지 즐겨찾기