軟件安全開(kāi)發(fā)生命周期概述_第1頁(yè)
軟件安全開(kāi)發(fā)生命周期概述_第2頁(yè)
軟件安全開(kāi)發(fā)生命周期概述_第3頁(yè)
軟件安全開(kāi)發(fā)生命周期概述_第4頁(yè)
軟件安全開(kāi)發(fā)生命周期概述_第5頁(yè)
已閱讀5頁(yè),還剩69頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

軟件安全開(kāi)發(fā)生命周期杭州安恒信息技術(shù)有限公司軟件安全開(kāi)發(fā)生命周期(SDL)基于WEB應(yīng)用程序的SDL目錄簡(jiǎn)介安全需求分析安全設(shè)計(jì)安全編程安全測(cè)試安全部署及安全響應(yīng)軟件安全開(kāi)發(fā)生命周期簡(jiǎn)介安全開(kāi)發(fā)周期,即SecurityDevelopmentLifecycle(SDL),是微軟提出的從安全角度指導(dǎo)軟件開(kāi)發(fā)過(guò)程的管理模式。SDL不是一個(gè)空想的理論模型。它是微軟為了面對(duì)現(xiàn)實(shí)世界中安全挑戰(zhàn),在實(shí)踐中的一步步發(fā)展起來(lái)的軟件開(kāi)發(fā)模式。典型的軟件開(kāi)發(fā)流程中,如瀑布模型,中心圍繞著產(chǎn)品功能,完全沒(méi)有安全方面的考慮。這樣的開(kāi)發(fā)流程可以造就功能上相對(duì)完善的軟件,但是無(wú)法滿足在安全上的需要。由于軟件開(kāi)發(fā)過(guò)程中未進(jìn)行任何有效的安全控制措施,導(dǎo)致軟件開(kāi)發(fā)后由于其固有的安全隱患所引起的安全事件頻頻發(fā)生,給黑客及惡意人員可趁之機(jī),由此導(dǎo)致的經(jīng)濟(jì)損失不可估量。軟件安全開(kāi)發(fā)生命周期

雖然目前企業(yè)和組織已經(jīng)逐步意識(shí)到軟件安全的重要性,但是他們把目光更多的聚焦到了軟件開(kāi)發(fā)后的漏洞掃描或滲透測(cè)試,盡管這個(gè)過(guò)程能夠發(fā)現(xiàn)和解決大多數(shù)的安全隱患,但是后期的安全評(píng)估和安全整改,將帶來(lái)更大的成本投入和人力投入;甚至由于開(kāi)發(fā)人員的流動(dòng)導(dǎo)致許多安全漏洞無(wú)法得到解決。據(jù)美國(guó)國(guó)家標(biāo)準(zhǔn)局(NIST)早年發(fā)表的一份調(diào)查報(bào)告估計(jì),更好的安全控制措施將為后期安全整改的總體成本節(jié)省三分之一以上的費(fèi)用,且有效規(guī)避70%以上由于軟件安全隱患所引發(fā)的安全事件。軟件安全開(kāi)發(fā)生命周期軟件安全開(kāi)發(fā)生命周期簡(jiǎn)介安全需求分析安全設(shè)計(jì)安全編程安全測(cè)試安全部署及安全響應(yīng)軟件安全開(kāi)發(fā)生命周期安全需求分析——設(shè)定安全目標(biāo)在需求分析階段,加入以下的安全考慮產(chǎn)品提供的安全功能產(chǎn)品如何安全的與用戶(或其它軟件模塊)交互特別的,安全方面的考慮對(duì)產(chǎn)品開(kāi)發(fā)計(jì)劃的影響產(chǎn)品的風(fēng)險(xiǎn)評(píng)估和威脅模型(threatmodeling)產(chǎn)品的缺省功能配置軟件安全開(kāi)發(fā)生命周期簡(jiǎn)介安全需求分析安全設(shè)計(jì)安全編程安全測(cè)試安全部署及安全響應(yīng)軟件安全開(kāi)發(fā)生命周期安全設(shè)計(jì)在安全設(shè)計(jì)階段,特別加入以下兩方面的考慮減少攻擊界面。例如,對(duì)一個(gè)網(wǎng)絡(luò)軟件的設(shè)計(jì),它需要監(jiān)聽(tīng)那些網(wǎng)絡(luò)端口,是否可以減少監(jiān)聽(tīng)端口的數(shù)目?那些用戶可以與這些端口建立連接,是否要加強(qiáng)身份驗(yàn)證?深層防御。底層模塊的設(shè)計(jì)中,假設(shè)上層模塊有可能出現(xiàn)安全漏洞。對(duì)傳遞的數(shù)據(jù)考慮進(jìn)一步校驗(yàn)軟件安全開(kāi)發(fā)生命周期簡(jiǎn)介安全需求分析安全設(shè)計(jì)安全編程安全測(cè)試安全部署及安全響應(yīng)軟件安全開(kāi)發(fā)生命周期安全編程獨(dú)立、完整且集中的輸入驗(yàn)證創(chuàng)建并使用了獨(dú)立的用戶輸入驗(yàn)證模塊以完成對(duì)所有用戶的輸入校驗(yàn),以此可帶來(lái):統(tǒng)一的輸入檢測(cè)策略統(tǒng)一的驗(yàn)證邏輯統(tǒng)一的錯(cuò)誤驗(yàn)證處理降低升級(jí)和維護(hù)成本軟件安全開(kāi)發(fā)生命周期校驗(yàn)全部的程序輸入保證所有變量在使用之前都經(jīng)過(guò)嚴(yán)格的校驗(yàn),防止被污染的數(shù)據(jù)進(jìn)入程序。校驗(yàn)全部的輸入長(zhǎng)度通過(guò)限制輸入長(zhǎng)度,可以有效的控制一些攻擊使其不給系統(tǒng)帶來(lái)過(guò)大的威脅:SQLInjectXSSFileInclude………軟件安全開(kāi)發(fā)生命周期校驗(yàn)全部的輸入類(lèi)型不同的程序所接收到的參數(shù)類(lèi)型應(yīng)嚴(yán)格區(qū)分并校驗(yàn),對(duì)于非法的類(lèi)型應(yīng)有相關(guān)異常進(jìn)行處理以防止其進(jìn)入程序。不使用任何方式驗(yàn)證失敗的數(shù)據(jù)當(dāng)程序?qū)δ硞€(gè)數(shù)據(jù)校驗(yàn)失敗時(shí)(如:校驗(yàn)數(shù)據(jù)類(lèi)型),相關(guān)的異常處理程序應(yīng)拋棄該數(shù)據(jù)并中斷操作,而不應(yīng)對(duì)數(shù)據(jù)進(jìn)行任何的修復(fù)嘗試。對(duì)HTTP所有內(nèi)容進(jìn)行校驗(yàn)除需對(duì)傳統(tǒng)的HTTPGET、POST等數(shù)據(jù)進(jìn)行嚴(yán)格校驗(yàn)外,還應(yīng)對(duì)HTTP內(nèi)所有可能使用到的字段進(jìn)行校驗(yàn),防止字段中包含惡意字符而污染程序,如:RefererHostCookie……軟件安全開(kāi)發(fā)生命周期校驗(yàn)向用戶輸出的數(shù)據(jù)當(dāng)程序通過(guò)查詢后臺(tái)數(shù)據(jù)庫(kù)或其他方式從后臺(tái)獲取數(shù)據(jù)后,在將數(shù)據(jù)輸出給用戶前應(yīng)對(duì)該數(shù)據(jù)進(jìn)行校驗(yàn),校驗(yàn)其中是否包含有非法字符、可執(zhí)行客戶端腳本等惡意信息。使用安全的SQL查詢方式在進(jìn)行SQL查詢時(shí),必須使用安全的查詢方式,如:PreparedStatement,以避免查詢語(yǔ)句中由用戶惡意插入SQL語(yǔ)句所帶來(lái)的風(fēng)險(xiǎn)。禁止使用JavaScript進(jìn)行任何校驗(yàn)由于JavaScript為客戶端腳本,因此任何試圖使用JavaScript對(duì)用戶數(shù)據(jù)進(jìn)行校驗(yàn)的行為都可能被用戶構(gòu)造的本地腳本所繞過(guò),因此,所有校驗(yàn)工作應(yīng)由服務(wù)端程序完成而不是客戶端。軟件安全開(kāi)發(fā)生命周期使用安全、統(tǒng)一的編碼或轉(zhuǎn)義方式創(chuàng)建并使用獨(dú)立、統(tǒng)一的編碼或轉(zhuǎn)移方式,而且編碼或轉(zhuǎn)移中,至少應(yīng)包含對(duì)以下類(lèi)別數(shù)據(jù)的編碼或轉(zhuǎn)移:可能造成SQL注入的數(shù)據(jù),如:分號(hào)、單引號(hào)等可能造成XSS的數(shù)據(jù),如:script、javascript等設(shè)定有安全的權(quán)限邊界所有的程序都應(yīng)清楚的了解到自己能做什么,而在其所能做的范圍之外,均屬于其權(quán)限邊界之外,應(yīng)嚴(yán)格禁止對(duì)其權(quán)限之外的任何操作。校驗(yàn)被調(diào)用的后臺(tái)命令若程序需要調(diào)用后臺(tái)可執(zhí)行程序,則在調(diào)用時(shí),應(yīng)通過(guò)使用完整路徑或?qū)Τ绦蜻M(jìn)行HASH校驗(yàn)等方式保證程序的調(diào)用正確。軟件安全開(kāi)發(fā)生命周期校驗(yàn)被調(diào)用的文本或配置文件若程序需要調(diào)用后臺(tái)文本或配置文件,則在調(diào)用前,應(yīng)相對(duì)文件或配置文件的完整性和有效性進(jìn)行檢查,以確保讀入的文本或配置文件是正確可用的。確保程序所記錄的日志可控若程序需要記錄額外的操作日志等信息,應(yīng)保證這些日志中的某些或全部?jī)?nèi)容不來(lái)自用戶輸入,否則用戶可能通過(guò)外部惡意提交信息的方式填充日志。軟件安全開(kāi)發(fā)生命周期簡(jiǎn)介安全需求分析安全設(shè)計(jì)安全編程安全測(cè)試安全部署及安全響應(yīng)軟件安全開(kāi)發(fā)生命周期安全測(cè)試安全測(cè)試是什么?在產(chǎn)品的生命周期中,特別是產(chǎn)品開(kāi)發(fā)基本完成到發(fā)布階段,對(duì)產(chǎn)品進(jìn)行檢驗(yàn)以驗(yàn)證產(chǎn)品符合安全需求定義和產(chǎn)品質(zhì)量標(biāo)準(zhǔn)的過(guò)程。安全測(cè)試目標(biāo)提升產(chǎn)品安全質(zhì)量盡量在發(fā)布前兆到安全問(wèn)題予以修補(bǔ)降低成本度量安全當(dāng)前安全測(cè)試方法有模式匹配方法,將程序看作字符串狀態(tài)機(jī)模型,將程序看作狀態(tài)機(jī)黑盒模型,將程序看作黑盒子白盒模型,將程序看作路徑的組合軟件安全開(kāi)發(fā)生命周期安全測(cè)試當(dāng)前安全測(cè)試的問(wèn)題覆蓋性完備性可度量性當(dāng)前安全測(cè)試?yán)щy測(cè)試?yán)碚摵茈y適用于安全領(lǐng)域安全測(cè)試基礎(chǔ)理論薄弱,當(dāng)前測(cè)試方法缺少理論指導(dǎo),也缺乏技術(shù)產(chǎn)品工具測(cè)試VS安全測(cè)試BUGVS安全漏洞(并非是BUG的一個(gè)子集)信息泄露,WMF,LNK,SYNFLOOD漏洞是BUG嗎?軟件安全開(kāi)發(fā)生命周期安全測(cè)試假設(shè)條件測(cè)試:導(dǎo)致問(wèn)題的數(shù)據(jù)是用戶不小心構(gòu)成的(只考慮提供給用戶的界面)安全測(cè)試:導(dǎo)致問(wèn)題的數(shù)據(jù)是攻擊者處心積慮構(gòu)成的(考慮所有攻擊界面,包括可污染/滲透?jìng)鬟f的界面)思考域測(cè)試:功能本身安全測(cè)試:功能,系統(tǒng)機(jī)制,外部環(huán)境,應(yīng)用與數(shù)據(jù)自身安全風(fēng)險(xiǎn)與安全屬性問(wèn)題發(fā)現(xiàn)模式測(cè)試:違反功能定義的輸出安全測(cè)試:違反權(quán)限,能力與約束黑盒:狀態(tài)或行為異常灰盒:未完備的約束檢測(cè)靜態(tài)白盒:基于規(guī)范軟件安全開(kāi)發(fā)生命周期安全測(cè)試

