代碼安全是眾多安全問題的根源。不安全的代碼,往往能夠被攻擊者利用,從而竊取用戶隱私甚至協(xié)助攻擊者盜取商業(yè)機密。正因為如此,越來越多的公司在產(chǎn)品研發(fā)階段引入了代碼安全檢查。常見的代碼安全檢查方法包括:人工遍歷和靜態(tài)工具掃描。但無論哪一種,都存在一定的弊端,特別是無法回避一個共同的問題:某些漏洞無法立即驗證——前端構(gòu)造的危險SQL命令是否已經(jīng)在數(shù)據(jù)庫中執(zhí)行。
本文以PHP+MySQL注入攻擊為例,引入數(shù)據(jù)庫審計功能,增強代碼安全檢查和漏洞挖掘的效率。在一個典型的Web安全架構(gòu)中,Web前端都會與后臺數(shù)據(jù)庫進行交互。代碼審計過程中無法發(fā)現(xiàn)的隱蔽問題,在數(shù)據(jù)庫審計日志中往往能夠得到體現(xiàn)。
以典型的SQL注入為例,當攻擊者訪問PHP注入點時,往往會通過篡改參數(shù)的方式提交注入命令。如果被攻擊頁面腳本確實存在漏洞,則非法命令必定會被帶入SQL語句的執(zhí)行過程。因此,在開啟數(shù)據(jù)庫審計功能的情況下,完全可以借助數(shù)據(jù)庫審計日志,判斷前端SQL注入是否成功。
ySQL注入點例子。前端Web頁面存在SQL注入漏洞,導致攻擊者提交的非法表單數(shù)據(jù)被帶入SQL命令。
若要通過數(shù)據(jù)庫審計日志查看SQL命令是否成功執(zhí)行,還需要在執(zhí)行該操作前配置MySQL數(shù)據(jù)庫審計功能。方法如下:
編輯MySQL配置文件mysql.ini設(shè)置log參數(shù)為指定日志文件路徑,log=”E:/mysql.log”修改完成后,保存配置文件并重新啟動MySQL服務(wù)。
再 次 訪 問 URL:http://127.0.0.1/sqlinject/sql.php,提交包含非法參數(shù)的SQL注入命令。
數(shù)分鐘后(數(shù)據(jù)庫寫日志有緩存機制,不是立即寫入),訪問文件E:mysql.log??梢郧宄乜吹組ySQL數(shù)據(jù)庫確實執(zhí)行了帶有非法參數(shù)的SQL命令,由此可以判斷sql.php的代碼確實存在SQL注入漏洞。
該方法同樣適合于其它類型的Web代碼安全檢查,如:ASP、JSP等;特別是那些前端不顯示的。