在廣泛使用的LAMP架構中,Apache與PHP之間的交互,有三種常見的方式。php
第一種是最通用最多見的Module方式,即在httpd.conf中使用LoadModule的方式,將php的dll或者so文件加載到apache當中。css
還有兩種是CGI方式和FastCGI方式。其實後者用的愈來愈普遍了。通常PHP-FPM也是與FastCGI進行配合使用的。html
能夠參考CGI、FastCGI和PHP-FPM關係圖解和Apache下PHP的幾種工做方式來了解更多。python
當咱們瞭解原理後,Apache是須要調用第三方CGI程序,可是一個程序是否是CGI程序這個事很難界定,咱們可否經過調用特定的CGI程序(普通程序)來執行任意系統命令呢。答案是能夠的。linux
1.保證htaccess會被解析,即當前目錄中配置了`AllowOverride all或AllowOverride Options FileInfo。AllowOverride參數具體做用可參考Apache之AllowOverride參數詳解。(Require all granted也是須要的)nginx
2.cgi_module被加載。即apache配置文件中有LoadModule cgi_module modules/mod_cgi.so這麼一句且沒有被註釋。web
3.有目錄的上傳、寫入權限。apache
上傳.htaccess 文件, 內容以下:bash
Options ExecCGI
AddHandler cgi-script .xx
Options ExecCGI表示容許CGI執行,若是AllowOverride只有FileInfo權限且自己就開啓了ExecCGI的話,就能夠不須要這句話了。網絡
第二句告訴Apache將xx後綴名的文件,當作CGI程序進行解析。
接下來,以Windows平臺爲例,上傳poc.xx文件,內容以下:
#!C:/Windows/System32/cmd.exe /c start calc.exe
1
第一行用來表示CGI程序的路徑。能夠隨便開你的腦洞。
由於CGI程序處理完成後,會被Apache關閉,因此咱們這裏要用啓動新進程的方式來啓動。
這時訪問poc.xx。計算器就出來啦~~
拿火絨劍來看下~
一目瞭然,讀取了兩個文件後,httpd.exe的mod_cgi.so模塊執行了咱們的命令。
linux環境下,也是隨你玩,是直接調用/bin/bash仍是調用/usr/bin/python來反彈Shell。都是能夠的。這其實也就是正常使用方式,由於Python也會被用做爲CGI解析程序。
咱們再來看看FastCGI模式的,這個依賴的是mod_fcgid.so,默認安裝包裏甚至沒有這個so文件,不過在PHPStudy的默認配置中,就已是加載了的,而且AllowOverride也是All權限,手動斜眼。
其實還有mod_proxy_fcgi,更爲常見,也是默認開啓的,還不清楚可否利用,表哥表姐們能夠嘗試一下。
1.AllowOverride all或AllowOverride Options FileInfo。
2.mod_fcgid.so被加載。即apache配置文件中有LoadModule fcgid_module modules/mod_fcgid.so
3. 有目錄的上傳、寫入權限。
上傳.htaccess 文件, 內容以下:
Options +ExecCGI
AddHandler fcgid-script .abc
FcgidWrapper "C:/Windows/System32/cmd.exe /c start cmd.exe" .abc
老樣子,若是默認就開啓了ExecCGI,則第一句能夠省略。
第二句表示,abc後綴名的文件須要被fcgi來解析。AddHandler還能夠換成AddType。
再上傳1.abc。內容無所謂。
訪問1.abc,計算器就出來了~再拿火絨劍看下。
PS:若擁有上傳權限,以上兩種利用方式,在PHPstudy默認配置當中,都是能夠直接使用的。
其實一些小夥伴也已經發現了,上面的問題再配合有上傳漏洞,我甚至能夠穿個立刻去。可是不管是CGI仍是FastCGI彷佛都是絕對路徑,相對路徑可不能夠呢?
通過了一些嘗試,並請教了」褲衩哥」,發現相對路徑也是能夠的,起始點彷佛和session.save_path變量的值是一致的。如圖,好比phpstudy當中,起始點就是在\Extensions\tmp\tmp中。
那麼,好比說我想要html後綴使用php來解析。就能夠這樣寫。
AddHandler fcgid-script .html
FcgidWrapper "../../php/php7.3.4nts/php-cgi.exe" .html
再來,我想調用網站根目錄的calc.exe。能夠這樣。
AddHandler fcgid-script .xx
FcgidWrapper "../../../WWW/localhost/calc.exe" .xx
不過計算器沒法正常彈出。23333 我猜應該是由於calc畢竟不是個標準CGI程序致使的吧。並且也不必繞這麼大個圈子,就沒繼續測試了。
Module模式下寫法以下:
AddType application/x-httpd-php .jpg
或
<FilesMatch "test.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
甚至能夠將 .htaccess自己做爲php來解析,裏面編寫一句話。這塊網絡上相關資料不少。
經過配置auto_append_file或auto_prepend_file能夠向全部php文件中的開頭或尾部插入指定的文件的內容。
在. htaccess中的寫入以下:
php_value auto_prepend_file "/home/fdipzone/header.php"
php_value auto_append_file "/home/fdipzone/footer.php"
對於CGI/FastCGI模式 PHP 5.3.0 以上版本,還可使用 在目錄下建立.user.ini文件 。來引入該參數。寫法以下:
auto_prepend_file = 123.gif