產品常見安全漏洞挖掘和分析以及解決方案

緩衝區溢出

原理
當函數內的一個數組緩衝區接受用戶輸入的時候,未對輸入的長度進行合法性檢查時,可以構造數據覆蓋超過緩衝區的高地址上原本的其他棧幀數據,如果本身的數據內就保存了一系列的指令的二進制代碼,一旦棧溢出修改了函數的返回地址,並將該地址指向這段二進制代碼的起始位置,那麼就形成成了基本的溢出攻擊行爲。
防護措施
1)只使用安全的內存操作函數。
2)在進行內存操作之前,對要操作的長度和被操作空間的長度進行比較,如果大於禁止繼續進行操作。
–這裏要注意整數溢出,長度對比時要注意,使用安全函數也要注意(安全函數有傳入的長度限制,溢出後這個限制就無用了 ,例如strncpy第三參數是無符號,溢出後就變得很大)
挖掘方法
1)檢查是否有使用strcpy、strcat、sprintf、vsprintf等危險函數,其數據是否有越界可能。(這個先記錄後分析)
2)檢查使用gets、fgets、getchar、fgetc、getc、read、scanf、sscanf、fscanf、getenv等函數時,其數據是否有越界可能。
3)檢查使用strncpy、strncat、snprintf等函數時,n爲是否爲緩衝區可接收的最大長度減1 。(snprintf在linux上內部有減1)
4)檢查使用memcpy、 memmove等函數時,n爲要拷貝的長度,並且在拷貝之前要對n進行檢查,是否小於等於緩衝區最大容量。

數組越界

原理與緩存衝區溢出類似
挖掘方法:通過工具靜態掃描(codescan),分析掃描結果 (這個通過工具掃描,人工挖掘無較好方式–無關鍵字,得逐行查看)

格式化字符串漏洞

原理:使用用戶輸入的字符串作爲格式字符串,通過構造格式化字符串(如%x,%s,%n), 攻擊者將有機會對任意內存地址進行讀寫操作。
防護措施:禁止使用用戶輸入的字符串作爲格式字符串
挖掘方法:搜索所有scanf, printf, sprintf, snprintf, vsprintf, vsnprintf, syslog,等檢查是否有使用用戶輸入的字符串作爲格式化字符串。

整數溢出

原理:有符號整數會在最高位用0表示正數,用1表示負數,無符號整數則沒有這種限制,其之間的操作會存在上溢和下溢,從而導致安全漏洞。
挖掘方法:檢視外部輸入參數長度做校驗的地方,是否存在整數溢出而繞過檢查,導致超過緩存取大小的數據寫入、程序崩潰或邏輯漏洞等。
檢查點:
1)無符號整數的下溢和上溢(賦值)。
2)有符號整數之間的比較。
3)有符號整數的運算。
4)無符號整數和有符號整數的對比。
通過工具掃描,人工挖掘無較好方式–無關鍵字,得逐行查看,關鍵代碼通過代碼走讀(模塊待定)。

命令注入

原理:調用系統命令前未對外部用戶輸入數據進行合法性檢查,導致直接執行非法用戶構造的命令
挖掘方法:檢視system、popen、exec系列函數,以及封裝的函數,確認命令裏面使用的參數是否有做限制(保證無特殊字符)或做轉義(escapeshellarg或類似方法)

SQL注入

原理:構造特殊的SQL語句(參數)對數據庫進行非法操作
挖掘方法:以使用sqlite數據庫爲例,檢視是否有使用sqlite,搜索sqlite3,關鍵字包括sqlite3_exec,sqlite3_get_table等,查看sql語句是否通過sqlite3_snprintf/sqlite3_mprintf構造,不是則需要替換,若通過sqlite3_snprintf/sqlite3_mprintf構造的,則需要注意字符串參數是否都是使用的%q且是用單引號擴起來(%q會對單引號做處理,使用%s就存在注入可能)

文件上傳

原理:服務端未檢測文件類型,可能導致上傳非法的文件到設備後臺
挖掘方法:檢查產品中上傳文件的相關api函數,是否有對文件類型判斷(後綴和內容限制),並確保文件名無特殊字符或00截斷(後面這個可能導致命令注入)

目錄穿越

原理:直接使用外部傳入參數做路徑,未對參數進行檢測(如包含…/、範圍非法等),導致其訪問限制外的目錄或文件
挖掘方法:檢查產品中上傳文件的api函數是否有對文件路徑做檢查

權限校驗

挖掘方法:檢查訪問產品中的相關資源是否都通過了權限校驗(checkuser,CheckCookie等)再進行的操作。

XSS

原理:以CGI爲例,CGI輸出是通過替換HTML模板內容輸出的,替換內容爲客戶端上傳(沒有限制XSS特殊字符),且替換時也沒有做處理就存在XSS注入漏洞
挖掘方法:替換時HTML模板內容時檢測內容是否爲外部傳入,是否做過特殊字符限制,是否對字符進行轉義處理。

CSRF

防護措施:通過檢查http請求中的referer頭部信息;服務端下發唯一併且具備時效性的token後,檢查客戶端請求中提交的token

SSRF

原理:服務程序接收客戶端上傳的URL,未做過濾和限制直接訪問URL
挖掘方法:檢視是否有使用curl、wget等的進行url訪問,檢查url是否是外部輸入,是否做了過濾和限制。

CRLF (配置文件)

原理:在保存某個字段的配置時利用\r\n(linux服務器上\n就可以了)進行換行,輸入其他字段的數據,以達到 越權修改 其他字段數據,或繞後其他字段 數據格式 校驗的目的
挖掘方法:搜索保存配置的方法,檢查是否爲外部輸入,是否做了格式校驗或限制\r\n(或者\n)的輸入

XXE

原理:即XML外部實體注入,當允許引用外部實體時,而XML數據又是來自外部輸入,通過構造惡意內容,就可能導致任意文件讀取、系統命令執行、內網端口探測、攻擊內網網站等
挖掘方法 :搜索加載xml的代碼,查看xml內容來源是否爲外部輸入,是否可以構造外部實體(DTD)進行加載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章