首頁 >後端開發 >php教程 >PHP安全-檔名操縱

PHP安全-檔名操縱

黄舟
黄舟原創
2017-02-21 09:17:371199瀏覽



檔名操縱

  在許多情況下會使用動態包含,此時目錄名稱或檔案名稱中的部分會保存在一個變數中。例如,你可以快取你的部分動態頁來降低你的資料庫伺服器的負擔。

 

 <?php
 
  include "/cache/{$_GET[&#39;username&#39;]}.html";
 
  ?>


 

  為了讓這個漏洞更明顯,範例中使用了$_GET。如果你使用了受污染資料時,這個漏洞也同樣存在。使用$_GET['username']是一個極端的例子,透過它可以把問題看得更清楚。

  雖然上面的流程有其優點,但它同時為攻擊者提供了一個可以自由選擇快取頁的良機。例如,一個使用者可以方便地透過編輯URL中的username的值來察看其他使用者的快取檔案。事實上,攻擊者可以透過簡單的更改username的值為對應的檔案名稱(不加副檔名)來察看/cache目錄下的所有副檔名為.html的檔案。

 

  http://www.php.cn/

 

  儘管該程式限制了攻擊者所操作的目錄和檔名,但變更檔名並不是唯一的手段。攻擊者可以創造性地達到在檔案系統中進行跨越的目的,而去察看其他目錄中的.html檔案以發現敏感資訊。這是因為可以在字符串使用父目錄的方式進行目錄跨越:

 

  http://www.php.cn/

 

 上面URL的運作結果如下:

 

 <?php
 
  include "/cache/../admin/users.html";
 
  ?>


 

  此時,..意味著/cache的父目錄,也就是根目錄。這樣上面的例子就等價於:

 

<?php
 
  include "/admin/users.html";
 
  ?>


 

  由於所有的檔案都會在檔案系統的根目錄下,所以流程就允許了一個攻擊者可以存取你伺服器上所有的.html檔案。

 

  在某些平台上,攻擊者也可以使用一個NULL來終止字串,例如:

  http://www.php.cn/

  這樣就成功地繞開了.html檔案副檔名的限制。

  當然,一味地去透過猜測攻擊者的所有惡意攻擊手段是不可能的,無論你在文件上加上多少控制,也不能排除風險。重要的是在動態包含時永遠不要使用被污染資料。攻擊手段不是一成不變的,但漏洞不會改變。只要透過過濾資料即可修復這個漏洞(請參閱第一章):

  <?php
 
  $clean = array();
 
  /* $_GET[&#39;filename&#39;] is filtered and stored in
$clean[&#39;filename&#39;]. */
 
  include "/path/to/{$clean[&#39;filename&#39;]}";
 
  ?>


 

  如果你確認參數中只有檔名部分而沒有路徑資訊時,另一個有效的技巧是透過使用basename( )來進行資料的過濾:

 

<?php
 
  $clean = array();
 
  if (basename($_GET[&#39;filename&#39;] ==
$_GET[&#39;filename&#39;])
  {
    $clean[&#39;filename&#39;] = $_GET[&#39;filename&#39;];
  }
 
  include "/path/to/{$clean[&#39;filename&#39;]}";
 
  ?>


 

  如果你允許有路徑資訊但想要在偵測前把它化簡,你可以使用realpath()函數:

 

<?php
 
  $filename =
realpath("/path/to/{$_GET[&#39;filename&#39;]}");
 
  ?>


 

 

 透過上面程式處理所得到的結果($filename)可以用來確認是否位於/path/to目錄下:

 

<?php
 
  $pathinfo = pathinfo($filename);
 
  if ($pathinfo[&#39;dirname&#39;] == &#39;/path/to&#39;)
  {
    /* $filename is within /path/to */.
  }
 
  ?>

  如果偵測不通過,你就應該把這個請求記錄到攻擊日誌以備後查。這在你把這個流程當作深度防範措施時特別重要,因為你要確定其它的安全手段失效的原因。

以上是PHP安全-檔名操縱的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn