安全攻擊及防范手冊._第1頁
安全攻擊及防范手冊._第2頁
安全攻擊及防范手冊._第3頁
安全攻擊及防范手冊._第4頁
安全攻擊及防范手冊._第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、安全攻擊及防范手冊 版本1.0 2010年8月 1 概述 1.1 簡介 當今世界, Internet (因特網(wǎng) )已經(jīng)成為一個非常重要的基礎(chǔ)平 臺,很多企業(yè)都將應(yīng)用架設(shè)在該平臺上,為客戶提供更為方便、 快捷的服務(wù)支持。這些應(yīng)用在功能和性能上,都在不斷的完善和 提高,然而在非常重要的安全性上,卻沒有得到足夠的重視。隨 著 WEB 技術(shù)應(yīng)用的范圍越來越廣泛, WEB 技術(shù)相關(guān)的安全漏洞越來 越多的被挖掘出來,而針對 WEB 站點的攻擊已經(jīng)成為了最流行的攻 擊途徑。 不久前項目管理部對公司內(nèi)外重點系統(tǒng)進行了一次安全隱患分 析測試,并總結(jié)出了公司安全測試問題分類及描述的報告文檔。 本文針對此報告中提到

2、的一些重大安全隱患問題逐一分析, 并給出相 應(yīng)的解決方案。 1.2 參考 資料 Java安全性編程實例 網(wǎng)站系統(tǒng)安全開發(fā)手冊 企業(yè)級Java安全性(構(gòu)建安全的J2EE應(yīng)用) 2 WEB 安全隱患及預(yù)防措 施 2.1 會話標識未更 新 2.1.1 描述 登陸過程前后會話標識的比較, 顯示它們并未更新, 這表示有可 能偽裝用戶。 初步得知會話標識值后, 遠程攻擊者有可能得以充當已 登錄的合法用戶。 2.1.2 安全級別 高。 2.1.3 安全風(fēng)險 可能會竊取或操縱客戶會話和cookie,它們可能用于模仿合法用 戶,從而使黑客能夠以該用戶身份查看或變更用戶記錄以及執(zhí)行事 務(wù)。 2.1.4 解決方案

3、不要接受外部創(chuàng)建的會話標識。 始終生成新的會話,供用戶成功認證時登錄。 防止用戶操縱會話標識。 請勿接受用戶瀏覽器登錄時所提供的會話標識。 如果有驗證碼的。驗證碼改用 application 存儲。同時記得釋放資 源 2.1.5 技術(shù)實現(xiàn) 登陸界面和登陸成功的界面一致時 修改后臺邏輯,在驗證登陸邏輯的時候,先強制讓當前 session 過期,然后用新的session存儲信息。 登陸界面和登陸成功的界面不一致時 在登陸界面后增加下面一段代碼,強制讓系統(tǒng)session過期。 request.getSession().invalidate()清空 session Cookie cookie = re

4、quest.getCookies()0;獲取 cookie cookie.setMaxAge(O);/讓 cookie過期 注意: 框架 2.0 已經(jīng)修改了登陸驗證類,登陸成功后會清理掉當前 session重新創(chuàng)建一個新的 session凡是使用框架2.0的項目均 可統(tǒng)一增加此功能。 2.2 不充分帳戶封 鎖 2.2.1 描述 程序沒有使用鎖定功能,可以窮舉密碼,可以造成蠻力攻擊,惡 意用戶發(fā)送大量可能的密碼和 /或用戶名以訪問應(yīng)用程序的嘗試。 由 于該技術(shù)包含大量登錄嘗試, 未限制允許的錯誤登錄請求次數(shù)的應(yīng)用 程序很容易遭到這類攻擊。 2.2.2 安全級別 2.2.3 安全風(fēng)險 可能會升級用

