PHP安全-防止Directory Traversal攻擊

  • 對象: 程式設計師/資訊安全人員

  • 難易度: ★★★☆☆

預備知識

PHP語法

介紹

Directory Traversal(目錄尋訪),網頁開發人員沒有做好目錄權限控管,讓網頁使用者可以任意瀏覽所有目錄及目錄中的檔案,檔案中的內容可能遭到偷看、刪除或改寫。

Directory Traversal本身並不是攻擊,多半是用來成就其他攻擊的手段。

常見缺失

一般最常見的弱點程式碼,利用GET方式取得指定的檔案

<?php
readfile(‘/home/user/data’.$_GET[‘data_file’])
?>

倘若使用下列URL存取有弱點的網站

http://hostname/readfile.php?datafile=http://www.cnblogs.com/../etc/passwd

則會造成主機中所有帳號都會顯示出來

解決方式

1. 加上open_basedir 將PHP程式可以開啟的目錄,直接設定於php.ini或httpd.conf中

php.ini

      open_basedir = /home/user/:/tmp/

這時,所有的php程式可開啟的目錄都會受到open_base_dir的限制,多個目錄之間用冒號(:)隔開。

2. 撰寫一個字串檢查函式,當使用者輸入字串含有”..”等跳離根目錄關鍵字,則跳出字串有誤錯誤訊息,並且拒絕存取。