安全測(cè)試與滲透測(cè)試出發(fā)點(diǎn)與目的成本測(cè)試對(duì)象覆蓋/完備/度量解決方案過(guò)程參與軟件安全開(kāi)發(fā)生命周期軟件安全開(kāi)發(fā)生命周期安全自身要素安全包括了三個(gè)層次安全功能(特性)安全策略(部署,配置,全局設(shè)計(jì)準(zhǔn)則)安全實(shí)現(xiàn)安全測(cè)試是對(duì)以上幾個(gè)層次的驗(yàn)證和度量外部防護(hù)系統(tǒng)是一種補(bǔ)充保護(hù)安全測(cè)試

安全功能測(cè)試是否足夠是否實(shí)現(xiàn)實(shí)現(xiàn)正確性安全策略測(cè)試是否足夠是否實(shí)現(xiàn)實(shí)現(xiàn)正確性代碼自身安全數(shù)據(jù)邊界檢測(cè)是否正確足夠體系設(shè)計(jì)是否正確足夠權(quán)限限制與檢測(cè)是否正確足夠處理邏輯是否正確軟件安全開(kāi)發(fā)生命周期安全測(cè)試黑盒思路:基于功能與邊界值FUZZ智能FUZZ全局?jǐn)?shù)據(jù)結(jié)構(gòu)白盒思路:基于路徑源碼審計(jì)二進(jìn)制靜態(tài)分析二進(jìn)制數(shù)據(jù)流動(dòng)態(tài)追蹤分析軟件安全開(kāi)發(fā)生命周期簡(jiǎn)介安全需求分析安全設(shè)計(jì)安全編程安全測(cè)試安全部署及安全響應(yīng)軟件安全開(kāi)發(fā)生命周期安全部署及安全響應(yīng)安全部署軟件需提供相應(yīng)的文檔和工具,指導(dǎo)用戶如何安全的使用。安全響應(yīng)當(dāng)前任何一個(gè)軟件開(kāi)發(fā)模式(包括SDL在內(nèi)),都無(wú)法確保發(fā)布的軟件沒(méi)有安全漏洞。因此,需要事先制訂對(duì)應(yīng)的相應(yīng)模式,包括:(內(nèi)部或外部發(fā)現(xiàn)的)安全漏洞以何種途徑匯報(bào)如何評(píng)估安全漏洞的嚴(yán)重級(jí)別開(kāi)發(fā)安全補(bǔ)丁的流程測(cè)試安全補(bǔ)丁的流程發(fā)布安全補(bǔ)丁的流程如何在以后開(kāi)發(fā)中避免類(lèi)似的安全漏洞,等等軟件安全開(kāi)發(fā)生命周期軟件安全開(kāi)發(fā)生命周期(SDL)基于WEB應(yīng)用程序的SDL目錄概述在公開(kāi)提供的SDL文檔中,找不到專(zhuān)門(mén)針對(duì)如何保護(hù)Web應(yīng)用程序或在線服務(wù)的指南。誠(chéng)然,大多數(shù)SDL非實(shí)現(xiàn)要求同樣適用客戶端/服務(wù)器和Web應(yīng)用程序。就象威脅模型對(duì)Web窗體應(yīng)用程序與Windows?窗體應(yīng)用程序同樣重要。而對(duì)SOAP服務(wù)和對(duì)Windows服務(wù)執(zhí)行最終安全審查也同樣重要。但對(duì)于跨站點(diǎn)腳本(XSS)和SQL注入等與Web相關(guān)的漏洞會(huì)是怎樣的情況呢?如果SDL如此注重防御客戶端/服務(wù)器應(yīng)用程序的緩沖區(qū)溢出,它為什么會(huì)忽視針對(duì)在線服務(wù)發(fā)起的XSS攻擊這一Web頭號(hào)公敵的防御呢?下面以JAVA編程安全為例說(shuō)明。基于WEB應(yīng)用程序的SDL簡(jiǎn)介跨站腳本(XSS)注入漏洞(InjectionFlaws)惡意文件執(zhí)行不安全的直接對(duì)象引用跨站點(diǎn)請(qǐng)求偽造(CSRF)信息泄露和錯(cuò)誤處理不當(dāng)殘缺的認(rèn)證和會(huì)話管理不安全的加密儲(chǔ)存不安全的通信限制URL訪問(wèn)失效JAVA安全編程——OWASPTOP10ANDESAPI簡(jiǎn)介ESAPI(EnterpriseSecurityAPI)其實(shí)簡(jiǎn)單一點(diǎn)來(lái)說(shuō),ESAPI就是為編寫(xiě)出更加安全的代碼設(shè)計(jì)出來(lái)的一些API,方便使用者調(diào)用,從而方便的編寫(xiě)安全的代碼。它本身是開(kāi)源的,同時(shí)提供JAVA版本和.NET版本。代碼下載地址:/p/owasp-esapi-java/下圖顯示了提供的API與OWASP列出的10個(gè)安全問(wèn)題的涵蓋關(guān)系:

