攻擊者將惡意代碼/數據注入運行進程,劫持控制流。經典案例:Windows 動畫光標漏洞,通過畸形文件觸發瀏覽器加載,實現任意代碼執行。
void LoadTypeFromStream(unsigned char* stream, SOMETYPE* typtr) {
int len;
memcpy(&len, stream, sizeof(int)); // 讀取長度
memcpy(typtr, stream + sizeof(int), len); // 無邊界檢查,直接拷貝
}
若 len > sizeof(SOMETYPE),將覆蓋棧幀:局部變量、返回地址、調用鏈信息。攻擊者精心構造 len 及後續字節,覆寫返回地址指向注入的 Shellcode。
if (len < 0 || len > sizeof(SOMETYPE)) throw TaintedDataException();
核心原則:永不信任輸入流,嚴格校驗長度與格式。現代編譯器提供 /GS (Stack Guard)、ASLR、DEP 等緩解措施,但代碼層面檢查不可或缺。
反模式:字符串拼接構建 SQL。
攻擊輸入:PWD: x' OR '1'='1 → SELECT ... WHERE PWD='x' OR '1'='1' 恆真,繞過認證。
修復:參數化查詢。
PreparedStatement stmt = conn.prepareStatement("SELECT id FROM users WHERE user=? AND pwd=?");
stmt.setString(1, user); stmt.setString(2, pwd);
數據庫引擎解析參數,徹底隔離代碼與數據。同時移除異常中回顯用戶輸入,防止二次 XSS。
核心:未過濾的用戶輸入直接回顯頁面。
反射型:搜索關鍵詞直接寫入響應。
持久型:惡意腳本存入數據庫,後續訪問者執行。
防禦:輸出編碼。
Java: StringEscapeUtils.escapeHtml4(input) (JTidy)。
ASP: Server.HTMLEncode(Request.Form("username"))。
原則:存儲前編碼或輸出前編碼,寧可重複編碼不可漏編碼。
人工審查低效且易漏。SCA 工具掃描代碼模式(如危險函數調用、未檢查邊界、拼接 SQL),精準定位缺陷。
商業工具:Klocwork (C/C++/Java,IDE 集成)。
開源選項:Cppcheck, SonarQube, FindSecBugs。
將 SCA 集成 CI/CD 流水線,實現「提交即掃描」,左移安全。