代碼審計安全實踐

  • 2019 年 11 月 11 日
  • 筆記

第一次寫文章,希望大牛們輕噴

一、代碼審計安全

代碼編寫安全:

程序的兩大根本:變量與函數

漏洞形成的條件:可以控制的變量「一切輸入都是有害的 」

變量到達有利用價值的函數(危險函數)「一切進入函數的變量是有害的」

漏洞的利用效果取決於最終函數的功能,變量進入什麼樣的函數就導致什麼樣的效果。

變量安全:

秉承一個原則 「一切輸入都是有害的」

預定義變量[常規外部提交的變量]:

除了$_GET,$_POST,$_Cookie的提交之外,還來源於$_SERVER,$_ENV, $_SESSION 等register_globals = on [未初始化的變量] 當On的時候,傳遞過來的值會被直接的註冊為全局變量直接使用,而Off的時候,我們需要到特定的數組裡去得到它,PHP » 4.20 默認為off

變量覆蓋[未初始化及覆蓋前定義的變量]:

如:$$使用不當、遍歷初始化變量、 extract() 、parse_str()等

變量的傳遞與存儲[中轉的變量]:

存儲於數據庫、文件[如配置、緩存文件等

函數安全:

「什麼樣的函數導致什麼樣的漏洞」

文件包含包含漏洞:require、include、require_once、include_once

代碼執行執行任意代碼漏洞:eval()、assert()、preg_replace()、create_function()

命令執行執行任意命令漏洞:exec()、passthru()、proc_open()、shell_exec()、system()、popen()

文件系統操作文件(目錄)讀寫等漏洞:file_get_contents、file_put_contents、fopen、readfile

數據庫操作SQL注入漏洞:select from、mysql_connect、mysql_query、mysql_fetch_row 數據顯示 XSS漏洞:print、print_r、echo、print、sprintf、die、Var_dump、var_export

二、代碼審計和漏洞驗證:

環境:

PHP.ASP等語言環境

Apache.Tomcat.Ngin等中間件

Mysql.Oracle等數據庫

工具:

Notepad++、Sublime等代碼編輯器

Seay.RIPS等代碼審計工具

Burp等漏洞驗證工具

三、常見漏洞挖掘與防範:

根據功能點定向審計,例如在文件上傳功能模塊、文件管理功能模塊、登錄功能等模塊進行漏洞挖掘驗證。

通讀全部代碼

四、安全編程規範:

1.SQL注入防護

(1)採用預編譯,在Java Web開發一般在採用預處理,在sql語句中放入?佔位符,然後通過後面的傳參傳遞參數,可在一定程度上防止SQL注入。

(2)過濾函數和類, 使用pdo的prepare方式來處理sql查詢,但是當PHP版本<5.3.6之前還是存在寬位元組SQL注人漏洞,原因在於這樣的查詢方式是使用了PHP本地模擬prepare,再把完整的SQL語句發送給MySQL服務器,並且有使用setnames'gbk'語句,所以會有PHP和MySQL編碼不一致的原因導致SQL注人

(3) GPC/RUTIME魔術引號

通常數據污染有兩種方式:

1、是應用被動接收參數,類似於GET、POST等;

2、是主動獲取參數,類似於讀取遠程頁面或者文件內容等。

所以防止SQL注入的方法就是要守住這兩條路

→ magic_ quotes_ gpc 負責對GET、POST、COOKIE的值進行過濾。

→ magic_ quotes_ runtime 對從數據庫或者文件中獲取的數據進行過濾。

2. 反引號命令執行

反引號(`)也可以執行命令,它的寫法很簡單,實際上反引號(`)執行命令是調用的shell_exec()函數。

這段代碼正常執行的情況下是會輸出當前用戶名的,而我們在php.ini裏面吧PHP安全模式打開一下,再重啟下WebServer從新加載PHP配置文件,再執行這段代碼的時候,我們會看到下面這個提示:

Waring:shell_exec() [function.shell_exec]: Cannot execute using backquotes inSafe Mode in D:wwwtest1.php on line 2

這個提示說明反引號執行命令的方式是使用的shell_exec()函數。

3.命令執行漏洞防範規範:

(1) 命令防注入函數: PHP在SQL防注入上有addslashes()和mysql_[real_]escape_string()等函數過濾SQL語句,輸人一個string類型的參數,為要過濾的命令,返回過濾後的sting類型的命令,過濾後的string類型的命令,過濾的字符為

』&』、』;』、』|』、』*』、』?』、』~』、』<』、』>』、』^』、』(』、』)』、』[』、』]』、』{』、』}』、』$』、』』、』x0A』、』xFF』、』%』、單引號和雙引號僅僅在不成對的時候被轉義。

(2) 參數白名單: 參數白名單方式在大多數由於參數過濾不嚴產生的漏洞中都很好用是一種通用修復方法,我們之前已經講過,可以在代碼中或者配置文件中限定某些參數,在使用的時候匹配一下這個參數在不在這個白名單列表中,如果不在則直接顯示錯誤提示即可。