WhatisanEnterpriseSecurityAPI?

TheESAPIFamilyCommunityBreakdownOWASPWhatisanEnterpriseSecurityAPI?

AddressingTheOWASPTopTenOWASPTopTenOWASPESAPIA1:InjectionA2:CrossSiteScripting(XSS)A3:BrokenAuthenticationandSessionManagementA4:InsecureDirectObjectReferenceA5:CrossSiteRequestForgery(CSRF)A6:SecurityMisconfigurationA7:InsecureCryptographicStorageA8:FailuretoRestrictURLAccessA9:InsufficientTransportLayerProtectionA10:UnvalidatedRedirectsandForwardsEncoderEncoder,ValidatorAuthenticator,User,HTTPUtilitiesAccessReferenceMap,AccessControllerUser(CSRFToken)SecurityConfigurationEncryptorAccessControllerHTTPUtilitiesAccessControllerOWASPWhatisanEnterpriseSecurityAPI?

OWASPESAPIProjectScorecardAuthentication2.01.41.41.4Identity2.01.41.41.4AccessControl2.01.41.41.41.4InputValidation2.01.41.41.41.41.42.0OutputEscaping2.01.41.41.41.42.0Canonicalization2.01.41.41.41.42.0Encryption2.01.41.41.41.4RandomNumbers2.01.41.41.41.4ExceptionHandling2.01.41.41.41.41.42.0Logging2.01.41.41.41.41.4IntrusionDetection2.01.41.41.4SecurityConfiguration2.01.41.41.41.41.4WAF2.02.02.0下圖顯示結(jié)合ESAPI設(shè)計(jì)你的程序下圖簡(jiǎn)單呈現(xiàn)ESAPI如何運(yùn)作跨站腳本(XSS)定義跨站腳本是最普遍的web應(yīng)用安全漏洞。當(dāng)應(yīng)用程序在發(fā)送給瀏覽器的頁(yè)面中包含用戶提供的數(shù)據(jù),但沒(méi)有經(jīng)過(guò)適當(dāng)驗(yàn)證或轉(zhuǎn)譯那些內(nèi)容,這就導(dǎo)致跨站腳本漏洞。危害攻擊者能在受害者瀏覽器中執(zhí)行腳本以劫持用戶會(huì)話、迫害網(wǎng)站、插入惡意內(nèi)容、重定向用戶、使用惡意軟件劫持用戶瀏覽器等等。種類(lèi)已知有三種著名跨站漏洞:1)存儲(chǔ)式;2)反射式;3)基于DOM。反射式跨站腳本通過(guò)測(cè)試或代碼分析很容易找到。解決之道驗(yàn)證輸入驗(yàn)證輸入很簡(jiǎn)單-檢查每個(gè)輸入的有效性。這可能意味著很多東西,但在典型的和簡(jiǎn)單的情況下,這意味著檢查輸入類(lèi)型和數(shù)據(jù)的長(zhǎng)度。例如,如果你是從一個(gè)文本框接受一個(gè)標(biāo)準(zhǔn)的郵政編碼,你會(huì)知道,唯一有效的類(lèi)型是一個(gè)數(shù)字(0-9),而長(zhǎng)度應(yīng)該是6,不能多也不能少。并非所有的案件都如此簡(jiǎn)單,但很多是相似的。下圖顯示驗(yàn)證輸入的架構(gòu)。這里的關(guān)鍵是,一切都進(jìn)行驗(yàn)證,所有的輸入,這并不來(lái)自于應(yīng)用程序(包括用戶輸入,請(qǐng)求頭,Cookie,數(shù)據(jù)庫(kù)數(shù)據(jù)...)。實(shí)例

