十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
如何安全檢測(cè)Java?Web應(yīng)用網(wǎng)站漏洞.txt32因?yàn)閻坌模骼说娜藗儾拍苤胤导覉@;因?yàn)閻坌?,疲憊的靈魂才能活力如初。渴望愛心,如同星光渴望彼此輝映;渴望愛心,如同世紀(jì)之歌渴望永遠(yuǎn)被唱下去。web開發(fā)應(yīng)用程序(網(wǎng)站),是目前應(yīng)用最廣泛的程序。但是開發(fā)者的水平參差不齊,導(dǎo)致了各種各樣web漏洞的出現(xiàn)。本文站在分層架構(gòu)的角度,分析一下如何在java?web程序中找到可能出現(xiàn)的種種漏洞。??? ????????本文討論的只是web程序上的漏洞,和其它漏洞,是相對(duì)獨(dú)立的。這句話看似廢話,實(shí)際上卻說明了時(shí)常被忽略的因素,即:“很多人認(rèn)為只要我開發(fā)web程序沒有漏洞,web服務(wù)器就安全了”,事實(shí)上,并非如此。一個(gè)合格的web程序開發(fā)人員,應(yīng)該時(shí)刻清楚自己開發(fā)的程序會(huì)在什么環(huán)境中被使用,以及一旦自己的程序產(chǎn)生某種漏洞,最終會(huì)導(dǎo)致什么后果。簡(jiǎn)單的說,web程序被安裝在一臺(tái)或多臺(tái)(分布式)web服務(wù)器上,一旦安裝成功,就等于在為廣大用戶提供服務(wù)的同時(shí),給入侵者打開了一條或N條新的思路。如果服務(wù)器管理員剛好對(duì)安全配置不了解(事實(shí)上,國內(nèi)這種管理員居多),那么只好由我們的程序來守好最后的關(guān)卡最后一道防線。??? ????????看了本文題目,一定有一部分人會(huì)認(rèn)為,“不就是講JSP漏洞么,用得著披著這么厚的包裝么?”,為了回答這個(gè)疑問,我們先看看JSP和ASP的開發(fā)有什么不同吧。在ASP時(shí)代(ASP,PHP等語言),開發(fā)一套系統(tǒng)往往比修改別人已經(jīng)寫好的系統(tǒng)痛苦的多,因?yàn)樗鼈儼阉械拇a(包括鏈接數(shù)據(jù)庫的代碼、執(zhí)行SQL語句的代碼、控制頁面顯示的代碼)統(tǒng)統(tǒng)都放在%......%中,我們時(shí)常會(huì)看到如下代碼塊:??? ????-----------代碼來自某ASP?SHELL-----------??????Function?GetFileSize(size)??????Dim?FileSize?? ????FileSize=size?/?1024?? ????FileSize=FormatNumber(FileSize,2)?? ????If?FileSize??1024?and?FileSize??1?then?? ????GetFileSize="font?color=red"?FileSize??"/font?KB"??????ElseIf?FileSize?1024?then?? ????GetFileSize="font?color=red"?FormatNumber(FileSize?/?1024,2)??"/font?MB"??????Else?? ????GetFileSize="font?color=red"?Size??"/font?Bytes"??????End?If?? ????End?Function?? ????----------------------------------------?????? ????????如果客戶的需求變了,要求頁面不能使用“font?color=red”等標(biāo)簽,全部應(yīng)用“CSS”顯示。掛了,把程序員召喚出來,一個(gè)一個(gè)的改吧。。。注意,這里強(qiáng)調(diào)下,特指“召喚程序員”才能改,如果是學(xué)美工的,只會(huì)HTML、JS、CSS,完了,這活還干不成。而這些只是簡(jiǎn)單的頁面修改,如果客戶今天說,MYSQL服務(wù)器承擔(dān)不了這個(gè)數(shù)據(jù)量,要掛Oracle,可憐的程序員就要在一片一片的代碼海洋里尋找執(zhí)行SQL語句的代碼,而每一個(gè)文件都可能存放著SQL語句,意味著每一個(gè)文件都可能在受SQL注入的威脅。??
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比茶陵網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式茶陵網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋茶陵地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。
而JSP采用MVC模式分層架構(gòu)進(jìn)行開發(fā),就可以把所有的文件分開,根據(jù)其用途,分別放在不同的文件夾下(分層),每個(gè)文件夾下的文件只負(fù)責(zé)自己的事情。例如數(shù)據(jù)訪問層的代碼就放在數(shù)據(jù)訪問層的文件夾下,業(yè)務(wù)邏輯層的代碼也都放在自己的文件夾下,當(dāng)顯示層(這一層是為了把最終的運(yùn)算結(jié)果顯示給用戶看)的需求發(fā)生變化,就像前面的客戶需求,我們只要修改這一層的文件就是了,其他層的代碼根本不需要?jiǎng)?,而修改者也不需要懂得其它層的代碼。??? ????代碼分層了,意味著漏洞也在跟著分層,我們尋找JSP漏洞的思路也要跟著分層,才能與時(shí)俱進(jìn)。??? ????????下面在講述尋找漏洞的過程中,本文就拿一個(gè)簡(jiǎn)單的分層架構(gòu)例子來做樣板。樣板程序的名稱為“XX文章系統(tǒng)”,系統(tǒng)使用了STRUTS框架,和安全有關(guān)的層分為:??? ?????“DB層”,這一層存放了鏈接數(shù)據(jù)庫的字符串,以及JdbcTemplate類,直接訪問數(shù)據(jù)庫。因?yàn)樵趈ava中,執(zhí)行SQL語句的函數(shù)按照返回值可以分為三類,所以在這一層定義了JDBC模版類(JdbcTemplate),每一次使用操作數(shù)據(jù)庫時(shí)都要執(zhí)行這一層的三個(gè)方法其中一個(gè)。??? ????“DAO層(Data?Access?Object數(shù)據(jù)訪問對(duì)象層)”,從安全角度上看,這一層存放了SQL語句(并不執(zhí)行SQL語句,語句傳給DB層執(zhí)行)。這一層調(diào)用“DB層”訪問數(shù)據(jù)庫,它只知道“DB層”的存在,不知道數(shù)據(jù)庫的存在。??? ????“SERVICE層”,業(yè)務(wù)邏輯層,因?yàn)橐粋€(gè)業(yè)務(wù)的實(shí)現(xiàn),并不是一次數(shù)據(jù)庫訪問就可以完成的,所以這一層通過N次調(diào)用“DAO層的方法”實(shí)現(xiàn)業(yè)務(wù)邏輯,它只知道“DAO層”的存在,不知道“DB層”和數(shù)據(jù)庫的存在。??“ACTION層”,調(diào)用業(yè)務(wù)邏輯層,根據(jù)返回的結(jié)果,控制JSP頁面顯示。它只知道業(yè)務(wù)層的存在。這一層是入侵者的攻擊平臺(tái)。??? ????“Form層”,把用戶POST提交的信息封裝成Form對(duì)象,經(jīng)過驗(yàn)證后提交給ACTION層處理。??? ????“JSP層”(顯示層),這一層是最終顯示給用戶看的頁面,同時(shí)也是入侵者的攻擊平臺(tái)。??? ?????????用戶通過訪問ACTION層,自動(dòng)會(huì)發(fā)生:“ACTION調(diào)用SERVICE,SERVICE調(diào)用DAO,DAO調(diào)用DB,DB執(zhí)行SQL語句返回結(jié)果給DAO,DAO返回給SERVICE,SERVICE返回給ACTION,ACTION把數(shù)據(jù)顯示到JSP里返回給用戶”。??? ????有了樣板,我們來分析這套程序中可能出現(xiàn)的各種web漏洞。??? ????1、SQL注入漏洞??? ????????從SQL注入漏洞說起吧,在web漏洞里,SQL注入是最容易被利用而又最具有危害性的。怎么快速的找到呢?先分析流程,就拿用戶查看文章這個(gè)流程為例:用戶訪問一個(gè)
action,告訴它用戶想看ID為7的文章,這個(gè)action就會(huì)繼續(xù)完成前面所說的流程。??? ????????如果是ASP程序,這就是最容易產(chǎn)生問題的時(shí)候,ASP是弱類型,接到參數(shù)后不需要轉(zhuǎn)換類型,就和SQL語句連加起來。但是JSP就不一樣,JSP是強(qiáng)類型的語言,接受有害的參數(shù)后:對(duì)于GET請(qǐng)求(直接在地址欄訪問頁面),如果這里要的是int型,即使不懂安全的程序員,也會(huì)把它(文章的ID)立刻轉(zhuǎn)換成int,因?yàn)檫@里轉(zhuǎn)換后在后面的處理中會(huì)更容易操作,而這時(shí)程序就出錯(cuò)了;對(duì)于POST請(qǐng)求,如果這里要的是int型,程序會(huì)在把它封裝成Form對(duì)象時(shí),因?yàn)樽詣?dòng)要進(jìn)行類型轉(zhuǎn)化,同樣發(fā)生錯(cuò)誤,這兩種錯(cuò)誤發(fā)生后,根本不會(huì)訪問后面的流程就跳出了,或許這就是JSP天生的安全性。所以,通常提交的變量是int時(shí),不會(huì)發(fā)生問題,問題會(huì)出現(xiàn)在string參數(shù)這里,如果要查看某用戶的信息,程序可能會(huì)讓你提交如下參數(shù):showuser.do?????username=kxlzx。問題來了,因?yàn)檫@里是string類型,所以不懂安全的程序員頂多會(huì)判斷一下是不是空,就連加成為SQL語句。有漏洞的程序大概會(huì)寫成這個(gè)樣子:??? ????ACTION的代碼:?showuser.do??????String?username?=?null;?? ????username?=?request.getParameter("username");??????Service?service?=?new?Service();??????service.findByUsername(username);?? ????得到參數(shù)后調(diào)用service,service層直接交給了Dao層,dao的代碼:??????public?Object?findByUsername(String?username)???????{?? ????JdbcTemplate?jt=new?JdbcTemplate();?? ????String?sql?=?"select?*?from?Users?where?username=’"+username"’";??????List?list?=?jt.query(sql);??????...................???????}????? ???????dao調(diào)用了DB層的JdbcTemplate,把SQL語句拼好后,傳給了JdbcTemplate去執(zhí)行。不用再看這里的JdbcTemplate,就可以知道里面的代碼使用了Statement的executequery()方法執(zhí)行,導(dǎo)致了SQL注入。??? ???????分析了這么半天,有讀者會(huì)問:“難道我要費(fèi)這么大的力氣才能找到漏洞么?”。的確,通常在ASP程序里找注入時(shí)的思路就是這樣子,但是我們現(xiàn)在是在使用了開發(fā)模式分層架構(gòu)的JSP程序里,應(yīng)該按照分層架構(gòu)的思維去找漏洞。在回答這個(gè)問題之前,我們還得繞個(gè)彎子,看看怎么在這里預(yù)防SQL注入(java始終都是這么優(yōu)美,它不會(huì)直接告訴你答案,而是一層一層的讓你撥開云霧)。??? ????????剛才分析流程,是從正向分析的,從用戶輸入到產(chǎn)生漏洞,我們?cè)诜烙臅r(shí)候,不妨倒過來看看,從DB層入手。JdbcTemplate調(diào)用執(zhí)行SQL語句,可以有兩個(gè)類供我們選擇,一個(gè)是Statement,另一個(gè)就是預(yù)處理的Statement,兩者有著效率上和安全上的顯著差別。在效率上,只要數(shù)據(jù)庫支持預(yù)處理技術(shù)(sqlserver,mysql,oracle等都支持,只有少數(shù)access等不支持),就會(huì)在大量執(zhí)行SQL語句時(shí)增加速度;在安全上,使用預(yù)處理,會(huì)把接受的參數(shù)也經(jīng)過預(yù)處理,從而不會(huì)作為SQL語句的一部分執(zhí)行,而是僅僅作為SQL語句中的參數(shù)部分
內(nèi)容被執(zhí)行。一旦DB層使用了預(yù)處理,DAO層的SQL語句也會(huì)發(fā)生變化,成為這個(gè)樣子:??????public?Object?findByUsername(String?username)???????{?? ????JdbcTemplate?jt=new?JdbcTemplate();?? ????String?sql?=?"select?*?from?Users?where?username=?";??????List?list?=?jt.query(sql,new?Object[1]{username});??????...................??????}????? ????????這樣,SQL注入就和我們的程序幾乎無關(guān)了,注意我說的是幾乎,而不是全部。知道了怎么防御,于是一切在這里變的簡(jiǎn)單極了,我們應(yīng)該直接去DB層找到JdbcTemplate,看看代碼,一旦使用了Statement,很好,這個(gè)系統(tǒng)十有八九有漏洞,下面要做的是使用Editplus搜索“request.getParameter”。沒有使用預(yù)處理的系統(tǒng),可能會(huì)在action層進(jìn)行防御,對(duì)參數(shù)過濾,但總有防御不到的時(shí)候,因?yàn)閼?zhàn)線拉的太長了,每一個(gè)action里都可能接受參數(shù)并存在漏洞。??? ????????還有一種情況,系統(tǒng)一部分使用了預(yù)處理,一部分沒有,這樣的情況可能是因?yàn)轫?xiàng)目趕的比較倉促,人員沒有經(jīng)過正規(guī)培訓(xùn),最后艱難的整合到了一起。這種情況也好辦,直接在DAO層搜索("’)或(’"),這些符號(hào)用于和字符串變量連加,拼SQL語句,肯定是這些語句之后的代碼使用了Statement。然后再往上層找,看看哪個(gè)action調(diào)用了這個(gè)有問題的dao類,也可能發(fā)生SQL注入。?? ???????即使系統(tǒng)使用了預(yù)處理,別忘了,程序給客戶使用后,客戶有權(quán)利去擴(kuò)展的。程序拿到客戶那里,客戶有了新的需求,而這個(gè)需求又不大,很可能不愿意花錢重新雇人來實(shí)現(xiàn)擴(kuò)展功能,在這個(gè)時(shí)候也可能出現(xiàn)問題,客戶使用自己的程序員擴(kuò)展AJAX功能,這個(gè)程序員因?yàn)榕鲁鰡栴},不敢動(dòng)源程序,就在web.xml里加了一個(gè)servlet,這個(gè)servlet直接去調(diào)用conn??膳碌氖虑榘l(fā)生了。所以,我們的搜索漏洞規(guī)則中又加上了一條,在非dao層的文件中,搜索“select,update,delete”等字符串。??? ????2、暴露程序信息漏洞??? ????????這個(gè)漏洞是怎么來的呢?我們需要從異常說起。有經(jīng)驗(yàn)的入侵者,可以從JSP程序的異常中獲取很多信息,比如程序的部分架構(gòu)、程序的物理路徑、SQL注入爆出來的信息等,這個(gè)漏洞很容易防御,卻很難快速定位漏洞文件。出現(xiàn)這樣漏洞的時(shí)候,通常是我們?cè)趯懘a的時(shí)候,少了一些可能性的考慮而導(dǎo)致的。這樣的問題都是經(jīng)驗(yàn)造成的,而尋找漏洞也要通過經(jīng)驗(yàn)加運(yùn)氣(要有仙緣。。。),我個(gè)人技術(shù)有限,就不多說了。防御的方法就是在程序中加上“Exception層”,自定義異常,把系統(tǒng)產(chǎn)生的異常統(tǒng)統(tǒng)包裝起來,不要放過任何一個(gè)可能產(chǎn)生異常的地方。像騰訊的異常就包裝的很好“對(duì)不起,今天的注冊(cè)人數(shù)已經(jīng)達(dá)到十萬,請(qǐng)您明天再來。。?!?,廢話,日注冊(cè)量都十萬,還讓不讓人活啦,鐵定是程序發(fā)生了異常,不敢讓各位大大們看到真實(shí)的面孔。
1、排查:為了防范用戶上傳惡意的可執(zhí)行文件和腳本,以及將文件上傳服務(wù)器當(dāng)做免費(fèi)的文件存儲(chǔ)服務(wù)器使用,需要對(duì)上傳的文件類型進(jìn)行白名單(非黑名單,這點(diǎn)非常重要)校驗(yàn),并且限制上傳文件的大小,上傳的文件,需要進(jìn)行重新命名,使攻擊者無法猜測(cè)到上傳文件的訪問路徑。
2、是的。java狹義地來說,可以認(rèn)為是一門編程語言,而spring是用java語言實(shí)現(xiàn)的一套基礎(chǔ)開發(fā)框架。所以可以認(rèn)為spring屬于java的范疇。
打開騰訊電腦管家——工具箱——修復(fù)漏洞,進(jìn)行漏洞掃描和修復(fù)。
建議設(shè)置開啟自動(dòng)修復(fù)漏洞功能,開啟后,電腦管家可以在發(fā)現(xiàn)高危漏洞(僅包括高危漏洞,不包括其它漏洞)時(shí),第一時(shí)間自動(dòng)進(jìn)行修復(fù),無需用戶參與,最大程度保證用戶電腦安全。尤其適合老人、小孩或計(jì)算機(jī)初級(jí)水平用戶使用。開啟方式如下:進(jìn)入電腦管家“修復(fù)漏洞”模塊—“設(shè)置”,點(diǎn)擊開啟自動(dòng)修復(fù)漏洞即可。
源代碼漏洞掃描???
怎么可能有這種定西。。。就算有也不是一般人能有的。。。
要不然 軟件測(cè)試的那幫人 干嘛去
struts2會(huì)將http的每個(gè)參數(shù)名解析為ongl語句執(zhí)行(可理解為Java代碼)。 ongl表達(dá)式通過#來訪問struts的對(duì)象,struts框架通過過濾#字符防止安全問題,然而通過unicode編碼(\u0023)或8進(jìn)制(\43)即繞過了安全限制。
漏洞描述:
CVE-2013-225. Struts2 是第二代基于Model-View-Controller (MVC)模型的java企業(yè)級(jí)web應(yīng)用框架。它是WebWork和Struts社區(qū)合并后的產(chǎn)物
Apache Struts2的action:、redirect:和redirectAction:前綴參數(shù)在實(shí)現(xiàn)其功能的過程中使用了Ognl表達(dá)式,并將用戶通過URL提交的內(nèi)容拼接入Ognl表達(dá)式中,從而造成攻擊者可以通過構(gòu)造惡意URL來執(zhí)行任意Java代碼,進(jìn)而可執(zhí)行任意命令
redirect:和redirectAction:此兩項(xiàng)前綴為Struts默認(rèn)開啟功能,目前Struts 2.3.15.1以下版本均存在此漏洞
目前Apache Struts2已經(jīng)在2.3.15.1中修補(bǔ)了這一漏洞。強(qiáng)烈建議Apache Struts2用戶檢查您是否受此問題影響,并盡快升級(jí)到最新版本
參考
1.
測(cè)試方法:
@Sebug.net dis 本站提供程序(方法)可能帶有攻擊性,僅供安全研究與教學(xué)之用,風(fēng)險(xiǎn)自負(fù)!
由于Apache Struts2 在最新修補(bǔ)版本2.3.15.1中已經(jīng)禁用了重定向參數(shù),因此只要重定向功能仍然有效,則說明受此漏洞影響:
如果頁面重定向到,則表明當(dāng)前系統(tǒng)受此漏洞影響。
驗(yàn)證表達(dá)式解析和命令執(zhí)行:
{3*4}
{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}`
Sebug安全建議:
廠商狀態(tài):
廠商已經(jīng)發(fā)布Apache Struts 2.3.15.1以修復(fù)此安全漏洞,建議Struts用戶及時(shí)升級(jí)到最新版本。
廠商安全公告:S2-01. 鏈接:
軟件升級(jí)頁面:
目前存在漏洞的公司
烏云上,已經(jīng)發(fā)布了快60個(gè)struts的這個(gè)漏洞問題,包括騰訊,百度,網(wǎng)易,京東等國內(nèi)各大互聯(lián)網(wǎng)公司。()
解決辦法:
升級(jí)到Struts 2.3.15.1(強(qiáng)烈建議)
使用ServletFilter來過濾有問題的參數(shù)(臨時(shí)替換方案)
參考資料:
這次struts爆出來的漏洞,一大片的網(wǎng)站受的影響,影響最嚴(yán)重的就是電商了.對(duì)于struts的漏洞,曾經(jīng)也寫過struts2代碼執(zhí)行漏洞,struts2自從使用OGNL表達(dá)式的方式后,經(jīng)常就會(huì)報(bào)出一些可怕的漏洞出來,建議那些還是struts的童鞋們,學(xué)習(xí)一些其他的框架吧!比如,spring mvc,簡(jiǎn)單,好用,高效!