Bypass фильтров на PHP, или почему важно читать документацию функции.
Введение:
В этой статье мы узнаем об обходе фильтров пользовательского ввода на 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?
Внимание! Вся информация строго в ознакомительно-познавательных целях. Автор данной статьи, а также ресурс на котором он размещает данную статью, не несут ответственности за любые последствия от ее прочтения, а также за ваше плохое самочувствие, детей - двоечников и долги по ипотеке.