背景介紹
當應用在調用一些能將字符串轉化成代碼的函數(如php中的eval)時,沒有考慮到用戶是否能控制這個字符串,將造成代碼注入漏洞。狹義的代碼注入通常指將可執行代碼注入到當前頁面中,如php的eval函數,可以將字符串代表的代碼作為php代碼執行,當前用戶能夠控制這段字符串時,將產生代碼注入漏洞(也稱命令執行)。廣義上的代碼注入,可以覆蓋大半安全漏洞的分類
漏洞成因
幾種常用語言,都有將字符串轉化成代碼去執行的相關函數
php : eval,assert
python : exec
java : java中沒有類似php中的eval函數這種直接可以將字符串轉化為代碼執行的函數,但是有反射機制,並期望有各種基於反射機制的表達式引擎,如:OGNL、SpEL等
為什么使用執行代碼函數
應用有時候會考慮靈活性、簡潔性,在代碼中調用eval之類的函數去處理
phpcms中的string2array函數
這個函數可以將phpcms的數據庫settings的字符串形式的數組內容轉換為真實的數組
漏洞危害
執行代碼 ; 上網站寫shell ; 甚至控制服務器
漏洞挖掘
具體操作
漏洞防御
使用json保存數組,當讀取時就不需要使用eval了
對於必須使用eval的地方,一定嚴格處理用戶數據
字符串使用單引號包括可控代碼,插入前使用addslashes轉義
放棄使用preg_replace的e修飾符,使用preg_replace_callback()替換
若必須使用preg_replace的e修飾符,則必用單引號包裹正則匹配出的對象