注入攻擊(Injection Flaws)
From OWASP
http://www.owasp.org/index.php/Injection_Flaws
Contents - 1 簡(jiǎn)介
- 2 受影響的環(huán)境
- 3 示例
- 4 找到你系統(tǒng)的漏洞
- 5 保護(hù)你的系統(tǒng)
|
簡(jiǎn)介
注入攻擊是攻擊者通過Web應(yīng)用傳播惡意的代碼到其他的系統(tǒng)上。這些攻擊包括系統(tǒng)調(diào)用(通過shell命令調(diào)用外部程序)和后臺(tái)數(shù)據(jù)庫(kù)調(diào)用(通過SQL注入)一些設(shè)計(jì)上有缺陷的Web應(yīng)用中的Perl,python和其他語言寫的腳本(script)可能被惡意代碼注入和執(zhí)行。任何使用解釋執(zhí)行的Web應(yīng)用都有被攻擊的危險(xiǎn)。 Any time a web application uses an interpreter of any type there is a danger of an injection attack.
很多Web應(yīng)用使用操作系統(tǒng)的特性和外部程序來完成他們的某些功能。發(fā)送郵件或許是最常用的外部程序,很多其他程序也一同被使用。當(dāng)一個(gè)Web應(yīng)用通過Http請(qǐng)求把外部請(qǐng)求的信息傳遞給應(yīng)用后臺(tái)時(shí),必須非常小心。否則攻擊這可以把某些特殊字符、惡意代碼或者命令改變器注入這些信息中,你的Web應(yīng)用可能會(huì)把這些攻擊代碼傳遞給后臺(tái)執(zhí)行。
SQL注入是一種廣泛使用的危險(xiǎn)度極高的注入攻擊方式。要使用這種攻擊方式,攻擊者必須找到Web應(yīng)用傳遞給數(shù)據(jù)庫(kù)的參數(shù)。通過把惡意的SQL命令嵌入?yún)?shù)中,攻擊者可以讓W(xué)eb應(yīng)用把這些查詢發(fā)送到數(shù)據(jù)庫(kù)中。發(fā)現(xiàn)這些攻擊和系統(tǒng)漏洞并不難。但是攻擊產(chǎn)生的后果卻相當(dāng)致命,攻擊者可以得到,破壞或者摧毀你所有數(shù)據(jù)庫(kù)的內(nèi)容。
注入攻擊的系統(tǒng)漏洞可以很容易的被發(fā)現(xiàn)和攻擊,但是他們?cè)谙到y(tǒng)中也是相當(dāng)?shù)碾[蔽。攻擊的結(jié)果也會(huì)很嚴(yán)重,從小的錯(cuò)誤到危及整個(gè)系統(tǒng),甚至是系統(tǒng)被破壞。在任何情況下,外部調(diào)用的使用是非常廣泛的,所以Web應(yīng)用的注入漏洞必須高度重視。
影響的系統(tǒng)
每個(gè)Web應(yīng)用系統(tǒng)都允許外部命令,比如系統(tǒng)調(diào)用、shell調(diào)用和SQL請(qǐng)求。注入攻擊依賴于這些系統(tǒng)如何使用這些調(diào)用和系統(tǒng)的哪些部分使用這些調(diào)用。但是如果Web應(yīng)用沒有很好的設(shè)計(jì)和編碼,所有的外部調(diào)用(external calls)都會(huì)受到攻擊。
案例
· Examples: 一個(gè)惡意的參數(shù)修改可以使系統(tǒng)訪問其他用戶的文件(比如文件請(qǐng)求加上文件追溯符“../” characters as part of a filename request). 另外一些命令也可以附加到參數(shù)中使得腳本運(yùn)行 (如., “; rm –r *”). SQL查詢可以通過在SQL語句中增加一些限制條件,比如”where”子句中增加“OR 1=1”)來獲得對(duì)數(shù)據(jù)請(qǐng)求的訪問的權(quán)限.
如何找到你系統(tǒng)的漏洞
最好的方法是搜索你所有的源代碼,找到使用外部資源的命令(比如system,exec,fork,Runtime.exec,SQL queries,或者在你系統(tǒng)里面使用解釋器interpreters的任何創(chuàng)建請(qǐng)求的的語法)注意很多語言通過多種方式來運(yùn)行外部命令。開發(fā)者應(yīng)檢查他們的代碼,找到所有的可以通過HTTP請(qǐng)求注入的漏洞。檢查過代碼之后,注意采用如下的步驟來保護(hù)你的應(yīng)用。
保護(hù)你的系統(tǒng)
最簡(jiǎn)單的防護(hù)措施是盡可能避免執(zhí)行外部解釋器。對(duì)于腳本命令和系統(tǒng)調(diào)用,有很多特點(diǎn)的類庫(kù)來執(zhí)行他們。使用這些類庫(kù)但不引入系統(tǒng)腳本解釋器,通過這種方式可以避免腳本命令導(dǎo)致的大量問題。
對(duì)于你仍然要是用的系統(tǒng)命令,比如對(duì)后臺(tái)數(shù)據(jù)庫(kù)的訪問,你必須仔細(xì)檢查確保其中不包含任何惡意內(nèi)容。你也可以結(jié)構(gòu)化你的請(qǐng)求代碼使得參數(shù)傳入的都是數(shù)據(jù)而不是可執(zhí)行的語句。使用存儲(chǔ)過程和Prepared statement會(huì)提供很好的保護(hù),確保提供的輸入都作為數(shù)據(jù). 這些方法會(huì)減少,但不是完全減少外部調(diào)用的風(fēng)險(xiǎn)。你仍然必須驗(yàn)證這些輸入來確保它滿足安全的要求。
另外一個(gè)提供對(duì)命令注入很好的預(yù)防方法是通過系統(tǒng)權(quán)限配置,只允許Web應(yīng)用使用某些特定的命令. 因此你不能以root用戶來啟動(dòng)Web服務(wù)器或者以DBADMIN用戶來訪問數(shù)據(jù)庫(kù)。否則攻擊者可以利用這些權(quán)限很高的用戶攻擊系統(tǒng)。某些J2EE系統(tǒng)可以允許使用JAVA沙箱(java sand box),這種方式也可以防止某些系統(tǒng)命令的執(zhí)行。
如果一個(gè)外部命令必須執(zhí)行,任何插入到命令的用戶信息都必須強(qiáng)制檢查。要提供處理錯(cuò)誤的機(jī)制,比如處理請(qǐng)求時(shí)的超時(shí)處理和阻塞處理。所有的輸出,返回代碼錯(cuò)誤代碼都必須檢查來確保所有的處理過程沒有受到攻擊。這樣至少可以讓你檢查是否系統(tǒng)運(yùn)行中是否出現(xiàn)了問題。否則攻擊永遠(yuǎn)不能被檢測(cè)到。
“OWASP Filters project“ 是一個(gè)可重用的防止注入攻擊的組件。OWASP 發(fā)布的CodeSeeker是一個(gè)應(yīng)用級(jí)別的防火墻。