淺談經常使用的幾種web攻擊方式以及解決辦法

身在互聯網的時代,web在給咱們帶來便利的同時,有些人也在盯着這些便利,所以出現了攻擊網站的現象。因此咱們在開發的時候,要注意這些容易被攻擊的地方,以及作好防護的措施,下面將介紹一些這些常見的攻擊手段以及解決辦法。html

1.XSS攻擊

XSS攻擊的全稱是跨站腳本攻擊(Cross Site Scripting),爲不跟層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫爲XSS,它是Web應用程序中最多見到的攻擊手段之一。跨站腳本攻擊指的是攻擊者在網頁中嵌入惡意腳本程序,當用戶打幵該網頁時,腳本程序便開始在客戶端的瀏覽器上執行,以盜取客戶端cookie、用戶名密碼,下載執行病毒木馬程序,甚至是獲取客戶端admin權限等。web

XSS的原理

假設頁面上有個表單,表單名稱爲nick,用來向服務端提交網站用戶的暱稱信息:數據庫

<input type= "text" name= "nick" value= "xiaomaon> 複製代碼

表單nick的內容來自用戶的輸入,當用戶輸入的不是一個正常的暱稱字符串,而是下面:編程

<script>alert("我是小怪,我在作XSS漏洞測試,我懷疑大家的網站有XSS攻擊安全漏洞")</script><!-
複製代碼

時,因爲某種緣由,如nick服務端校驗不經過,服務端重定向回這個頁面,而且帶上以前用戶輸入的nick參數,此時頁面則變成下面的內容:後端

<input type="text" name="nick" value=""/><script>alert ("我是小怪,我在作XSS漏洞測試,我懷疑大家的網站有XSS攻擊安全漏洞") </script><!-/>
複製代碼

在輸入框input的後面帶上了一段腳本程序,固然,這段腳本程序只是彈出一個消息「我是小怪,我在作XSS漏洞測試,我懷疑大家的網站有XSS攻擊安全漏洞」,攻擊的威力取決於用戶輸入了什麼樣的腳本, 只要稍微修改,即可使攻擊極具危害性。瀏覽器

XSS防範

XSS之因此會發生,是由於用戶輸入的數據變成了代碼。所以,咱們須要對用戶輸入的數據進行HTML轉義處理,將其中的「尖括號」、「單引號」、「引號」之類的特殊字符進行轉義編碼:緩存

現在不少開源的幵發框架自己默認就提供HTML代碼轉義的功能,如流行的jstl、Struts等,不須要開發人員再進行過多的開發。使用jstl標籤進行HTML轉義,將變量輸出,代碼以下:

<c:out value= "${nick}" escapeXml="true" </c:out>
複製代碼

只須要將escapeXml設置爲true,jstl就會將變量中的HTML代碼進行轉義輸出。安全

2.CSRF攻擊