5、戶特權(quán)并通過 Web 應(yīng)用程序獲取管理許可權(quán)。 2.2.4 解決方案 請確定允許的登錄嘗試次數(shù)(通常是 3-5 次),確保超出允許的 嘗試次數(shù)之后,便鎖定帳戶。 為了避免真正的用戶因帳戶被鎖定而 致電支持人員的麻煩, 可以僅臨時性暫掛帳戶活動, 并在特定時間段 之后啟用帳戶。 帳戶鎖定大約 10 分鐘,通常用這樣的方法阻止蠻力 攻擊。 2.2.5技術(shù)實現(xiàn) 提供鎖定信息配臵類,可根據(jù)項目特定需求修改此配臵信息 baain id 是否需要時戶鎖定功能 t rue 帳P鎖定時間毋鐘) 2 ,亠亠 帳戶鎖定后的跳轉(zhuǎn)頁面 (property nauiBloginCount煙毎璉殊失敗寥少次咪戶鎖疋 3

6、/ c Jimon/1 ck Ac count. j sp /bean 修改登陸驗證邏輯,根據(jù)上面的配臵信息提供帳戶鎖定功能。 注意: 框架2.0已經(jīng)實現(xiàn)了此功能,凡是使用框架2.0的項目均可 統(tǒng)一增加此功能。 2.3 可預(yù)測的登錄 憑證 2.3.1 描述 發(fā)現(xiàn)應(yīng)用程序會使用可預(yù)期的認證憑證(例如: admin+admin、 guest+gues)t 。 攻擊者很容易預(yù)測用戶名和密碼,登錄應(yīng)用程序,從 而獲取未獲授權(quán)的特權(quán)。 2.3.2 安全級別 高。 2.3.3 安全風(fēng)險 可能會升級用戶特權(quán)并通過 Web 應(yīng)用程序獲取管理許可權(quán)。 2.3.4 解決方案 不應(yīng)使用易于預(yù)測的憑證(例如: adm

7、in+admin、 guest+gues、t test+test 等),因為它們可能很容易預(yù)測,可讓用戶不當進入應(yīng)用程 序。 2.3.5 技術(shù)實現(xiàn) 只要養(yǎng)成良好的習(xí)慣, 堅決不使用容易預(yù)測的名和密碼, 即可徹 底杜絕此類問題 2.4 登錄錯誤消息憑證枚舉 2.4. 1描述 當試圖利用不正確的憑證來登錄時,當用戶輸入無效的用戶名和 無效的密碼時,應(yīng)用程序會分別生成不同的錯誤消息。通過利用該 行為,攻擊者可以通過反復(fù)試驗(蠻力攻擊技術(shù))來發(fā)現(xiàn)應(yīng)用程序的 有效用戶名,再繼續(xù)嘗試發(fā)現(xiàn)相關(guān)聯(lián)的密碼。 2.4.2安全級別 2.4.3安全風(fēng)險 可能會升級用戶特權(quán)并通過 Web應(yīng)用程序獲取管理許可權(quán)。 2.

8、4. 4解決方案 不論名和密碼哪個錯誤,都提示同樣的消息。且同時加上登陸失 敗次數(shù)達到規(guī)定的帳戶鎖定功能。 2.4.5技術(shù)實現(xiàn) 不論名和密碼哪個錯誤,都提示如下所示同樣的消息: 一旦某個帳戶連續(xù)登陸失敗次數(shù)達到了規(guī)定的數(shù)值, 就會按配臵 的時間被鎖定,如下提示: 瞰尸鎖定中1諳稍后再詞甲 j確定 如此一來,攻擊者就沒機會窮舉帳戶和密碼了, 此類攻擊也就不 可能發(fā)生了! 注意: 框架2.0已經(jīng)實現(xiàn)了此功能,凡是使用框架2.0的項目均可 統(tǒng)一增加此功能。 2.5已解密的登錄請求 2. 5. 1描述 通過HTTP POST發(fā)送表單數(shù)據(jù),這些數(shù)據(jù)將在HTTP報文中以 明文的形式傳輸。對于一些敏感的數(shù)據(jù)

9、(如用戶名 /密碼、信用卡密 碼)以傳統(tǒng)的HTTP報文傳輸存在巨大的風(fēng)險。 2. 5.2安全級別 2.5.3 安全風(fēng)險 可能會竊取諸如用戶名和密碼等未經(jīng)加密即發(fā)送了的用戶登錄 信息。 2.5.4 解決方案 (1) 饒過AppScan軟件掃描 ( 2) 對提交的敏感信息,一律以加密方式傳給服務(wù)器。 (3) 采用基于SSL的HTTPS傳輸協(xié)議,對提交的敏感信息在傳輸過 程中加密。 敏感信息包括:用戶名、密碼、社會保險號碼、信用卡號碼、駕 照號碼、電子郵件地址、電話號碼、郵政編碼等。 注意:如果不是基于SSL的HTTPS傳輸協(xié)議的話。對于提交的 敏感信息即使加密后,AppScan軟件同樣認為該漏洞存

10、在。所以避免 這一漏洞的有效方案是饒過掃描或者采用基于 SSL的HTTPS傳輸協(xié) 議。 雖然采取 HTTPS 傳輸數(shù)據(jù)有很高的安全性,但是也有以下幾個 顯著的缺點: 需要申請一個合法組織頒發(fā)的用來加 / 解密的證書。 部署、配臵繁瑣。 同樣的硬件環(huán)境,效率比 HTTP 慢很多。 通過上述分析,采取基于SSL的HTTPS傳輸協(xié)議, 付出的代價有點大,是否有必要這樣做,值得深入討 論。 :把text=password這個用其他的代替,就可以解決 已解密的登錄請求 密 碼: js 代碼 function hiddenPass(e) e = e ? e : window.event; var kcod

11、e = e.which ? e.which : e.keyCode; var pass = document.getE|ementById(password1); varj_pass= document.getE|ementById(password); if(kcode!=8) var keychar=String.fromCharCode(kcode); j_pass.va|ue=j_pass.va|ue+keychar; j_pass.value=j_pass.value.substring(0,pass.length); 2.5.5 技術(shù)實現(xiàn) (1) 饒過AppScan軟件掃描 繞過軟

12、件掃描有兩種方式,如下: 修改密碼輸入框名字和類型 經(jīng)過不斷掃描測試分析,如果密碼輸入框的名字不包含 password、pwd 等關(guān)鍵字的話,大部分頁面就不會掃描出漏洞。如果 還能掃描出漏洞的話, 那就在修改密碼輸入框名字的基礎(chǔ)上, 把輸入 框的type的屬性值為password的值改為text,然后用Javascript函數(shù) 來模擬實現(xiàn)星號代替輸入值的密碼輸入效果即可饒過該掃描。 示例步驟如下: 在原來的密碼輸入框前添加一個新的輸入控件: 如: 注:其中 document.getElementById(cipher).focus() 中 cipher 為原來密碼輸入框的 ID 值, 這個是為

13、了 Tab鍵能起作用而設(shè)置的。 修改原來密碼框的type屬性為text,并添加onkeyup函數(shù) 如下: 其中的 code 為新添加的輸入控件 ID 。 在頁面的head標簽中間添加如下樣式: 宋體; 其中code代表新添加的輸入控件ID , cipher代表原來密碼輸入框 的ID。樣式表的ID必須和控件的ID 一致。 采用AJAX登錄 把登陸界面的Form標簽去掉,采用AJAX登錄。示例代碼如下: vhtml xmlns=/1999/xhtml vmeta http-equiv=Content-Type content=text/html; charset=u

14、tf-8 / 登陸頁面 vstyle type=text/css 用戶: 密碼: 記住密碼 v/tr v/tr vscript language=javascript type=text/javascript var request = false; try request = new XMLHttpRequest(); catch (trymicrosoft) try request = new ActiveX0bject(Msxml2.XMLHTTP); catch (othermicrosoft) try request = new ActiveXObject(Microsoft.XML

15、HTTP); catch (failed) request = false; function getCustomerInfo() varurl= j_acegi_security_check?j_username=+document.getElementByld(j_username).value+ alert(url+url); request.open(GET, url, true); /調(diào)用回調(diào)函數(shù) request.onreadystatechange = updatePage; request.send(null); function updatePage() if (request

16、.readyState = 4) if (request.status = 200) var response = request.responseText; document.write(response); else if (request.status = 404) alert(Requested URL is not found.); else if (request.status = 403) alert(Access denied.); else alert(status is + request.status); v/script v/body (2) 采用基于SSL的HTTPS

17、傳輸協(xié)議 以Weblogic默認配臵為例,步驟如下: 啟動Weblog ic,進入Con soles展開Servers單擊服務(wù)器名, 在右邊的配臵欄中,選擇常規(guī)。在出現(xiàn)的內(nèi)容中選中已啟用 SSL監(jiān)視端口,并配臵監(jiān)視端口,如下圖: 也 0 已啟fl) SSL 牯定是否可哄通11默認WSL監(jiān)聽瑞仿問胡段務(wù)器如黒旳岀Log嗆險昭域的管理瑞口己啟用,則常里涵蚩通過此管理瑞口作嶄、而應(yīng)甲哇帶訴 量適辻監(jiān)聽端和SSL監(jiān)聽端口怙常。如呆已禁用它理JffiQ.則所有流盂都適過遞聽端口利酣L監(jiān)聽端口伶軾= 逸島L益新峯口: 7002- 此殆爵=5曲聽SSL刪法求的TCP/IP 口* 重新啟動Weblogic測試

