常見開發習慣造成的資安問題與錯誤

前言:

在進行程式碼開發時,有一些開發習慣常常會造成程式漏洞,有時候會進而導致資安問題,

以下列出幾項常見的開發習慣造成的資安問題與錯誤與大家分享

摘要:

  1. $_GET 或 $_POST 參數漏洞

  2. 資料型別檢查失效漏洞

  3. 不完整的存取權限 

  4. 代入的參數如果用到以 URL 作為數據值

  5. 網址參數 XSS 攻擊

  6. 跨站請求偽造攻擊

1. $_GET 或 $_POST 參數漏洞

  • PHP: eval()  若帶入沒有處理的 $_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.不完整的存取權限

不要使用 $_SERVER['HTTP_HOST'] 來檢查,因為 Header 可以被竄改,若要使用請改成  $_SERVER['SERVER_NAME']

HTTP_HOST 和 SEVER_NAME的差別

  • HTTP_HOST:藉由header 傳遞進來,會有資料被竄改的風險。
  • SERVER_NAME:是由web server傳遞進來,較不會被竄改。

4.代入的參數如果用到以 URL 作為數據值,需要進行的檢查

  • 參數若以URL若以URL為數據值,最好要有白名單檢查加以限制

  • 若沒檢查 SCHEME 型別則可能被拿到 file://etc/passwd,

preg_match("@^https?://@", $url);

5.網址參數 XSS 攻擊

6. CSRF跨站請求偽造攻擊

endpoint url 加 token 用以檢查驗證是否有效

 $userId = $_GET['user_id']; eval("\$userId= \$userId ;");