getValidInput(java.lang.Stringcontext,java.lang.Stringinput,java.lang.Stringtype,intmaxLength,booleanallowNull,ValidationErrorListerrors)isValidInput(java.lang.Stringcontext,java.lang.Stringinput,java.lang.Stringtype,intmaxLength,booleanallowNull)StringvalidatedFirstName=ESAPI.validator().getValidInput("FirstName",myForm.getFirstName(),"FirstNameRegex",255,false,errorList);booleanisValidFirstName=ESAPI.validator().isValidInput("FirstName",myForm.getFirstName(),"FirstNameRegex",255,false);編碼輸出對(duì)驗(yàn)證輸入的另一面就是編碼輸出。編碼輸出,是用來(lái)確保字符被視為數(shù)據(jù),而不是作為HTML元字符被瀏覽器解析。這些技術(shù)定義一些特殊的“轉(zhuǎn)義”字符。沒(méi)有正確轉(zhuǎn)義的數(shù)據(jù)它仍然會(huì)在瀏覽器中正確解析。編碼輸出只是讓瀏覽器知道數(shù)據(jù)是不是要被解析,達(dá)到攻擊無(wú)法實(shí)現(xiàn)的目的。需要編碼的部分:1、HTML實(shí)體2、HTML屬性3、Javascript4、CSS5.URL下圖像顯示編碼輸出的架構(gòu)。實(shí)例1——HTML實(shí)體編碼//performinginputvalidationStringcleanComment=ESAPI.validator().getValidInput("comment",request.getParameter("comment"),"CommentRegex",300,false,errorList);//checktheerrorListhere//performingoutputencodingfortheHTMLcontextStringsafeOutput=ESAPI.encoder().encodeForHTML(cleanComment);實(shí)例2——URL編碼//performinginputvalidationStringcleanUserName=ESAPI.validator().getValidInput("userName",request.getParameter("userName"),"userNameRegex",50,false,errorList);//checktheerrorListhere//performingoutputencodingfortheurlcontextStringsafeOutput="/admin/findUser.do?name="+ESAPI.encoder().encodeForURL(cleanUserName);注入漏洞(InjectionFlaws)定義簡(jiǎn)單來(lái)說(shuō),注入往往是應(yīng)用程序缺少對(duì)輸入進(jìn)行安全性檢查所引起的,攻擊者把一些包含指令的數(shù)據(jù)發(fā)送給解釋器,解釋器會(huì)把收到的數(shù)據(jù)轉(zhuǎn)換成指令執(zhí)行,注入漏洞十分普遍,通常能在SQL查詢、LDAP查詢、Xpath查詢、OS命令、程序參數(shù)等中出現(xiàn)。危害注入能導(dǎo)致數(shù)據(jù)丟失或數(shù)據(jù)破壞、缺乏可審計(jì)性或是拒絕服務(wù)。注入漏洞有時(shí)甚至能導(dǎo)致完全接管主機(jī)。種類(lèi)SQL注入、XPATH注入、LDAP注入、OS命令注入等。解決之道SQL注入實(shí)例StringsqlString="SELECT*FROMusersWHEREfullname='"+form.getFullName()+"'ANDpassword='"+form.getPassword()+"'";正常:username=tony,password=123456SELECT*FROMusersWHEREusername=tony'ANDpassword='123456'攻擊:username=tony,password='OR'1'='1SELECT*FROMusersWHEREusername=tony'ANDpassword=''OR'1'='1'參數(shù)化查詢預(yù)處理使用PreparedStatement()綁定變量下面的代碼示例使用一個(gè)PreparedStatement,Java的一個(gè)參數(shù)化查詢的執(zhí)行情況,執(zhí)行相同的數(shù)據(jù)庫(kù)查詢。Stringcustname=request.getParameter("customerName");//ThisshouldREALLYbevalidatedtoo//performinputvalidationtodetectattacksStringquery="SELECTaccount_balanceFROMuser_dataWHEREuser_name=

