여덜 번째 문제 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
위와 같이 입력해 보자.
클리어!!
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 |