18、HTTPS協(xié)議,測試地址格式示例: https:/IP:端口/ApplicationName 2.6 SQL注入 2.6. 1描述 隨著B/S模式應(yīng)用開發(fā)的發(fā)展,使得使用這種模式編寫應(yīng)用程序 的程序員也越來越多。但是由于這個行業(yè)的入門門檻不高,程序員的 水平及經(jīng)驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒 有對用戶輸入數(shù)據(jù)的合法性進行判斷,使應(yīng)用程序存在安全隱患。攻 擊者可以通過互聯(lián)網(wǎng)的輸入?yún)^(qū)域,利用某些特殊構(gòu)造的 SQL語句插 入 SQL 的特殊字符和指令,提交一段數(shù)據(jù)庫查詢代碼(一般是在瀏 覽器地址欄進行,通過正常的 www 端口訪問),操縱執(zhí)行后端的 DBMS 查詢并獲得本不為用

19、戶所知數(shù)據(jù)的技術(shù),也就是 SQL Injection( SQL 注入)。 2.6.2 安全級別 高。 2.6.3 安全風(fēng)險 可能會查看、修改或刪除數(shù)據(jù)庫條目和表。 2.6.4 解決方案 過濾掉用戶輸入中的危險字符。 檢查用戶輸入的字段類型,確保用戶輸入的值和類型(如 Integer、 Date 等)有效,且符合應(yīng)用程序預(yù)期。 屏蔽一些詳細的錯誤消息,因為黑客們可以利用這些消息。 使用專業(yè)的漏洞掃描工具。 企業(yè)要在 Web 應(yīng)用程序開發(fā)過程的所有階段實施代碼的安全 檢查。首先,要在部署 Web 應(yīng)用之前實施安全測試,這種措 施的意義比以前更大、更深遠。企業(yè)還應(yīng)當在部署之后用漏 洞掃描工具和站點監(jiān)

