瞭解cgi/fast-cgi/php-cgi/php-fpm
0x00 什麼是cgi
即Common Gateway Interface 公共閘道器介面,是協議!!!
執行在伺服器上的程式,fork-and-execute 模式,因為web伺服器只能處理靜態html/css,需要動態的就要交給cgi
,有標準輸入,輸出和環境變數的語言都可以編寫,如C,PHP,python,shell,perl等。
//網上找的兩張圖,比較直觀描述了cgi.
cgi通過環境變數獲得傳遞的引數,相關環境變數如下:
環境變數 | 意義 |
SERVER_NAME | CGI指令碼執行時的主機名和IP地址. |
SERVER_SOFTWARE | 你的伺服器的型別如: CERN/3.0 或 NCSA/1.3. |
GATEWAY_INTERFACE | 執行的CGI版本. 對於UNIX伺服器, 這是CGI/1.1. |
SERVER_PROTOCOL | 伺服器執行的HTTP協議. 這裡當是HTTP/1.0. |
SERVER_PORT | 伺服器執行的TCP口,通常Web伺服器是80. |
REQUEST_METHOD | POST 或 GET, 取決於你的表單是怎樣遞交的. |
HTTP_ACCEPT | 瀏覽器能直接接收的Content-types, 可以有HTTP Accept header定義. |
HTTP_USER_AGENT | 遞交表單的瀏覽器的名稱、版本 和其他平臺性的附加資訊。 |
HTTP_REFERER | 遞交表單的文字的 URL,不是所有的瀏覽器都發出這個資訊,不要依賴它 |
PATH_INFO | 附加的路徑資訊, 由瀏覽器通過GET方法發出. |
PATH_TRANSLATED | 在PATH_INFO中系統規定的路徑資訊. |
SCRIPT_NAME | 指向這個CGI指令碼的路徑, 是在URL中顯示的(如, /cgi-bin/thescript). |
QUERY_STRING | 指令碼引數或者表單輸入項(如果是用GET遞交). QUERY_STRING 包含URL中問號後面的引數. |
REMOTE_HOST | 遞交指令碼的主機名,這個值不能被設定. |
REMOTE_ADDR | 遞交指令碼的主機IP地址. |
REMOTE_USER | 遞交指令碼的使用者名稱. 如果伺服器的authentication被啟用,這個值可以設定。 |
REMOTE_IDENT | 如果Web伺服器是在ident (一種確認使用者連線你的協議)執行, 遞交表單的系統也在執行ident, 這個變數就含有ident返回值. |
CONTENT_TYPE | 如果表單是用POST遞交, 這個值將是 application/x-www-form-urlencoded. 在上載檔案的表單中, content-type 是個 multipart/form-data. |
CONTENT_LENGTH | 對於用POST遞交的表單, 標準輸入口的位元組數. |
0x01 什麼是fast-cgi
cgi程序管理器,cgi升級版,也是一個協議。將cgi儲存在記憶體中以提高效能(不用像cgi一樣每次請求都解析php.ini)。可獨立於伺服器。
工作原理:
1. Web Server啟動時載入FastCGI程序管理器(IIS ISAPI或Apache Module)
2. FastCGI程序管理器自身(master)初始化,解析配置檔案,初始化執行環境,啟動多個CGI直譯器程序(可見多個php-cgi/worker)並等待來自Web Server的連線。
3. 當客戶端請求到達Web Server時,FastCGI程序管理器(master)選擇並連線到一個CGI直譯器(worker)。Web server將CGI環境變數和標準輸入傳送到FastCGI子程序php-cgi。
4. FastCGI子程序完成處理後將標準輸出和錯誤資訊從同一連線返回Web Server。當FastCGI子程序關閉連線時,請求處理完成。FastCGI子程序接著等待並處理來自FastCGI程序管理器(執行在Web Server中)的下一個連線。 在CGI模式中,php-cgi在此便退出了)
當worker不夠用時,master可以根據配置預先啟動幾個worker等著,同時如果發現空閒worker太多時,也會停掉一些,這樣就提高了效能,也節約了資源
而對應的是,只要是遵循了這個協議標準實現的程式,就可以稱之為FastCGI程式
這就是fastcgi的對程序的管理。
0x02 什麼是php-cgi
cgi直譯器程序,解釋PHP指令碼。
0x03 什麼是php-fpm
PHP fast-cgi,對fast-cgi的PHP實現,可排程php-cgi程序。可以平滑過載配置。
0x04 cgi安全問題
1. shellsock
參考 ofollow,noindex">重溫經典:shellshock漏洞重現及分析
2. 解析漏洞
環境:vulhub
以nginx為例進行重現:
判斷漏洞,在任意圖片後加/xxx.php
圖片被解析
在上傳圖片馬即可(嘗試phpinfo):
更多解析漏洞參考:
0x05 結語
時不時還能看到cgi-bin,整理下相關概念,不至於太混亂。
0x06 參考資料
https://www.jdon.com/idea/cgi.htm
https://www.zhihu.com/question/19998865
www.nowamagic.net/librarys/veda/detail/1319
www.cnblogs.com/wanghetao/p/3934350.html
https://segmentfault.com/q/1010000000256516
www.cnblogs.com/LittleHann/p/4561462.html
ION/fastcgi-and-php-fpm.html#" target="_blank" rel="nofollow,noindex">https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html#