본문 바로가기
PHP

[PHP] ereg(), eregi() 문자열 검사 함수

by spareone 2022. 11. 1.

문자열 검사 함수 ereg(), eregi()입니다. 문자열 필터링에 많이 사용되었던 함수입니다.

이 두 개의 함수들은 현재는 사용 불가능한 함수지만, 한 번 정리해 봅니다. (사용 불가능한 이유는 아래에서 작성)

 

1. ereg()

사용법은 ereg([검색할 문자열], [검사할 문자열]) 입니다.

문자열에 admin이 있는지 확인하려면 ereg("admin", $str) 하면 됩니다.

<?php

$str = "admin";

if(ereg("admin", $str)) echo "no hack";
else echo $str;

?>

$str에 admin이 있는지 검사하는 코드입니다.

admin이 있으면 no hack을 출력하고, 그렇지 않으면 $str을 출력합니다.

[그림 1] 실행 결과

no hack이 출력됩니다.

<?php

$str = "Admin";

if(ereg("admin", $str)) echo "no hack";
else echo $str;

?>

다만 ereg()함수는 대소문자를 구별합니다.

위의 예제처럼 Admin으로 바꾼 후 실행을 해 보겠습니다.

[그림 2] 실행 결과

필터링되지 않는 모습이 보입니다.

 

이러한 특성 때문에, 대소문자를 구분하지 않고 검사하려면 eregi()를 이용해야 합니다.

 

2. eregi()

사용법은 똑같이 eregi([검색할 문자열], [검사할 문자열]) 입니다.

<?php

$str = "Admin";

if(eregi("admin", $str)) echo "no hack";
else echo $str;

?>

바로 해당 코드를 실행시켜 보겠습니다.

[그림 3] 실행 결과

대소문자 구분 없이 필터링되고 있습니다.


위의 함수들의 취약점으로 필터링을 우회할 수 있습니다.

<?php

$str = $_GET["txt"];

if(eregi("admin", $str)) echo "no hack";
else echo $str;

?>

PHP 5.3 이상 버전에서 해당 코드를 실행시킵니다. (PHP 5.2까지는 필터링됩니다)

URL/?txt=admin 이렇게 접속하면 필터링되지만, 

URL/?txt=%00admin 이런 식으로 NULL문자를 끼워 넣으면 필터링되지 않습니다.

 

해당 원리를 이용한 CTF 문제입니다.

https://spareone.tistory.com/43

 

[CTF] webhacking.kr 23번 Write-Up

webhacking.kr 23번 문제풀이 Write Up 입니다. 접속하면 텍스트박스와 미션 설명이 있습니다. alert() 스크립트를 실행하면 된다고 합니다. 이번 문제는 XSS(Cross Site Scripting)를 성공시키면 되는 것 같습니

spareone.tistory.com


여러 취약점이 있어서 더 이상 해당 함수를 사용할 수 없습니다.

[그림 4] 경고 출력 모습

PHP 5.3 이상에서 ereg(), eregi() 함수를 쓰면 WARNING : Function eregi() is deprecated 경고가 출력됩니다.

[그림 5] 에러 출력 모습

PHP 6.0부터는 아예 사용하지 못합니다.

 

따라서 이제 이 함수들 대신 preg_match() 함수를 사용합니다.

'PHP' 카테고리의 다른 글

[PHP] str_replace() 문자열 치환 함수 사용법과 우회 방법  (0) 2022.10.25

댓글