[php] preg_match 함수

2019. 2. 22. 18:26Web Hacking/[Memo] Web Functions

안녕하세요!

오늘은 php 함수중에

preg_match 함수에 대해서

설명할게요!


웹해킹 문제들을 풀다보면

php 코드에서 자주 등장하는 함수입니다!


먼저 어떻게 쓰이는지 알아보겠습니다

<예시>

<?php
preg_match
('/대조 할 문자/','입력한 문자'$matches); 

?>


물론 $matches 뒤에  PREG_OFFSET_CAPTURE을 쓰기도 하는데

제일 자주 쓰이는 상태로 살펴보도록 하겠습니다!


먼저 대조 할 문자에 저희가 

찾고 싶거나 필터링 하고 싶은 문자열을 

넣습니다!


예를 들어 나는 a를 필터링하고 싶다하면

'/a/' 이렇게 되겠죠?

this를 필터링하고 싶다하면

'/this/' 이렇게 되겠죠?


그럼 만약에 특수문자를 필터링하고 싶을땐요?

' 이거 필터링 하고싶은데요?

그럴땐 특수문자 앞에 \를 붙이면 돼요~


이렇게요!

'/\'/'


근데 가끔씩 '/admin/'i 이렇게

i가 붙을수가 있습니다!

이 경우는 대소문자를 

구분하지 않는다는 뜻입니다!


입력한 문자의 경우는 

일반적으로 저희가 GET방식이든

POST방식이든

사용자가 input을 하면 특정 변수에 담잖아요!


ex) $a=$_GET['id'];

이렇게요 get 방식으로 id값을 php변수 a에 넣는거요!

만약에 저희가 get방식으로 id에 1234를 넣었으면

$a=1234가 되겠죠?


그래서 일반적으로 사용자 input이 담긴

 php변수를 저 위치에 적어요!


좀 더 구조를 갖추면 이렇게 되겠죠?

preg_match('/\'/','$a',$match);

이렇게 되면 $a변수에 '가 있으면 감지되겠죠?


마지막으로 $match입니다

여기 match 변수에는 뭐가 담기냐?


바로 사용자가 설정한 값과 input값이 일치하는 경우

그 값을 $match에 배열형태로 저장합니다.


쉽게 얘기해서 검거당한 문자열은

$match에 기록된다!


예를들어 preg_match('/abcd/',$a,$match)

$a에 있는 값이 acety이면

a랑 c가 match안에 배열형태로 저장되겠죠?


마지막으로 이 함수는

하나라도 문자열이 검거가 되면 1을 반환하고

하나라도 검거가 안되면 0을  반환합니다


그래서 제가 본 문제들은 이런 형태로 되어 있었습니다!

if(preg_match('/\'/',$id,$match))

{                      

echo "no hack";

exit();            

               }


만약 $id의 입력값에 '가 있으면

no hack이라고 출력하고 php를 종료시킨다!


물론 문자열 필터링 할 때 이거 말고도

몇 가지 함수들이 더 있긴 합니다!


str_replace -> 다른 문자로 바꿔줌

preg_replace -> 다른 문자로 바꿔줌


preg_match전에 

eregi -> 비슷한 원리로 문자열 필터링(근데 NULL BYTE 취약점 존재해서 없어짐)

eregi 였지만 지금은 없어요! 

웹해킹 문제 푸시다가 목격하시면

취약한 함수라고 생각하시면 되요!


네 그러면 오늘 포스팅은 

여기서 마치도록 하겠습니다!

감사합니다!



'Web Hacking > [Memo] Web Functions' 카테고리의 다른 글

[php] eval() 함수  (0) 2019.02.19