可能受到的攻擊

如果不想把 PHP 嵌入到服務(wù)器端軟件(如 Apache)作為一個(gè)模塊安裝的話,可以選擇以 CGI 的模式安裝?;蛘甙?PHP 用于不同的 CGI 封裝以便為代碼創(chuàng)建安全的 chroot 和 setuid 環(huán)境。這種安裝方式通常會(huì)把 PHP 的可執(zhí)行文件安裝到 web 服務(wù)器的 cgi-bin 目錄。CERT 建議書 ? CA-96.11 建議不要把任何的解釋器放到 cgi-bin 目錄。盡管 PHP 可以作為一個(gè)獨(dú)立的解釋器,但是它的設(shè)計(jì)使它可以防止下面類型的攻擊:

  • 訪問系統(tǒng)文件:http://my.host/cgi-bin/php?/etc/passwd 在 URL 請(qǐng)求的問號(hào)(?)后面的信息會(huì)傳給 CGI 接口作為命名行的參數(shù)。其它的解釋器會(huì)在命令行中打開并執(zhí)行第一個(gè)參數(shù)所指定的文件。 但是,以 CGI 模式安裝的 PHP 解釋器被調(diào)用時(shí),它會(huì)拒絕解釋這些參數(shù)。
  • 訪問服務(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。如果是這樣的話,某些服務(wù)器會(huì)先檢查用戶訪問 /secret 目錄的權(quán)限,然后才會(huì)創(chuàng)建 http://my.host/cgi-bin/php/secret/script.php 上的頁(yè)面重定向。不幸的是,很多服務(wù)器并沒有檢查用戶訪問 /secret/script.php 的權(quán)限,只檢查了 /cgi-bin/php 的權(quán)限,這樣任何能訪問 /cgi-bin/php 的用戶就可以訪問 web 目錄下的任意文件了。 在 PHP 里,運(yùn)行時(shí)配置指令 cgi.force_redirect、 doc_rootuser_dir 都可以為服務(wù)器上的文件和目錄添加限制,用于防止這類攻擊。下面將對(duì)各個(gè)選項(xiàng)的設(shè)置進(jìn)行詳細(xì)講解。