LoSi

8_LoSi_Troll with preg_match()

duduranran 2022. 11. 25. 22:13

여덜 번째 문제 Troll

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

1. preg_match()를 보면 싱글쿼트(')와 admin 이 필터링 돼 있다.

2. 쿼리에 대한 출력값, $result['id']의 값이 admin이 되면 해결된다.

 

음. admin을 입력할 수 없다? 근데 admin이 나와야 한다....

위의 preg_match()함수를 2가지를 비교해보자 가장큰 차이는  '/필터링할 값 /i' 여기 있는 i이다.

하나는 i가 있고, 하나는 i가 없다.

  if(preg_match("/admin/"$_GET[id])) 

위와같이 i가 없는 경우는 대소문자를 모두 필터링하는 게 아니라 입력된 값 그대로 필터링 하게 된다.

그렇기에 admin을 제외하고, 모두대문자인 ADMIN이나 Admin으로 입력해주면 쉽게 우회가 가능하다.

 

?id=ADMIN

위와 같이 입력해 보자.

클리어!!

Clear!!

Preg_match()에 대해 좀 더 알아보자.

이 함수는 문자를 필터링한다.

사용법은 아래와 같다.

preg_match('/필터링할 문자/', '입력한 문자')

 

이번 문제에서 나온 것을 보면 GET방식으로 받은 id값에 싱글쿼트(')를 필터링 한다는 의미이다.

preg_match('/ \' /i'$_GET[id])

 

preg_match의 반환값은 0과 1이다.

입력한 문자에 필터링 하려는 문자가 하나라도 포함 돼 있다면 1을 아니면 0을 반환한다.

if(preg_match('/\'/i'$_GET[id])) exit("No Hack ~_~");

그래서 주소표시줄에 싱글쿼트를 입력하면 "No Hack ~_~" 이라고 출력된다.. 부글부글..

 

preg_match에 대해 더 자세히 알고 싶다면.

이 분의 블로그를 들어가보자. 

 

 

[PHP] 정규표현식 preg_match() (1) - 한글 검사 패턴

정규표현식이란? 어떠한 값에 대해서 그 값이 한글로만 구성되어 있는지 영어로만 구성되어 있는지 또는 어떤 특별한 패턴을 지키고 있는지에 대해 체크할 때 사용하는 방식. 예를 들어 회원가

youngdev57.tistory.com

 

'LoSi' 카테고리의 다른 글

10_LoSi_skeleton  (0) 2022.11.26
9_LoSi_vampire  (0) 2022.11.26
7_LoSi_orge  (1) 2022.11.24
6_LoSi_darkelf  (0) 2022.11.23
5_LoSi_wolfman with whitespace 우회  (0) 2022.11.23