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