複製鏈接
請複製以下鏈接發送給好友

代碼注入

鎖定
隨着B/S模式應用開發的發展,使用這種模式編寫應用程序的程序員也越來越多。但是由於程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用户輸入數據的合法性進行判斷,使應用程序存在安全隱患。
中文名
代碼注入
實    質
用户可以提交一段數據庫查詢代碼
對    象
應用程序的程序員
目    的
獲得某些他想得知的數據

代碼注入定義

用户可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。

代碼注入代碼注入的用途

代碼注入蓄意的用途

惡意使用
代碼注入的使用一般被視為心懷惡意的舉動,而它確實常常如此。透過代碼注入技術在或者破解系統上,以獲取信息、提權、或者非法訪問某系統是相當流行的。
惡意用途的代碼注入可包括:
  • 透過SQL注入(見下文)隨意修改數據庫中的值。影響所及可從某網站外觀損毀,到對敏感數據嚴重的破壞。
  • 當用户拜訪惡意網站時,透過網頁瀏覽器或其插件的漏洞安全隱患,進行代碼注入,以便安裝流氓軟件到用户機器上。
  • 透過PHP或者ASP注入安裝流氓軟件或者運行惡意代碼於服務端。
  • 於UNIX系統利用Shell注入安全隱患對setuid root二進制數據作修改,達成提權root使用權限的目的。
  • 於視窗系統利用Shell注入安全隱患對系統服務做手腳,達成提權到本地端系統使用權限的目的。
  • 從網頁瀏覽器利用HTML/腳本注入(跨網站腳本)進行連線竊取 / cookies竊取進而冒充他人,獲取他人個人敏感數據。
善意使用
某些人可能會出於善意而使用代碼注入。例如,透過代碼注入以改變或者調試某程序或者系統的行為可以"擺弄"系統以某種方式表現其行為而不懷任何惡意。打比方説:
  • 代碼注入可以添入某原本搜索結果頁面設計上沒有的字段,方便用户。
  • 透過對原本設計默認函數沒有曝光的字段賦值,代碼注入可提供一個全新的方式來過濾、排序、或者歸類數據。
這些人訴諸此種替代手段大致是下面幾種原因之一:
  • 對軟件中希望改進函數進行潤飾的其他方法證明不可能,或者
  • 其他對軟件修改的方式代價過高,或者
  • 其他對軟件修改的方式過度艱苦。
一般開發社羣對以此為目的的代碼注入不表歡迎。他們稱這種行為為三腳貓、半調子、或者駭 / 黑程序。(kludge or hack)
某些開發者允許或者甚至表揚代碼注入的使用來“加強”他們的軟件;通常是因為該方案提供了較不昂貴的方式來實現新的或者特殊化的功能。不幸的是,其副作用與無法列管的藴含式可能相當危險。
一般來説,即使相當善意的代碼注入使用都不被建議使用。 [1] 

代碼注入非蓄意的用途

某些用户可能會不經意的進行代碼注入,因為他們對程序提供的輸入,沒列在當初開發系統者的考慮中。例如:
  • 用户可能視某個包含表示字符或者字符字符串為合法輸入,而不知該字符被開發者所保留而有特殊意義 (像 "張三 & 李四" 裏的 "&" 字符,或者英文約翰的 M&M 巧克力: "John's M&M's"裏頭的單引號)。
  • 用户可能會提交格式錯亂的文件做為輸入。這種行為對單一程序沒什麼問題,但可能對整個接收系統是災難。 [2] 

代碼注入避免代碼注入

要避免代碼注入的種種問題,得充分發揮輸入輸出處理保全,例如:
  • 輸入確認。
  • 更換危險字符。例如在PHP透過addslashes()函數保護SQL注入。
  • 輸入編碼。
  • 輸出編碼。
  • 採用其他沒有飽受代碼注入漏洞困擾的編程實現,例如“參數化SQL查詢” ("parameterized SQL queries" 又名 "prepared statements" 亦有時稱 "bind variables") [2] 
參考資料
  • 1.    The Daily WTF regularly reports real-world incidences of susceptibility to code injection in software.
  • 2.    News article "Flux spreads wider" - First Trojan horse to make use of code injection to prevent detection from a firewall