I metodi magici PHP sono davvero necessari per l'iniezione di oggetti PHP?

4

Sto cercando di capire il difetto di PHP Object Injection in vBulletin 5.1.x (CVE 2015-7808) e mi sono imbattuto nei requisiti per Object Injection come dichiarato da OWASP:

The application must have a class which implements a PHP magic method (such as __wakeup or __destruct) that can be used to carry out malicious attacks, or to start a "POP chain".
Source: https://www.owasp.org/index.php/PHP_Object_Injection

Tuttavia in questa scrittura sulla vulnerabilità di vbulletin non vedo un metodo magico sfruttato, viene invece chiamata la funzione rewind() della classe vB_dB_Result a causa di foreach() :

public function decodeArguments($arguments){
        if ($args = @unserialize($arguments)){
            $result = '';
            foreach ($args AS $varname => $value){
                $result .= $varname;
...
class vB_dB_Result implements Iterator{
...
    public function rewind(){
        //no need to rerun the query if we are at the beginning of the recordset.
        if ($this->bof){
            return;
        }
        if ($this->recordset){
            $this->db->free_result($this->recordset);
        }
...
abstract class vB_Database{
... 
    function free_result($queryresult){
        $this->sql = '';
        return @$this->functions['free_result']($queryresult);
    }

Mi manca qualcosa o la dichiarazione OWASP è semplicemente falsa in questo caso?

    
posta Tomas 07.01.2016 - 13:09
fonte

1 risposta

3

L'affermazione in questo modulo è falsa. È possibile utilizzare qualsiasi metodo per l'iniezione di oggetti PHP. Il punto importante è che il metodo deve essere effettivamente chiamato .

Il vantaggio dei metodi magici è che hanno tutti lo stesso nome, e __wakeup e __destruct sono entrambi chiamati automaticamente .

In questo caso specifico, rewind funziona come viene chiamato come parte dell'iteratore nel ciclo foreach.

Ma funziona anche in altri esempi più semplici. Immagina ad esempio di avere due classi, entrambe con un metodo con lo stesso nome:

class Foo {
    public function bar() {
        echo "everything is safe here";
    }
    [other methods...]
}

class BadFoo {
    public $command = "something";
    public function bar() {
        echo exec($this->command);
    }
}

Ora vuoi annullare la serializzazione di un oggetto della classe Foo sicura e chiamare la funzione bar su di esso:

$foo = unserialize($_GET['foo']);
$foo->bar();

Ovviamente, un utente malintenzionato potrebbe semplicemente inviare un oggetto della classe BadFoo , portando all'esecuzione del codice:

O:6:"BadFoo":1:{s:7:"command";s:2:"id";}

Questo dimostra che funziona con tutti i metodi, non solo con i metodi magici, purché il metodo sia chiamato e faccia qualcosa a cui un utente malintenzionato sia interessato.

    
risposta data 07.01.2016 - 16:33
fonte

Leggi altre domande sui tag