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:退出
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
防禦函數:
- 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。
- 繞過姿勢(IE9 以下或有使用 SVG tag):Bypassing htmlspecialchars and executing XSS
- 相關 CVE(PHP < 5.2.12):CVE-2009-4142
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 -> ..\
- LFI attacks for Predators
- Read PHP files using LFI (Base 64 Bypass)
- Using php://filter for local file inclusion
- PHP文件包含漏洞总结
- 论PHP常见漏洞第二弹:常见的包含漏洞
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 未進行過濾
補充資料:
- PHP 代碼執行漏洞〈一〉
- PHP 代碼執行漏洞〈二〉
- PHP 代碼執行漏洞〈三〉
- PHP 代碼執行漏洞〈四〉
- PHP create_function()注入命令执行漏洞
- 论PHP常见漏洞第三弹:注入漏洞
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 找變數
沒有留言:
張貼留言