?";PreparedStatementpstmt=connection.prepareStatement(query);pstmt.setString(1,custname);ResultSetresults=pstmt.executeQuery();使用存儲(chǔ)過(guò)程Stringcustname=request.getParameter("customerName");//ThisshouldREALLYbevalidatedtry{

CallableStatementcs=connection.prepareCall("{callsp_getAccountBalance(?)}");

cs.setString(1,custname);

ResultSetresults=cs.executeQuery();//…resultsethandling}catch(SQLExceptionse){//…logginganderrorhandling}使用ESAPI//ESAPIversionofqueryCodecORACLE_CODEC=newOracleCodec();//we'reusingoracleStringquery="SELECTnameFROMusersWHEREid="+ESAPI.encoder().encodeForSQL(ORACLE_CODEC,validatedUserId)+"ANDdate_created>='"+ESAPI.encoder().encodeForSQL(ORACLE_CODEC,validatedStartDate)+"'";myStmt=conn.createStatement(query);...//executestatementandgetresults惡意文件執(zhí)行定義惡意文件執(zhí)行是一種能夠威脅任何網(wǎng)站形式的漏洞,只要攻擊者在具有引入(include)功能程式的參數(shù)中修改參數(shù)內(nèi)容,WEB服務(wù)器便會(huì)引入惡意程序內(nèi)容從而受到惡意文件執(zhí)行漏洞攻擊。危害攻擊者可利用惡意文件執(zhí)行漏洞進(jìn)行攻擊取得WEB服務(wù)器控制權(quán),進(jìn)行不法利益或獲取經(jīng)濟(jì)利益。解決之道實(shí)例1驗(yàn)證輸入,使用ESAPI驗(yàn)證上傳文件名if(!ESAPI.validator().isValidFileName("upload",filename,allowedExtensions,false)){thrownewValidationUploadException("Uploadonlysimplefilenameswiththefollowingextensions"+allowedExtensions,"UploadfailedisValidFileNamecheck");}實(shí)例2使用ESAPI檢查上傳文件大小

ServletFileUploadupload=newServletFileUpload(factory);upload.setSizeMax(maxBytes);不安全的直接對(duì)象引用定義所謂“不安全的對(duì)象直接引用”,即Insecuredirectobjectreferences,意指一個(gè)已經(jīng)授權(quán)的用戶,通過(guò)更改訪問(wèn)時(shí)的一個(gè)參數(shù),從而訪問(wèn)到了原本其并沒(méi)有得到授權(quán)的對(duì)象。Web應(yīng)用往往在生成Web頁(yè)面時(shí)會(huì)用它的真實(shí)名字,且并不會(huì)對(duì)所有的目標(biāo)對(duì)象訪問(wèn)時(shí)來(lái)檢查用戶權(quán)限,所以這就造成了不安全的對(duì)象直接引用的漏洞。我們看如下的一個(gè)示例,也許這樣就更容易理解什么是不安全的對(duì)象直接引用。