CSRF(Cross-site request forgery跨站請求僞造,也被稱成爲「one click attack」或者session riding,一般縮寫爲CSRF或者XSRF,是一種對網站的惡意利用。bash

CSRF攻擊原理

CSRF攻擊原理比較簡單,如圖1所示。其中Web A爲存在CSRF漏洞的網站,Web B爲攻擊者構建的惡意網站,User C爲Web A網站的合法用戶。服務器

CSRF漏洞防護

CSRF漏洞防護主要能夠從三個層面進行,即服務端的防護、用戶端的防護和安全設備的防護。

1.將cookie設置爲HttpOnly

response.setHeader("Set-Cookie", "cookiename=value; Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");
複製代碼

2.在請求地址中添加token並驗證

3.驗證HTTP頭中的Referer字段

3.SQL注入

所謂SQL注入,就是經過把SQL命令假裝成正常的HTTP請求參數,傳遞到服務端,欺騙服務器最終執行惡意的SQL命令,達到入侵目的。攻擊者能夠利用SQL注入漏洞,查詢非受權信息,修改數據庫服務器的數據,改變表結構,甚至是獲取服務器root權限。

攻擊方式

使用 SQL數據庫的密碼系統,可能運行這樣的查詢:

SELECT * FROM users WHERE 'username' = '$USER' AND 'password'='$PASS';
複製代碼

\$USER和$PASS 會用用戶提供的用戶名和密碼來代替。那麼若是用戶輸入‘bob’和‘1234’,那麼結果的查詢是:

SELECT * FROM users WHERE 'username' = 'bob' AND 'password' = '1234';
複製代碼

而來自數據庫的返回值會是全部用 bob 做爲用戶名且用 1234 做爲密碼的數據元組。若是黑客輸入 admin 和 <<’hi’ 或 1=1>>–,那麼查詢是:

SELECT * FROM users WHERE 'username' = 'admin' and `password` = 'hi' OR 1=1--' 複製代碼

注意用戶輸入的引號如何與原始查詢中的第三個引號匹配。數據庫如今會返回用戶名爲 admin 的全部元組,而且會取消對密碼的檢查,由於 ‘password’ = ‘hi’ OR 1=1 命令數據庫尋找密碼是 hi 的元組或 1=1 的元組,而因爲 1 老是 1,因此每行都是候選。– 是 SQL 註釋標誌,取消查詢中原始的其餘引號,而且還將取消任何額外的檢查,所以若是有額外的憑證(也就是,keyfob 或 captcha)也會被忽略。如今黑客能夠以管理員的身份進入系統而且不用給出合法的密碼。經過利用愈來愈複雜的查詢,黑客能夠變動、添加,或查詢數據。對於數據庫,這令黑客具備同應用程序相同的特權。

常見的SQL注入攻擊的防範措施

a.使用預編譯語句

預編譯語句使用參數佔位符來替代須要動態傳入的參數,這樣攻擊者沒法改變SQL語句的結構,SQL語句的語義不會發生改變,即便用戶傳入相似於’ or ‘1’=’1這樣的字符串,數據庫也會將其做爲普通的字符串來處理。預編譯SQL語句中的特殊字符會被轉義。

b.使用ORM框架

常見的ORM框架,如MYBATIS、HIBERNATE等,都支持對相應的關鍵字或者特殊符號進行轉義。 經過#符號配置的變量,MYBATIS可以對輸入變量的一些關鍵字進行轉義,防止SQL注入攻擊。

特別注意: MYBATIS將#{ }解釋爲參數標記,將${ }解釋爲字符串替換。知道參數標記和字符串替換的這個區別很重要,由於參數標記不能夠用在SQL語句的某些地方。例如,您不能使用參數標記來指定表名。

代碼示例以下:

Map<String, Object> parms = new HashMap<String, Object>();
parms.put("table", "foo");
parms.put("criteria", 37);
List<Object> rows = mapper.generalSelect(parms);
複製代碼
<select id="generalSelect" parameterType="map">
  select * from ${table} where col1 = #{criteria}
</select>
複製代碼

MYBATIS將生成以下的預編譯語句:

select * from foo where col1 = ?
複製代碼

重要提示: ${…} (字符串替換)的使用會帶來SQL注入攻擊的風險。 另外,字符串替換對於像日期一類的複雜類型會有問題。基於這些緣由,咱們建議儘量地使用#{…}(參數標記)格式。

c.避免將明文密碼存放到數據庫

對存儲的密碼進行單向Hash,如使用MD5對密碼進行摘要,而非直接存儲明文密碼,這樣的好處就是萬一用戶信息泄露,即圈內所說的被「拖庫」,黑客沒法直接獲取用戶密碼。 可是,MD5目前也變得不那麼安全了。近幾年開始流行一種使用彩虹表的破解辦法,可以根據用戶密碼的Hash碼,比較快速地逆向得出密碼的原文(或者是碰撞串)。 哈希加鹽法(Hash+Salt)可以在必定程度上解決這個問題。所謂加鹽就是在生成Hash時給予一個擾動,使Hash值與標準的Hash結果不一樣。

d.處理好相應的異常

後臺的系統異常極可能包含了一些如服務器版本、數據庫版本、編程語言等信息,甚至是數據庫鏈接的地址與用戶名密碼,攻擊者能夠按圖索驥,找到對應版本的服務器漏洞或者數據庫漏洞進行攻擊。所以,必需要處理好後臺異常,重定向到相應的錯誤處理界面,而不是任由其直接輸出到頁面上。

4.DDos攻擊

分佈式拒絕服務(DDoS)攻擊是一種惡意企圖,經過大量互聯網流量壓倒目標或其周圍的基礎架構來破壞目標服務器,服務或網絡的正常流量。DDoS攻擊經過利用多個受損計算機系統做爲攻擊流量來源來實現有效性。

攻擊方式:

a.SYN Flood攻擊

即利用tcp協議原理,僞造受害者的ip地址,一直保持與服務器的鏈接,致使受害者鏈接服務器的時候拒絕服務。

b.DNS Query Flood:

DNS Query Flood其實是UDP Flood攻擊的一種變形,因爲DNS服務在互聯網中不可替代的做用,一旦DNS服務器癱瘓,影響甚大。DNS Query Flood攻擊採用的方法是向被攻擊的服務器發送海量的域名解析請求,一般,請求解析的域名是隨機生成,大部分根本就不存在,而且經過僞造端口和客戶端IP,防止查詢請求被ACL過濾。被攻擊的DNS 服務器在接收到域名解析請求後,首先會在服務器上查找是否有對應的緩存,因爲域名是隨機生成的,幾乎不可能有相應的緩存信息,當沒有緩存,而且該域名沒法直接由該DNS服務器進行解析的時候, DNS服務器會向其上層DNS服務器遞歸查詢域名信息,直到全球互聯網的13臺根DNS服務器。大量不存在的域名解析請求,給服務器帶來了很大的負載,當解析請求超過必定量的時候,就會形成DNS服務器解析域名超時,這樣攻擊者便達成了攻擊目的。

c. CC攻擊:

CC(Challenge Collapsar)攻擊屬於DDos的一種,是基於應用層HTTP協議發起的DDos攻擊,也被稱爲HTTP Flood。CC攻擊的原理是這樣的,攻擊者經過控制的大量「肉雞」或者利用從互聯網上搜尋的大量匿名的HTTP代理,模擬正經常使用戶給網站發起請求直到該網站拒絕服務爲止。大部分網站會經過CDN以及分佈式緩存來加快服務端響應,提高網站的吞吐量,而這些精心構造的HTTP請求每每有意避開這些緩存,須要進行屢次DB查詢操做或者是一次請求返回大量的數據,加速系統資源消耗,從而拖垮後端的業務處理系統,甚至連相關存儲以及日誌收集系統也沒法倖免。網上也有大量的免費IP網站,攻擊者能夠大量的在網上收集 積累。

d.Ping Flood攻擊

即利用ping命令不停的發送的數據包到服務器。

e.其餘攻擊手段

解決方案:

設置路由器與交換機的安全配置,即設置防火牆。

5.文件上傳攻擊

在上網的過程當中,咱們常常會將一些如圖片、壓縮包之類的文件上傳到遠端服務器進行保存,文件上傳攻擊指的是惡意攻擊者利用一些站點沒有對文件的類型作很好的校驗這樣的漏洞,上傳了可執行的文件或者腳本,而且經過腳本得到服務器上相應的權利,或者是經過誘導外部用戶訪問或者下載上傳的病毒或者木馬文件,達到攻擊目的。

爲了防範用戶上傳惡意的可執行文件和腳本,以及將文件上傳服務器當作免費的文件存儲服務器使用,須要對上傳的文件類型進行白名單(非黑名單,這點很是重要)校驗,而且限制上傳文件的大小,上傳的文件,須要進行從新命名,使攻擊者沒法猜想到上傳文件的訪問路徑。

對於上傳的文件來講,不能簡單的經過後綴名稱來判斷文件的類型,由於惡意攻擊能夠將可執行文件的後綴名稱改爲圖片或者其餘的後綴類型,誘導用戶執行。所以,判斷文件類型須要使用更安全的方式。

不少類型的文件,起始的幾個字節內容是固定的,所以,根據這幾個字節的內容,就能夠肯定文件類型,這幾個字節也被稱爲魔數(magic number)。

對於圖片類型的文件,能夠在上傳後,對圖片進行相應的縮放,破壞惡意用戶上傳的二進制可執行文件的結構,來避免惡意代碼的執行。

imagemagick是一套功能強大、穩定而且開源的針對圖片處理的開發工具包,可以處理多種格式的圖片文件,能夠利用imagemagick來對圖片進行縮放處理。

注意:該文章參照如下資料

常見的web攻擊手段

WEB網站常見受攻擊方式及解決辦法

常見的web攻擊有哪些

淺談經常使用的幾種web攻擊方式

XSS攻擊及防護

CSRF攻擊與防護

相關文章
相關標籤/搜索