May 23, 2022

Bypass фильтров на PHP, или почему важно читать документацию функции.

E7 | TEAM

Введение:

В этой статье мы узнаем об обходе фильтров пользовательского ввода на PHP реализованных с помощью функции preg_match. Разбираемся:

Для чего нужны фильтры?:

Как мы ранее выяснили, многие аспекты веб-сайтов требуют пользовательского ввода и если не фильтровать этот-самый ввод, может случиться очень неприятный казус в виде SQL/NoSQL инъекции, XSS, RCE, Path Disclosure и так далее по списку.

Как фильтруется ввод и что такое preg_match?:

В php существуют несколько решений для фильтрации пользовательского ввода, один из самых популярных и нужный нам - preg_match. С помощью regex она позволяет проверить есть ли в строке нужный нам паттерн символов, что помогает защищаться от различных методов атаки!

Далее мы узнаем как можно обмануть функцию preg_match.

Основное:

Пусть у нас есть следующий PHP код не позволяющий(как разработчик думает) взлома:

<?
$a = $_GET['input'];
if(preg_match("~[^0-9a-z+\\.]~",$a,$match)) { // special char check
	echo "you can't execute following script";
	exit;
}
system($a);
echo "why i am here";
?>

Как же нам обойти данный фильтр?

Все просто, вместо строки мы передадим лист!

http://website/test.php?input[]=abc'def

И сайт выдаст нам why i am here, при этом исполнив комманду!

Вывод:

Данная уязвимость не считалась багом в коде PHP, так как функция preg_match проверяет строки и только первую строку, что означает такой ввод вполне разрешен и может вывести сайт из строя! Именно поэтому важно всегда читать документацию функций, кто знает, может получиться найти легкий RCE?

Внимание! Вся информация строго в ознакомительно-познавательных целях. Автор данной статьи, а также ресурс на котором он размещает данную статью, не несут ответственности за любые последствия от ее прочтения, а также за ваше плохое самочувствие, детей - двоечников и долги по ипотеке.