攻擊者發(fā)現(xiàn)他自己的參數(shù)是6065,即?acct=6065;他可以直接更改參數(shù)為6066,即?acct=6066;這樣他就可以直接看到6066用戶的賬戶信息了。危害這種漏洞能損害參數(shù)所引用的所有數(shù)據(jù)。除非名字空間很稀疏,否則攻擊者很容易訪問(wèn)該類(lèi)型的所有數(shù)據(jù)。解決之道案例1使用ESAPI的AccessReferenceMap實(shí)現(xiàn)使用非直接的對(duì)象引用MyObjectobj;//generateyourobjectCollectioncoll;//holdsobjectsfordisplayinUI//createESAPIrandomaccessreferencemapAccessReferenceMapmap=newRandomAccessReferenceMap();//getindirectreferenceusingdirectreferenceasseedinputStringindirectReference=map.addDirectReference(obj.getId());//setindirectreferenceforeachobject-requiresyourappobjecttohavethismethodobj.setIndirectReference(indirectReference);//addobjecttodisplaycollectioncoll.add(obj);//storecollectioninrequest/sessionandforwardtoUI...案例2檢查訪問(wèn)。來(lái)自不受信源所使用的所有直接對(duì)象引用都必須包含訪問(wèn)控制檢測(cè),這樣才能確保用戶對(duì)要求的對(duì)象有訪問(wèn)權(quán)限??缯军c(diǎn)請(qǐng)求偽造(CSRF)定義跨站請(qǐng)求偽造,也被稱(chēng)成為“oneclickattack”或者sessionriding,通??s寫(xiě)為CSRF或者XSRF,是一種對(duì)網(wǎng)站的惡意利用。盡管聽(tīng)起來(lái)像跨站腳本(XSS),但它與XSS非常不同,并且攻擊方式幾乎相左。XSS利用站點(diǎn)內(nèi)的信任用戶,而CSRF則通過(guò)偽裝來(lái)自受信任用戶的請(qǐng)求來(lái)利用受信任的網(wǎng)站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對(duì)其進(jìn)行防范的資源也相當(dāng)稀少)和難以防范,所以被認(rèn)為比XSS更具危險(xiǎn)性。危害攻擊者能讓受害用戶修改可以修改的任何數(shù)據(jù),或者是執(zhí)行允許使用的任何功能。解決之道第一步,新建CSRF令牌添加進(jìn)用戶每次登陸以及存儲(chǔ)在httpsession里,這種令牌至少對(duì)每個(gè)用戶會(huì)話來(lái)說(shuō)應(yīng)該是唯一的,或者是對(duì)每個(gè)請(qǐng)求是唯一的。//thiscodeisintheDefaultUserimplementationofESAPI/**Thisuser'sCSRFtoken.*/privateStringcsrfToken=resetCSRFToken();...publicStringresetCSRFToken(){csrfToken=ESAPI.randomizer().getRandomString(8,DefaultEncoder.CHAR_ALPHANUMERICS);returncsrfToken;}第二步,令牌同樣可以包含在URL中或作為一個(gè)URL參數(shù)標(biāo)記/隱藏字段。//fromHTTPUtilitilesinterfacefinalstaticStringCSRF_TOKEN_NAME="ctoken";//thiscodeisfromtheDefaultHTTPUtilitiesimplementationinESAPIpublicStringaddCSRFToken(Stringhref){Useruser=ESAPI.authenticator().getCurrentUser();if(user.isAnonymous()){returnhref;}//iftherearealreadyparametersappendwith&,otherwiseappendwith?Stringtoken=CSRF_TOKEN_NAME+"="+user.getCSRFToken();returnhref.indexOf('?')!=-1?href+"&"+token:href+"?"+token;}...publicStringgetCSRFToken(){Useruser=ESAPI.authenticator().getCurrentUser();if(user==null)returnnull;returnuser.getCSRFToken();}第三步,在服務(wù)器端檢查提交令牌與用戶會(huì)話對(duì)象令牌是否匹配。//thiscodeisfromtheDefaultHTTPUtilitiesimplementationinESAPIpublicvoidverifyCSRFToken(HttpServletRequestrequest)throwsIntrusionException{Useruser=ESAPI.authenticator().getCurrentUser();//checkifuserauthenticatedwiththisrequest-noCSRFprotectionrequiredif(request.getAttribute(user.getCSRFToken())!=null){return;}Stringtoken=request.getParameter(CSRF_TOKEN_NAME);if(!user.getCSRFToken().equals(token)){thrownewIntrusionException("Authenticationfailed","PossiblyforgedHTTPrequestwithoutproperCSRFtokendetected");}}第四步,在注銷(xiāo)和會(huì)話超時(shí),刪除用戶對(duì)象會(huì)話和會(huì)話銷(xiāo)毀。//thiscodeisintheDefaultUserimplementationofESAPIpublicvoidlogout(){ESAPI.httpUtilities().killCookie(ESAPI.currentRequest(),ESAPI.currentResponse(),HTTPUtilities.REMEMBER_TOKEN_COOKIE_NAME);HttpSessionsession=ESAPI.currentRequest().getSession(false);if(session!=null){removeSession(session);session.invalidate();}ESAPI.httpUtilities().killCookie(ESAPI.currentRequest(),ESAPI.currentResponse(),“JSESSIONID”);loggedIn=false;(Logger.SECURITY_SUCCESS,“Logoutsuccessful”);ESAPI.authenticator().setCurrentUser(User.ANONYMOUS);}信息泄露和錯(cuò)誤處理不當(dāng)定義應(yīng)用程序常常產(chǎn)生錯(cuò)誤信息并顯示給使用者。很多時(shí)候,這些錯(cuò)誤信息是非常有用的攻擊,因?yàn)樗鼈兘沂緦?shí)施細(xì)則或有用的開(kāi)發(fā)信息利用的漏洞。危害泄露太多的細(xì)節(jié)(如錯(cuò)誤堆棧跟蹤信息、SQL語(yǔ)句等等);登錄失敗后,通知用戶是否用戶ID或密碼出錯(cuò)——登錄失敗可能是由于ID或密碼錯(cuò)誤造成的。這為一個(gè)對(duì)關(guān)鍵資產(chǎn)發(fā)動(dòng)蠻力攻擊的攻擊者提供重要信息。解決之道案例1通過(guò)web.xml配置文件實(shí)現(xiàn)<error><exception-type>java.lang.Throwable</exception-type><location>/error.jsp</location></error>案例2針對(duì)登錄嘗試的攻擊,可以使用相同的報(bào)錯(cuò)信息,比如都是提示“輸入的用戶名或者密碼錯(cuò)誤!”。殘缺的認(rèn)證和會(huì)話管理定義與認(rèn)證和會(huì)話管理相關(guān)的應(yīng)用程序功能往往得不到正確實(shí)施,這就導(dǎo)致攻擊者破壞密碼、密匙、會(huì)話令牌或利用實(shí)施漏洞冒充其他用戶身份。危害這些漏洞可能導(dǎo)致部分甚至全部帳戶遭受攻擊。一旦攻擊成功,攻擊者能執(zhí)行合法用戶的任何操作。因此特權(quán)帳戶會(huì)造成更大的破壞。解決之道使用內(nèi)置的會(huì)話管理功能。通過(guò)認(rèn)證的問(wèn)候:使用單一的入口點(diǎn)。確保在一開(kāi)始登錄SSL保護(hù)的網(wǎng)頁(yè)。獲取注銷(xiāo)的權(quán)利;添加超時(shí);確保你使用的是安全相關(guān)的功能;使用強(qiáng)大的認(rèn)證;不進(jìn)行默認(rèn)身份驗(yàn)證

