문자열 검사 함수 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을 출력합니다.
no hack이 출력됩니다.
<?php
$str = "Admin";
if(ereg("admin", $str)) echo "no hack";
else echo $str;
?>
다만 ereg()함수는 대소문자를 구별합니다.
위의 예제처럼 Admin으로 바꾼 후 실행을 해 보겠습니다.
필터링되지 않는 모습이 보입니다.
이러한 특성 때문에, 대소문자를 구분하지 않고 검사하려면 eregi()를 이용해야 합니다.
2. eregi()
사용법은 똑같이 eregi([검색할 문자열], [검사할 문자열]) 입니다.
<?php
$str = "Admin";
if(eregi("admin", $str)) echo "no hack";
else echo $str;
?>
바로 해당 코드를 실행시켜 보겠습니다.
대소문자 구분 없이 필터링되고 있습니다.
위의 함수들의 취약점으로 필터링을 우회할 수 있습니다.
<?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
여러 취약점이 있어서 더 이상 해당 함수를 사용할 수 없습니다.
PHP 5.3 이상에서 ereg(), eregi() 함수를 쓰면 WARNING : Function eregi() is deprecated 경고가 출력됩니다.
PHP 6.0부터는 아예 사용하지 못합니다.
따라서 이제 이 함수들 대신 preg_match() 함수를 사용합니다.
'PHP' 카테고리의 다른 글
[PHP] str_replace() 문자열 치환 함수 사용법과 우회 방법 (0) | 2022.10.25 |
---|
댓글