可能受到的攻擊
如果不想把 PHP 嵌入到服務(wù)器端軟件(如 Apache)作為一個(gè)模塊安裝的話(huà),可以選擇以
CGI 的模式安裝?;蛘甙?PHP 用于不同的 CGI
封裝以便為代碼創(chuàng )建安全的 chroot 和 setuid 環(huán)境。這種安裝方式通常會(huì )把
PHP 的可執行文件安裝到 web 服務(wù)器的 cgi-bin
目錄。CERT 建議書(shū) ? CA-96.11
建議不要把任何的解釋器放到 cgi-bin 目錄。盡管 PHP
可以作為一個(gè)獨立的解釋器,但是它的設計使它可以防止下面類(lèi)型的攻擊:
-
訪(fǎng)問(wèn)系統文件:http://my.host/cgi-bin/php?/etc/passwd
在 URL 請求的問(wèn)號(?)后面的信息會(huì )傳給 CGI
接口作為命名行的參數。其它的解釋器會(huì )在命令行中打開(kāi)并執行第一個(gè)參數所指定的文件。
但是,以 CGI 模式安裝的 PHP 解釋器被調用時(shí),它會(huì )拒絕解釋這些參數。
-
訪(fǎng)問(wèn)服務(wù)器上的任意目錄:http://my.host/cgi-bin/php/secret/doc.html
好像上面這種情況,PHP 解釋器所在目錄后面的 URL 信息
/secret/doc.html 將會(huì )例行地傳給
CGI 程序并進(jìn)行解釋。通常一些 web
服務(wù)器的會(huì )將它重定向到頁(yè)面,如
http://my.host/secret/script.php。如果是這樣的話(huà),某些服務(wù)器會(huì )先檢查用戶(hù)訪(fǎng)問(wèn)
/secret 目錄的權限,然后才會(huì )創(chuàng )建
http://my.host/cgi-bin/php/secret/script.php
上的頁(yè)面重定向。不幸的是,很多服務(wù)器并沒(méi)有檢查用戶(hù)訪(fǎng)問(wèn)
/secret/script.php 的權限,只檢查了
/cgi-bin/php 的權限,這樣任何能訪(fǎng)問(wèn)
/cgi-bin/php 的用戶(hù)就可以訪(fǎng)問(wèn)
web 目錄下的任意文件了。
在 PHP 里,運行時(shí)配置指令
cgi.force_redirect、
doc_root 和
user_dir
都可以為服務(wù)器上的文件和目錄添加限制,用于防止這類(lèi)攻擊。下面將對各個(gè)選項的設置進(jìn)行詳細講解。