前言:
在進行程式碼開發時,有一些開發習慣常常會造成程式漏洞,有時候會進而導致資安問題,
以下列出幾項常見的開發習慣造成的資安問題與錯誤與大家分享
摘要:
-
$_GET 或 $_POST 參數漏洞
-
資料型別檢查失效漏洞
-
不完整的存取權限
-
代入的參數如果用到以 URL 作為數據值
-
網址參數 XSS 攻擊
-
跨站請求偽造攻擊
1. $_GET 或 $_POST 參數漏洞
- PHP: eval() 若帶入沒有處理的 $_GET 和 $_POST 值會很危險,
因此$_GET 或 $_POST 等參數需要被檢查,否則容易被直接執行。
以下為範例:
$userId = $_GET['user_id']; eval("\$userId= \$userId ;");
這樣的寫法會導致 $userId 容易被帶入sql injection,因此 $_GET、$_POST 傳進來的參數都必須要進行檢查
若$userId 被帶入 'user_id';phpinfo(); eval() 就會直接執行
- $_GET 和 $_POST 如果沒有檢查,有可能會造成sql injection,如下範例:
http://example.com/home.php?userid=1
如果userid沒有仔細檢查是否為數值,有可能會帶入sql injection
$userid = $_GET['user_id']; $query = "SELECT * FROM user WHERE user_id = $userid;
若帶入http://example.com/home.php?userid=1AND 1=1";,因為$_GET沒有被檢查,就會成功進入該頁面。
2.資料型別檢查失效漏洞
- 檢查型別後,卻沒有正確處理型別,而只是直接回傳,容易直接回傳入可通過驗證的 sql injection 內容
例如: 對 ‘-1-a’ 做 ‘Integer’ 的驗證也吐回 ‘-1-a’ (發生於php版本5)
$value = -1-a; if (is_numeric($value)){ return $value; } else { return FALSE; }
- 進行判斷式,卻沒有針對判斷式中的變數進行檢查
例如:需要判斷 $value < 0,如果$value沒有檢查型別,就可以成功把不正確的值帶入
3.不完整的存取權限
HTTP_HOST 和 SEVER_NAME的差別
- HTTP_HOST:藉由header 傳遞進來,會有資料被竄改的風險。
- SERVER_NAME:是由web server傳遞進來,較不會被竄改。
4.代入的參數如果用到以 URL 作為數據值,需要進行的檢查
-
參數若以URL若以URL為數據值,最好要有白名單檢查加以限制
-
若沒檢查 SCHEME 型別則可能被拿到 file://etc/passwd,
例如可以進行下方檢查:(用正規表達式來檢查有符合https 的格式)
preg_match("@^https?://@", $url);
5.網址參數 XSS 攻擊
-
網址參數的值需檢查與 encode,例如 Drupal 可以使用 filter_xss
-
Drupal 也有遭受過這樣的攻擊 SA-CORE-2022-002
6. CSRF跨站請求偽造攻擊
endpoint url 加 token 用以檢查驗證是否有效
$userId = $_GET['user_id']; eval("\$userId= \$userId ;");