//BAD-DON'TUSE

publicbooleanlogin(Stringusername,Stringpassword){booleanisAuthenticated=true;try{//makecallstobackendtoactuallyperformloginagainstdatastoreif(!authenticationSuccess){isAuthenticated=false;}}catch(Exceptione){//handleexc}returnisAuthenticated;}不安全的加密儲(chǔ)存定義保護(hù)與加密敏感數(shù)據(jù)已經(jīng)成為網(wǎng)絡(luò)應(yīng)用的最重要的組成部分。簡(jiǎn)單不加密的敏感數(shù)據(jù)是非常普遍。不加密的應(yīng)用程序設(shè)計(jì)不當(dāng)往往含有密碼,或者使用不恰當(dāng)?shù)拿艽a或密碼作出強(qiáng)烈的嚴(yán)重錯(cuò)誤使用。這些缺陷可以導(dǎo)致違反披露敏感數(shù)據(jù)的遵守。危害攻擊者能夠取得或是篡改機(jī)密的或是私有的信息;攻擊者通過(guò)這些秘密的竊取從而進(jìn)行進(jìn)一步的攻擊;造成企業(yè)形象破損,用戶滿意度下降,甚至?xí)蟹稍V訟等。解決之道驗(yàn)證你的結(jié)構(gòu)識(shí)別所有的敏感數(shù)據(jù);識(shí)別這些數(shù)據(jù)存放的所有位置;確保所應(yīng)用的威脅模型能夠應(yīng)付這些攻擊;使用加密手段來(lái)應(yīng)對(duì)威脅使用一定的機(jī)制來(lái)進(jìn)行保護(hù)文件加密;數(shù)據(jù)庫(kù)加密;數(shù)據(jù)元素加密。正確的使用這些機(jī)制使用標(biāo)準(zhǔn)的強(qiáng)算法;合理的生成,分發(fā)和保護(hù)密鑰;準(zhǔn)備密鑰的變更。驗(yàn)證實(shí)現(xiàn)方法確保使用了標(biāo)準(zhǔn)的強(qiáng)算法;確保所有的證書(shū)、密鑰和密碼都得到了安全的存放;有一個(gè)安全的密鑰分發(fā)和應(yīng)急處理的方案;不安全的通信定義對(duì)于不加密的應(yīng)用程序的網(wǎng)絡(luò)信息傳輸,需要保護(hù)敏感的通信。加密(通常SSL)的,必須用于所有身份驗(yàn)證的連接,特別是通過(guò)Internet訪問(wèn)的網(wǎng)頁(yè),以及后端的連接。否則,應(yīng)用程序?qū)⒈┞渡矸蒡?yàn)證或會(huì)話令牌。危害攻擊者能夠取得或是篡改機(jī)密的或是私有的信息;攻擊者通過(guò)這些秘密的竊取從而進(jìn)行進(jìn)一步的攻擊;造成企業(yè)形象破損,用戶滿意度下降,甚至?xí)蟹稍V訟等。解決之道提供合理的保護(hù)機(jī)制對(duì)于敏感數(shù)據(jù)的傳輸,對(duì)所有連接都要使用TLS;在傳輸前對(duì)單個(gè)數(shù)據(jù)都要進(jìn)行加密;(如XML-Encryption)在傳輸前對(duì)信息進(jìn)行簽名;(如XML-Signature)正確的使用這些機(jī)制使用標(biāo)準(zhǔn)的強(qiáng)算法;合理管理密鑰和證書(shū);在使用前驗(yàn)證SSL證書(shū)限制URL訪問(wèn)失效定義這個(gè)漏洞事實(shí)上也是與認(rèn)證相關(guān)的,與我們前面提到的Top4不安全的直接對(duì)象引用也是類(lèi)似的,不同在于這個(gè)漏洞是說(shuō)系統(tǒng)已經(jīng)對(duì)URL的訪問(wèn)做了限制,但這種限制卻實(shí)際并沒(méi)有生效。常見(jiàn)的錯(cuò)誤是,我們?cè)谟脩粽J(rèn)證后只顯示給用戶認(rèn)證過(guò)的頁(yè)面和菜單選項(xiàng),而實(shí)際上這些僅僅是表示層的訪問(wèn)控制而不能真正生效,攻擊者能夠很容易的就偽造請(qǐng)求直接訪問(wèn)未被授權(quán)的頁(yè)面。我們舉個(gè)例子來(lái)說(shuō)明這個(gè)過(guò)程:1、攻擊者發(fā)現(xiàn)他自己的訪問(wèn)地址為/user/getAccounts;2、他修改他的目錄為/admin/getAccounts或/manager/getAccounts;3.

這樣攻擊者就能夠查看到更多的賬戶信息了。解決之道對(duì)每個(gè)URL,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論