20、視工具對網(wǎng)站進行測試 2.6.5技術(shù)實現(xiàn) (1) 米用過濾器技術(shù)。 過濾技術(shù)是通過特定過濾函數(shù),去查找每個請求的每個參數(shù) 對應(yīng)的值,如果出現(xiàn)了不允許的字符,就會彈出如下提示: 點確定后即可回到請求頁面,刪除敏感字符即可請求成功! 過濾器ParameterFilter.Jav代碼如下: /* *參數(shù)過濾類,過濾普通表單 */ public class ParameterFilter impleme nts Filter private Pattern scriptPattern; private Pattern sqlPattern; private Pattern letterPattern;

21、 private String notProtect =; private String totalLetter =; public void destroy。 public void doFilter(ServletRequest request, ServletResp onse resp on se, FilterChain filtreChain) throws IOException, ServletException HttpServletRequest req = (HttpServletRequest) request; String conten tType = reques

22、t.getC onten tType() = n ull ? : request .getC onten tType(); if (!c onten tType.startsWith(multipart/form-data) boolea n isSecurity = true; while (n ull != params Strin g para_value = n ull; para_value = (String) req.getParameterValues(para_name); for (int i = 0; i para_value.length; i+) String _pa

23、ra_value = para_valuei.toLowerCase(); if (scriptPattern.matcher(_para_value).matches() | sqlPattern.matcher(_para_value).matches() isSecurity = false; break; if (!isSecurity) break; if (!isSecurity) response.setContentType(text/html; charset=GBK); response.getWriter().write(alert(輸入有誤,請不 要包含 +totalL

24、etter+ 中的任何敏感字符 !);history.go(-1);); return; filtreChain.doFilter(request, response); public void init(FilterConfig filterConfig) throws ServletException letterPattern = Ppile(a-z*); String scriptPara = filterConfig.getInitParameter(scriptRegx).toLowerCase(); String sqlPara = filterConfig.getInitPar

25、ameter(sqlRegx).toLowerCase(); notProtect = filterConfig.getInitParameter(notProtect); scriptPattern = Ppile(resultStr(scriptPara); sqlPattern = Ppile(resultStr(sqlPara); totalLetter = scriptPara+|+sqlPara; int index = totalLetter.indexOf(); if(index 0) totalLetter = totalLetter.substring(0, index)+

26、totalLetter.substring(index+1); public String resultStr(String oldStr) String newStr = ; if (oldStr != null if (temp.length 0) for (int i = 0; i temp.length; i+) String tempStr = ; boolean isLetter = false; for (int j = 0; j tempi.length(); j+) String str = tempi.substring(j, j + 1); if (letterPatte

27、rn.matcher(str).matches() tempStr = tempStr+ (%+ parseAscii(str.toUpperCase() + )| + (%+ parseAscii(str)+ )|( + str + ); isLetter = true; else if(str.equals( )| str.equals() str = +str; tempStr = tempStr + (%+ parseAscii(str) + )|( + str+ ); isLetter = false; if(isLetter) if (newStr.equals() newStr

28、= newStr + .*(s+)( + tempStr + )(s+).*; else newStr = newStr + |.*(s+)( + tempStr + )(s+).*; else if (newStr.equals() newStr = newStr + .*( + tempStr + ).*; else newStr = newStr + |.*( + tempStr + ).*; return newStr; private String toHexUtil(int n) String rt=; switch(n) case 10:rt+=A;break; case 11:

29、rt+=B;break; case 12:rt+=C;break; case 13:rt+=D;break; case 14:rt+=E;break; case 15:rt+=F;break; default: rt+=n; return rt; public String toHex(int n) StringBuffer sb=new StringBuffer(); if(n/16=0) return toHexUtil(n); else String t=toHex(n/16); int nn=n%16; sb.append(t).append(toHexUtil(nn); return

30、 sb.toString(); public String parseAscii(String str) StringBuffer sb=new StringBuffer(); byte bs=str.getBytes(); for(int i=0;ibs.length;i+) sb.append(toHex(bsi); return sb.toString(); 輔助類如下: public class FilterUtils public static String getFullUrlFromRequest(HttpServletRequest httRequest) String url

31、 = httRequest.getRequestURI(); String queryString = httRequest.getQueryString(); if (null != queryString return url; public static boolean isContainUrl(String urlList, String url) boolean isExclude = false; if (null != urlList if (null != resources) for (int i = 0; i = 0) isExclude = true; break; re

32、turn isExclude; web.xml配臵片段如下: SecurityFilter ponent.usrmgr.security.filter.ParameterFilter scriptRegx !CDATA |=|and sqlRegx notProtect login.html,.upload SecurityFilter *.jsp 2)每個請求都采取特定的數(shù)據(jù)驗證函數(shù),驗證數(shù)據(jù)的類型和 長度,只允許特定的特殊字符輸入 、/ I 。宀 注意: 有些聰明的攻擊者在攻擊的時候會把一些敏感字符轉(zhuǎn)化成 URL 編碼(即字符的 ASCII 的 16 進制)來饒過檢查。所以, 我們在過濾字

33、符的時候也要對敏感字符的 URL 編碼進行過 濾,如( 對應(yīng)的 URL 編碼是 %3C) 已經(jīng)完成的且正在運行的系統(tǒng), 建議采用過濾器技術(shù), 因為過 濾器技術(shù)侵入性小、代碼量小、部署方便 對于未完成的且正在開發(fā)的系統(tǒng), 建議采用第二個方案。 因為 過濾器技術(shù)雖然能確保數(shù)據(jù)的正確性,但同時也存在著過濾 不嚴或過濾太嚴的問題。不能滿足某些特殊的業(yè)務(wù)需求。 2.7 跨站點腳本攻 擊 2.7.1 描述 XSS又叫CSS (Cross Site Script,跨站腳本攻擊。它指的是惡意 攻擊者往Web頁面里插入惡意html代碼,當用戶瀏覽該頁之時,嵌 入其中Web里面的html代碼會被執(zhí)行,從而達到惡意

34、用戶的特殊目 的。 2.7.2 安全級別 高。 2.7.3 安全風(fēng)險 可能會竊取或操縱客戶會話和cookie,它們可能用于模仿合法用 戶,從而使黑客能夠以該用戶身份查看或變更用戶記錄以及執(zhí)行事 務(wù)。 2.7.4 解決方案 在你的WEB瀏覽器上禁用javascript腳本 開發(fā)者要仔細審核代碼,對提交輸入數(shù)據(jù)進行有效檢查 2.7.5技術(shù)實現(xiàn) 參見2.6.5技術(shù)實現(xiàn)中的過濾器技術(shù)。 2.8跨站點請求偽造 2. 8. 1描述 CSRF (Cross-site request forge) 中文名稱:跨站請求偽造,也 被稱為:one click attack/session riding 縮寫為:CS

35、RF/XSRF。你這可 以這么理解CSRF攻擊:攻擊者盜用了你的身份,以你的名義發(fā)送惡 意請求。CSRF能夠做的事情包括:以你名義發(fā)送郵件,發(fā)消息,盜 取你的賬號,甚至于購買商品,虛擬貨幣轉(zhuǎn)賬.造成的問題包括: 個人隱私泄露以及財產(chǎn)安全。 2.8.2 安全級別 中。 2.8.3 安全風(fēng)險 可能會竊取或操縱客戶會話和cookie,它們可能用于模仿合法用 戶,從而使黑客能夠以該用戶身份查看或變更用戶記錄以及執(zhí)行事 務(wù)。 2.8.4 解決方案 只允許 GET 請求檢索數(shù)據(jù),但是不允許它修改服務(wù)器上的任 何數(shù)據(jù)。這個修改可以防止利用 img 標簽或者其它的類型的 GET請求的CSRF攻擊。 要求所有P

36、OST請求都包含一個隨機值。 腳本利用: alert(document.cookie) 2.8.5 技術(shù)實現(xiàn) (1)對于有跨站點請求偽造漏洞的頁面,添加一個能在session 中獲取token的隱藏字段。 (2)對于Post請求的頁面,都需要添加一個固定名字的隱 藏域,值為去服務(wù)器獲取的隨機值。格式如下: input name=CSRF_TOKEN type=hidden id=CSRF_TOKEN value=/ (3)對于Get請求的頁面,Url后需要添加一個固定名字的 參數(shù),值為去服務(wù)器獲取的隨機值。格式如下: window.location=loginProcess.jsp?CSRF_

37、TOKEN= (4) 添加CSRF過濾器,該過濾器攔截符合過濾規(guī)則的請求, 取得表單的 token 值,和服務(wù)上存儲的值比較,如果一樣,就放行, 如果不一樣,就自動跳轉(zhuǎn)錯誤提示頁面。 過濾器代碼 public class CsrfFilter implements Filter private String notProtect; / 不受保護的資源集合 private String tokenTimeout; / token 過期時間 public void init(FilterConfig filterConfig) throws ServletException notProtect

38、= filterConfig.getInitParameter(notProtect); tokenTimeout = filterConfig.getInitParameter(TokenTimeOut); if (null = tokenTimeout) tokenTimeout = 10; public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException HttpServletRequest

39、 req = (HttpServletRequest) request; HttpSession session = req.getSession(true); if (!FilterUtils.isContainUrl(notProtect, FilterUtils.getFullUrlFromRequest(req) StringpreviousNonce= req.getParameter(TokenBuilder.CSRF_NONCE_REQUEST_PARAM); Object obj = session.getAttribute(TokenBuilder.CSRF_NONCE_RE

40、QUEST_PARAM) ; String expectedNonce = obj = null ?:(String)obj; if (expectedNonce.equals() expectedNonce = TokenBuilder.generateToken(); session.setAttribute(T okenBuilder.CSRF_NONCE_REQUEST_PARAM, expectedNonce); if (null != previousNonce) if(TokenBuilder.checkT okenTimeout(previousNonce, tokenTime

41、out) ) expectedNonce = TokenBuilder.generateT oken(); session.setAttribute(T okenBuilder.CSRF_NONCE_REQUEST_PARAM, expectedNonce); if(!TokenBuilder.isT okenValid(expectedNonce,previousNonce) response.setContentType(text/html; charset=GBK); response.getWriter().write(alert( 無 效的安全標識符,請重新刷新當前頁面 !);his

42、tory.go(-1);); return; filterChain.doFilter(request, response); public void destroy() FilterUtil 類代碼,參見2.6 sql注入技術(shù)實現(xiàn)中的輔助類代碼。 Toke nBuilder 類代碼 public class TokenBuilder private static Map map = new HashMap(); public static final String CSRF_NONCE_REQUEST_PARAM = CSRF_TOKEN; public synchronized stati

43、c String generateToken() byte random = new byte16; StringBuffer buffer = new StringBuffer(); SecureRandom randomSource = new SecureRandom(); randomSource.nextBytes(random); for (int j = 0; j 4); byte b2 = (byte) (randomj if (b1 10) buffer.append(char) (0 + b1); else buffer.append(char) (A + (b1 - 10

44、); if (b2 = term) isTimeout = true; catch(Exception e) isTimeout = true; while (it.hasNext() String key = (String) it.next(); long tokenTime = Long.valueOf(key.split(:)0).longValue(); long interval = nowTime - tokenTime; if (interval = term) it.remove(); return isTimeout; public synchronized static

45、boolean isT okenValid(String savedToken,String token) boolean isT okenValid = map.containsKey(token); if(savedToken.equals(token) if (isTokenValid) map.remove(token); isTokenValid = true; else if (isTokenValid) map.remove(token); return isTokenValid; wem.xml 配臵 CsrfFilter ponent.usrmgr.security.filt

46、er.CsrfFilter TokenTimeOut 15 CsrfFilter *.jsp 注意:這是目前唯一能解決此漏洞的可行方案,但是有一定的 工作量,且對系統(tǒng)效率也有輕微影響,是否有必要修改,值得商榷。 2.9 發(fā)現(xiàn)數(shù)據(jù)庫錯 誤模式 2.9.1 描述 “ SQL 注入”以外的攻擊所觸發(fā)的“數(shù)據(jù)庫錯誤”,插入的危 險字符滲透了應(yīng)用程序并到達 SQL 查詢本身(即應(yīng)用程序易受到 SQL 注入攻擊)。 2.9.2 安全級別 高。 2.9.3 安全風(fēng)險 可能會查看、修改或刪除數(shù)據(jù)庫條目和表。 2.9.4 解決方案 A 確保用戶輸入的值和類型(如 Integer、 Date 等)有效,且符 合應(yīng)

47、用程序預(yù)期 B. 利用存儲過程,將數(shù)據(jù)訪問抽象化,讓用戶不直接訪問表或 視圖。當使用存儲過程時,請利用 ADO 命令對象來實施它們,以 強化變量類型。 C. 清理輸入以排除上下文更改符號,例如: 1 (單引號) 2 (引號) 3 (反斜線轉(zhuǎn)義單引號) 4 (反斜杠轉(zhuǎn)義引號) 5 )(結(jié)束括號) 6 ;(分號) 2.9.5 技術(shù)實現(xiàn) 參見 2.6.5 技術(shù)實現(xiàn)。 2.10 應(yīng)用 程序錯誤 2.10.1 描述 如果攻擊者通過探測 Web 頁來找尋引起異常的各種情況,則出 現(xiàn)信息泄漏攻擊。對于攻擊者而言,這是一種頗有成效的攻擊方法。 因為異常細節(jié)信息常以 HTML 的形式返回并顯示在瀏覽器中。這可

48、能會泄漏很有用的信息, 如堆棧跟蹤。 堆棧跟蹤包含數(shù)據(jù)庫連接字符 串、數(shù)據(jù)庫名、數(shù)據(jù)庫方案信息、 SQL 語句以及操作系統(tǒng)和平臺版 本。 2.10.2 安全級別 中。 2.10.3 安 全風(fēng)險 攻擊者可從錯誤信息判斷出 SQL 注入或其他攻擊方式的漏洞。 2.10.4 解決方案 (1)檢查所有的請求,以了解所有預(yù)期的參數(shù)和值是否存在。 當參數(shù)缺失時,發(fā)出適當?shù)腻e誤消息,或使用缺省值。 (2)應(yīng)用程序應(yīng)驗證其輸入是否由有效字符組成 (解碼后)。 例 如,應(yīng)拒絕包含空字節(jié)(編碼為 %00)、單引號、引號等的輸入值。 ( 3) 確保值符合預(yù)期范圍和類型。如果應(yīng)用程序預(yù)期特定參 數(shù)具有特定集合中的值,

49、 那么該應(yīng)用程序應(yīng)確保其接收的值確實屬于 該集合。例如,如果應(yīng)用程序預(yù)期值在10.99 范圍內(nèi),那么就該確 保該值確實是數(shù)字,且在 10.99 范圍內(nèi)。 (4)請勿在生產(chǎn)環(huán)境中輸出調(diào)試錯誤消息和異常。 2.10.5 技 術(shù)實現(xiàn) 養(yǎng)成良好的編碼習(xí)慣,屏蔽錯誤信息,防止信息泄露,將默認的 錯誤信息替換成一個事先定制好的 Html 頁面,這個頁面只顯示一條 簡單的錯誤消息但不提供任何細節(jié)。 例如:可以將瀏覽器的 404、 500 等錯誤以一個友好的界面展現(xiàn) 出來。修改工程的web.xm,添加 404 /comnon/addressertor. jsp Kerror-code500 /coniMon/

50、error, j sp 這樣的話,一旦出現(xiàn)404錯誤,頁面就會跳轉(zhuǎn)到address.jsp頁面, 如下: 如果出現(xiàn)500錯誤,則頁面就會跳轉(zhuǎn)到error.jsp頁面,如下: 2.11啟用了不安全的HTTP方法 2.11.1描述 Allow 頭顯示危險的 HTTP選項是已允許的,如:-DELETE - SEARCH - COPY - MOVE等,這表示在服務(wù)器上啟用了 WebDAV, 可能允許未授權(quán)的用戶對其進行利用 2.11.2 安全級別 中。 2.11.3 安全風(fēng)險 可能會在 Web 服務(wù)器上上載、修改或刪除 Web 頁面、腳本和 文件。 2.11.4 解決方案 如果服務(wù)器不需要支持 Web

51、DAV ,請務(wù)必禁用它,或禁止不必 要的 HTTP 方法(動詞)。 2.11.5 技術(shù)實現(xiàn) 添加過濾器,只允許POST和GET兩個HTTP方法訪問系統(tǒng)。 過濾器代碼 public class HttpMethodFilter implements Filter public void destroy() public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException HttpServletReq

52、uest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; String method = req.getMethod(); if(!method.toUpperCase().equals(POST) return; filterChain.doFilter(request, response); public void init(FilterConfig filterConfig) throws ServletException web.xml 配臵 ht

53、tpMethodFilter ponent.usrmgr.security.filter.HttpMethodFilter httpMethodFilter /* 注意:此漏洞僅在 Tomcat 服務(wù)器中存在。 2.12 BEA WebLogic 管理界 面 2.12.1 描述 WebLogic 服務(wù)器包含若干管理用途的應(yīng)用程序: /AdminMain 、 /AdminProps 、/AdminRealm 、webguitop.html 和 /console/index.jsp。 攻擊者可以訪問其中一或多個應(yīng)用程序,也許能夠更改 Web 站 點的配臵。 2.12.2 安全級別 中。 2.12.

54、3 安全風(fēng)險 可能會升級用戶特權(quán)并通過 Web 應(yīng)用程序獲取管理許可權(quán)。 2. 12.4解決方案 限制訪問管理控制臺,倘若不需要,請將其除去 2. 12. 5技術(shù)實現(xiàn) 將“ con sole ”改名,改一個和業(yè)務(wù)相關(guān)的標識名字即可。 實現(xiàn)步驟: (1) 進入管理控制臺,地址格式為:http:/ip:端口/console (2) 點擊左邊的 domain,如下圖,點 mydomain 控制臺 曰 mydomain 曰服務(wù)器 4 myserver 口群集 匸I計算機 田一I郁署 田口吏全性 匸I域曰志諦述器 匚J任努 (3) 點擊進入右邊的配臵-常規(guī)選項卡, 然后點顯示,出現(xiàn) 高級選項,如下圖 (4) 修改上圖中的控制臺上下文路徑,如vseafConsole然后 點擊右下角的應(yīng)用按鈕,然后重新啟動服務(wù)器即可。 (5) 訪問

溫馨提示

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

評論

0/150

提交評論