前一陣子 PHP cgi 功能被爆出有安全性漏洞,駭客透過這個漏洞能夠取得系統的任何一支檔案,只要伺服器是使用 PHP CGI 的方式來執行 PHP 檔,就會中這個漏洞。
Apache run PHP CGI
先介紹一下 PHP CGI 是如何在 apache web server 的環境下執行的,下面是一個簡易的 apache 設定檔, ScriptAlias 可以讓 /local-cgi 指向 /usr/bin,而我們的 php-cgi 執行檔就是放在 /usr/bin 裡面,接著 AddHandler 指定副檔名 php 的檔案都會使用 「application/x-httpd-php5」這個應用程式,最後我們再指定這個應用程式代表 php-cgi。
- ScriptAlias /local-cgi /usr/bin
- AddHandler application/x-httpd-php5 php
- Action application/x-httpd-php5 /local-cgi/php-cgi
當你進入網頁 ,這時伺服器就會執行 php-cgi test.php ,下面是一個簡單的 demo,我先建立一個 test.php 的檔案,裡面只 echo 一段文字,再透過 command line 的方式,透過 php-cgi 執行 test.php 這個檔案。
- <?php
- echo "test string";
- ?>
- X-Powered-By: PHP/5.4.x
- Content-type: text/html
- test string
PHP -s
- -s 的意思是 「--syntax-highlight」,就是打開 php syntax 功能。
如果我使用 php -s test.php ,那麼 PHP 會將 php 的原始碼用有顏色的 html tag 顯示出來,若是網站有 CGI 漏洞,駭客就可以用這個方式,取得 PHP 原始碼,這就是這篇文章要介紹的漏洞,當駭客在網頁的 Url 輸入 「http://xxx/test.php?-s」,這時伺服器會去執行 「php-cgi -s test.php」,讓我們來看看執行後的結果。
- <code><span style="color: #000000">
- <span style="color: #0000BB"><?php<br /><br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"test string"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?><br /></span>
- </span>
- </code>
echo "test string";
?>
駭客取得系統任意檔案
上述的「-s」只是最簡單的駭客方式,我們可以使用 PHP 的 ini 設定,直接取得特殊路徑下的檔案,透過「-d auto_append_file」, PHP 會自動將這個參數指定的檔案,貼在最下方,然後印出來,這樣駭客就能取得如 「/etc/passwd」這些機密檔案。
- php-cgi -dallow_url_include=1 -d auto_append_file=/etc/passwd test.php
修復 PHP CGI 漏洞
修復方式,可以在 httpd.conf 或是 .htaccess 中加入以下的設定。
- RewriteEngine on
- RewriteCond %{QUERY_STRING} ^[^=]*$
- RewriteCond %{QUERY_STRING} %2d|\- [NC]
- RewriteRule .? – [F,L]
前兩個 RewriteCond 是說,如果QUERY_STRING 沒有 「= 」這個符號,而且有出現符號「-」,「RewriteRule」就會使得伺服器回傳 「403 forbidden 」。