2016年8月4日 星期四

PHP 代碼審計教程 筆記

一、環境佈署

Wamp
DVWA
ZVulDrill




二、常見漏洞分析與防禦

1.PHP 調試函數:
  • echo、print:輸出變數值,或用於確認程式執行到了哪個流程
  • printf:輸出變數值,顯示不能正確輸出的變數,如浮點數與整數值間的判斷
  • print_r:輸出陣列值或變數值,boolean 的 false 與 NULL 值輸出為空,不會顯示資料類型
  • var_export:輸出陣列值或變數值,當值的類型為 resource 時,會輸出 NULL
  • var_dump:輸出陣列值或變數值,會顯示資料類型
  • debug_zval_dump:輸出類似 var_dump,但多一個 refcount 值用於記錄變數被引用多少次
  • exit:退出
補充資料:PHP 调试技术手册


2.雙引號內的變數會被解析,單引號則一律視為字串輸出。


3.超全域函數(Super Global Variables):
  • $GLOBALSS:引用全域中可用的全部變數
  • $_SERVER
  • $_GET
  • $_POST
  • $_FILES
  • $_REQUEST
  • $_SESSION
  • $_ENV
  • $_COOKIE
補充資料:預定義變數


4.可執行系統指令的函數:
  • ``
  • system
  • exec
  • passthru
  • shell_exec
  • popen
  • proc_open
  • pcntl_exec
補充資料:PHP漏洞全解(二)-命令注入攻击

防禦函數:
  • escapeshellarg
  • escapeshellcmd


5.可注入指令的函數:
  • eval
  • assert
  • preg_replace


6.常見反射型 XSS 漏洞:

(1)變數直接輸出:echo $_GET['xss'];

(2)$_SERVER 參數未過濾:
  • $_SERVER['PHP_SELF'] //該 php 檔相對於網站根目錄的位置
  • $_SERVER['HTTP_USER_AGENT'] //使用者的作業系統及瀏覽器資訊
  • $_SERVER['HTTP_REFERER'] //連接到目前頁面的前一頁面 URL
  • $_SERVER['REQUEST_URI'] //存取此頁面需要的 URI

補充資料:[PHP] $_SERVER 的詳細用法


7.儲存型 XSS 漏洞主要留意 SQL 語法,防禦則透過 htmlspecialchars。


8.引入檔案的參數:
  • include:找不到檔案時,程式仍繼續執行
  • include_once:檢查要引入的檔案是否已引入過,若是,則不重複引入
  • require:找不到檔案時,程式會中止
  • require_once:檢查要引入的檔案是否已引入過,若是,則不重複引入


9.LFI 漏洞:

(1)截斷,如 ../etc/passwd
(2)超長字串截斷(Windows 長度超過 256;Linux 長度超過 4096),如 ././././file
(3)Path Traversal:
  • %2e%2e%2f    ->    ../
  • %2e%2e/     ->    ../
  • ..%2f     ->    ../
  • %2e%2e%5c    ->    ..\
  • %2e%2e%\    ->    ..\
  • ..%5c     ->    ..\
  • %252e%252e%255c    ->    ..\
  • ..%255c     ->    ..\
補充資料:


10.LFI 防禦:
  • 禁止使用 \0:str_replace("\0", '', $value)
  • 將作業系統對檔案名稱限制的長度設更短
  • php.ini 中設定 open_basedir
  • 利用條件限制式,如 switch 、 if else
補充資料:


11.RFI 漏洞:
  • allow_url_include=on
  • allow_url_fopen=on


12.RFI 防禦:
  • php.ini 中設定 allow_url_include、allow_url_fopen=off

13.SQL Injection 防禦:
  • Filter Extension
  • magic quotes gpc
  • mysql_real_escape_string
  • addslashes
  • 關鍵字過濾


14.CSRF 防禦:
  • 驗證 HTTP Referer
  • 在 Request 增加 token 並進行驗證
  • 在 HTTP Header 中自訂屬性並進行驗證



15.代碼執行漏洞:
  • 動態函數執行:function 之間的呼叫造成的漏洞
  • 匿名函數執行:create_function 未進行過濾

補充資料:


16.反序列化漏洞:
  • unserialize function 的參數可控
  • 程式碼中的 _construct()、_destruct()、_wakeup() 函數內,有存在向 php 檔案寫入資料的類別

補充資料:

17.變數覆蓋漏洞:
  • register_globals=on
  • 透過 $_GLOBALS 宣告變數


18.常見檔案操作函數:

copy、rmdir、unlink、delete、fwrite、chmod、fgetc、fgetcsv、fgets、fgetss、file、file_get_contents、fread、readfile、ftruncate、file_put_contents、fputcsv、fputs


19.檔案上傳漏洞:
  • 未對檔案格式做檢查
  • 檔案名稱可控
  • 上傳的目錄可遭外部存取
  • move_uploaded_files
補充資料:

防禦方法:
  • 使用白名單方式檢查附檔名
  • 檔案上傳後改變其檔案名稱
  • 上傳的檔案不可執行
  • 注意 截斷
  • 驗證 Content-Type




三、漏洞挖掘思路

1.漏洞形成的條件:

(1)變數值可控
(2)使用危險的函數


2.Code Review 本質:
  • 找漏洞 = 找對應的變數與 function
  • 追蹤變數的過程
  • 透過變數找 function、透過 function 找變數

沒有留言:

張貼留言