Не може да се направи невъзможно използването на PHP webshell-ове с текущо наличните инструменти и практики, когато в сървъра има работещо PHP, което трябва да може да се използва от сайтовете, хоствани на този сървър, ако се остави дупка, през която атакуващият може да качи PHP webshell. Може да се ограничи средата, до която биха имали достъп, но колкото и да се ограничи с текущите инструменти и практики, наличната среда винаги е достатъчна за поразии. Ако в кода на сайтовете няма дупки и не се допусне неоторизиран достъп през FTP, SSH и т.н., това е достатъчно за защита от PHP webshell-ове, но проблемът е, че това никога не може да се гарантира. PHP webshell-овете са просто PHP код, използващ съвсем стандартни функции в PHP, повечето от които се ползват в почти всеки PHP сайт, изключая от това основно системни функции като exec(), system(), shell_exec() и някои, имащи общо с тяхната насоченост, функции, но понякога и те са нужни в някои PHP сайтове за някои по-специфични, но полезни и напълно нормални нужди. Може да се забранят всички функции в PHP, които не се ползват от сайтовете, но винаги ще останат достатъчно активни функции, които биха свършили добра работа на атакуващия (ако ще да са дори само функциите за връзка с базата данни). Така че нито забрана на PHP функции, нито ограничаване диапазона във файловата система, до която потребителят има достъп, са достатъчни за спасение от поразии с PHP webshell-ове.
Мога да ти предложа една идея за частична защита от PHP webshell-ове - да автентикираш всеки от файловете, съдържащи програмен код, с парола. Т.е., слагаш един ред с таен стринг (удовлетворяващо дълъг и богат на разнообразни символи) в PHP файловете на сайта, например
GeSHi (PHP):
//b8dg*&bG&*F(c7O9S(L&*(H&*(
вписваш нещо подобно в .htaccess
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} (.*).php
RewriteCond %{SCRIPT_FILENAME} !mychecker.php
RewriteRule ^(.*)$ mychecker.php [L]
целта на което е да препраща всички заявки към PHP файлове, имената на които са различни от mychecker.php, към този файл mychecker.php, а във въпросния файл mychecker.php слагаш нещо подобно
GeSHi (PHP):
<?php
$secretString = 'b8dg*&bG&*F(c7O9S(L&*(H&*(';
$pattern = "/^.*$pattern.*\$/m";
include($requestedFile);
}
?>
с което, когато бъдеш пренасочен към този файл, той ще проверява съдържанието на оригинално извикания файл и, ако намери търсения стринг, ще include-ва извикания файл. Демек, в браузъра извикваш файла index.php, при което .htaccess те препраща към mychecker.php, за да бъде проверено дали файлът index.php съдържа тайния стринг и, ако го съдържа, се зарежда съдържанието на index.php. Така например, ако някой качи в сайта ти PHP webshell през някаква дупка в някоя upload форма, тъй като атакуващият няма да знае за този таен стринг, ще качи файла с PHP webshell-а без него и когато се опита да го извика, ще бъде пренасочен към mychecker.php, който няма да открие нужния стринг и няма да зареди файла с PHP webshell-а.
Това е една идея за защита от PHP webshell-ове, която ми хрумна наскоро и която е доста частична, за да може да се нарече решение за защита, но в много случаи е елементарна за вмъкване и може да даде поне спокойствието, че в сайта няма да бъде задействан PHP webshell, качен през някаква дупка в сайта или сървъра, стига атакуващият да не се добере до тайния стринг или да инжектира кода на PHP webshell-а директно в някой от файловете, които съдържат стринга. Занимавам се с хостинги отдавна и наблюденията ми са, че преобладаващите пакости по сайтовете са именно качени PHP webshell-ове през някаква стандартна дупка (я в upload форма, я вирус в клиентски компютър със запазена парола за S/FTP достъп...), при което атакуващият или не е имал възможност да види съдържанието на другите файлове, или въобще не си е направил труда за това, тъй като работата му е била вършена от бот, така че подобна защита може да свърши някаква работа, поне докато не стане достатъчно използвана, за да почнат атакуващите да обръщат внимание и на това. Досега съм споделял тази идея за защита само на няколко колеги, сега я казвам и публично, а е толкова елементарна като концепция, че със сигурност е хрумвала и ще хрумне на още много хора (даже се чудя как вече не се е изтъркала, вместо сега да говорим за нея), така че може и да не трае дълго ползата ѝ, но засега може да ти даде някакво спокойствие.
Разбира се, тъй като с така приложената автентикация на файловете с парола променяме пътя на четене на файловете, много сайтове биха се нуждаели от допълнителна корекция в кода на целия сайт, за да не се счупи работата на сайта. Най-лесно е със сайтове, които са написани така, че винаги всичко минава през index.php - тогава дори не е нужно да се прави отделен файл mychecker.php, а проверката може да се сложи в самия index.php, където да се проверява всеки include/require. Такъв например е случаят с публичната част на Wordpress - не позволяваш нищо друго да се зарежда там, всичко се насочва към index.php и си правиш проверките. Далеч обаче не е такъв случаят с административната част на Wordpress, където е едно голямо мазало... но няма невъзможни неща

Най-добра реализация на тази защита би могла да се постигне, ако не се прави с пренасочване към файл, който да прави проверките, ами се напише един PHP или Apache модул, който да върши тази работа. Тогава няма да е нужно никакво донагласяне на кода на никой сайт, ще е достатъчно само тайният стринг да се опише в конфигурацията на модула и във всички PHP файлове на сайта (което може да се направи и със скрипт за нула време) и всичко просто ще работи. Само дето аз все още не мога да пиша нито PHP, нито Apache, модули, така че не мога да предложа готово решение, но ако някой може да пише и идеята му се стори интересна, нека се чувства свободен да го предложи - нямам никакви претенции за нищо