詳解常見web攻擊手段
目錄
- Web攻擊
- 一、XSS 攻擊
- 1、攻擊原理
- 2、防護手段
- 二、CSRF 攻擊
- 1、攻擊原理
- 2、防護手段
- 三、SQL 注入攻擊
- 1、攻擊原理
- 2、防護手段
- 四、檔案上傳漏洞
- 五、DDOS攻擊
- 1、攻擊原理
- 2、DDoS分類
Web攻擊
在網際網路中,攻擊手段數不勝數,我們平時不能以自己只是普通的開發程式設計師而不是安全方向的開發者為理由,而不去掌握基本的 Web 攻擊手段!我們來熟悉一下有哪幾種常見的 Web 攻擊手段
常見的 Web 攻擊手段主要有 XSSzMdCzG 攻擊
、CSRF 攻擊
、SQL 注入攻擊
、DDos 攻擊
、檔案漏洞攻擊
等。這幾種攻擊方式的防護手段並不複雜,卻還是有很多企業遭受了該攻擊,朔源到頭,還是因為人為的疏忽。
一、XSS 攻擊
XSS 攻擊的全稱為 跨站攻擊(Cross Site Scripting)
為什麼不叫
,那是因為為了不跟層疊樣式表(Cascading Style Sheet,CSS)混淆
XSS攻擊 是 Web 應用中最常見到的攻擊手段之一。
跨站指令碼攻擊,關鍵詞 指令碼
。
攻擊者常常在中嵌入了惡意的指令碼程式,當用戶開啟該網頁的時候,指令碼程式便開始在客戶端的瀏覽器後臺執行,常用於盜取客戶端的 cookie,使用者名稱密碼,下載執行病毒的木馬程式,以及獲取客戶端 Admin 許可權。
1、攻擊原理
前端常用表單的形式向後臺提交資訊
<input type="text" name="username" value="cbuc" />
很普通的一段html程式碼,向後臺提交 username 的資訊,正常情況下,使用者一般會輸入自己的 username,這個時候毫無問題,但是在不正常的情況下,使用者輸入的不是一個正常的字串,而是 "/><script> alert("bingo") </script><!-
。按這個時候表單的內容就會變成
<input type="text" name="username" value=""/><script> alert("bingo") </script><!-" />
這個時候向後臺提交引數,由於 username 的不合法性,校驗可能不通過,服務端就重定向會該頁面,並且帶上以上引數,這個時候頁面就會彈出一個警告框:
警告框問題不是很大,是因為取決於這段指令碼,如果攻擊者稍做修改,那麼性質可能就不一樣了~
甚至,攻擊者可以對URL進行操作,正常提交的地址為
www.xxx.com/login?username="/><script> alert("bingo") </script><!-"
攻擊者可以對 URL 進行編碼用來迷惑使用者:
www.xxx.com/login?username="%2F%3E%3Cscript%3E%20alert(%22bingo%22)%20%3C%2Fscript%3E%3C!-"
2、防護手段
知道了如何攻擊,防護起來就不難,我們對症下藥即可。既然輸入的引數不合法,我們就很有必要對入參進行校驗,比如 <、>、"、"、'、'
這些特殊字元我們很有必要進行轉義與校驗。
二、CSRF 攻擊
CSRF 攻擊全稱 跨站請求偽造 (Cross site request forgery)
。是一種對的惡意利用,我們上面說到的 XSS攻擊 是利用站點內的信任使用者,自己去觸發指令碼而導致的攻擊。而 CSRF 則是通過偽裝來自受信任使用者的請求去利用受攻擊的網站。
CSRF 攻擊,關鍵詞:偽造
。
攻擊這盜用了訪問使用者的身份,以訪問者的名義向第三方網站傳送惡意請求,常用於利用訪問者的身份傳送訊息,進行交易轉賬以及盜取賬號。
1、攻擊原理
受害者首先在信任站點完成了登入,並且生成了 Cookie,Cookie會在瀏覽器儲存一定的時間。到這一步,使用者如果在沒有登出 信任站點 的情況下,訪問了 惡意站點,這個時候 惡意站點 就會向 信任站點 發起請求,這個請求就會帶上以上生成的 Cookie,當惡意請求來到 信任站點,信任站點 看到請求攜帶的 Cookie,就會判斷該請求是 受害者 發出的。因此 信任站點 就會根據 受害者 的許可權來完成 惡意請求 的指令,而這個指令可能是利用 受害者 的身份傳送訊息,轉賬支付等等操作,這樣 惡意站點 就達到了偽造 受害者 請求 信任站點 的目的。
看到這個流程不知道你是否有所啟發,不知道螢幕前的小夥伴是否有過 QQ
被盜用的經歷,當然,有些盜用的手段與上面的流程是相似的。
該攻擊手段在日常中十分常見。如果某個支付系統的轉賬地址為 www.xxx.com/pay?accountNum=xxxx&money=xxx
。其中 accountNum 為轉賬目的的賬戶,money 為轉賬金額。那這個時候如果你剛巧登入過了該支付系統,又沒有及時的登出,在訪問惡意站點
的時候,如果你點開了某張圖片,而圖片的地址為 :
<img src="www.xxx.com/pay?accountNum=xxxx&money=xxx" />
當你美滋滋地瀏覽圖片的時候,卻不知道此時你的賬戶上已經悄悄的少了指定金額!
這就是因為你沒有及時的登出支付系統
,而又點選了 惡意站點
的 惡意連結,攜帶了你未過期的 Cookie,成功竊取了你的金額。
2、防護手段
同樣知其症下其藥!防護手段如下:
1)將 cookie 設定為 HttpOnly
CSRF 攻擊的關鍵就在於利用了使用者未過期的 Cookie,那麼為了防止 Cookie 的盜取,就需要在 Cookie 中設定 HttpOnly 屬性,這樣通過程式(XSS 攻擊
)就無法讀取到 Cookie 資訊,避免了攻擊者偽造 Cookie 的情況出現。
2)增加 token
該防護手段還是針對 Cookie 的盜取,由於請求中所有的使用者驗證資訊都存放於 Cookie 中,因為我們抵禦 CSRF 的關鍵就在於:如何在請求中放入攻擊者所不能偽造的資訊,並且該資訊不能存放在 Cookie 中。那麼我們就可以在請求返回中加入一個隨機生成的 token
,當請求來到時進行 token 的校驗,如果校驗不通過則認為是 CSRF 攻擊而拒絕該請求。
3)通過 Referer
根據 HTTP 協議,在 HTTP 請求頭上有一個欄位叫做 referer
,它記錄了該Http 請求的來源地址。在通常情況下,訪問一個安全受限的頁面的請求都來自同一個網站。
在 CSRF 中惡意請求是從 惡意站點 發出的,因此要防禦 CSRF 攻擊,需要對每一個請求驗證其 referer 值即可。
三、SQL 注入攻擊
SQL注入 是程式設計師最經常遇到的,所謂 SQL注入,就是通過把 SQL 命令偽裝成正常的請求引數,傳遞到服務端,欺騙伺服器最終執行惡意的 SQL命令,達到入侵的目的。攻擊者常常利用 SQL 注入的漏洞,來查詢非授權的關鍵資訊,修改伺服器的資料,改變表結構,危害極大!
1、攻擊原理
我們查詢使用者存不存在往往是通過以下 SQL:
SELECT * FROM s_user WHERE username = '' and password = ''
當我們後端使用以下程式碼查詢時,便會出現致命的漏洞
Connection con = getConnection(); Statement st = (Statewww.cppcns.comment) con.createStatement(); String sql = "SELECT * FROM s_user WHERE username = '"+ username +"' and password = '"+ passward+"' "; ResultSet rs = st.executeQuery(sql); while(rs.next()){ ... }
上面程式碼邏輯便是利用前端傳入的引數進行資料庫查詢,乍看之下感覺毫無問題,但是這個時候如果 password
前端傳過來的值是 ' or '1'='1
那這個時候 SQL 就會變成
SELECT * FROM s_user WHERE username = '' and password = '' or '1'='1'
這樣的 SQL 不用試都知道會把資料庫中的使用者全都查出來,明明沒有輸入正確的密碼,卻返回了登入成功。而這便是一次簡單且典型的 SQL 注入攻擊。
' or '1'='1
危害是讓使用者免密碼登入,如果傳過來的值為 '; drop table xxx; --
這個時候問題就大了!
2、防護手段
1)使用預編譯語句
預編譯語句 PreparedStatement 是 .sql 中的一個介面,繼承自 Statement 介面。
預編譯語句和 Statement 的不同之處在於,建立 PreparedStatement 物件時就指定了 SQL 語句,該語句立即傳送給 DBMS 進行編譯,當該編譯語句需要被執行時,DBMS 直接執行編譯後的 SQL 語句,而不需要像其他 SQL 語句那樣先將其編譯:
String sql = "SELECT * FROM s_user WHERE username = ? and password = ? "; PreparedStatement st = conn.preparedStatement(sql); st.setString(1,username); st.setString(2,password); ResultSet rs = st.executeQUery();
可以看到,SQL 語句中原有的白能量已經用佔位符 ? 替代了,變數通過 setString()
方法進行設定。
2)使用 ORM 框架
防止 SQL 注入的關鍵手段在於對一些關鍵字進行轉義,而常見的一些 ORM 框架,如 Mybatis,Hibernate等,都支援對響應的關鍵字或者特殊符號進行轉義,可以通過簡單的配置,很好的預防 SQL 注入的漏洞,降低普通開發人員進行安全的門檻。
四、檔案上傳漏洞
很多網站都有上傳的功能,如上傳圖片、檔案、壓縮包等等。而這些資源往往是儲存在遠端伺服器上。檔案上傳攻擊指的就是攻擊者利用一些站點沒有對檔案型別做很好的校驗,上傳了可執行的檔案或指令碼,並且通過指令碼對伺服器進行一定的許可權操作,或是通過誘導外部使用者訪問該指令碼檔案,達到攻擊的目的。
當然,這種攻擊防護上也是比較簡單,為了防止使用者上傳惡意的可執行指令碼檔案,以及將檔案上傳伺服器當做免費的檔案儲存伺服器來使用,我們需要對上傳檔案的型別進行白名單校驗,並且需要限制上傳檔案的大小,上傳的檔案需要進行重新命名,使攻擊這無法猜測到上傳檔案的訪問路徑。
其中對上傳檔案的型別進行白名單校驗,並不能單單通過後綴名稱來判斷檔案的型別,因為攻擊者很有可能可以通過將可執行檔案的字尾名稱改為其他可上傳的字尾名稱進行上傳,因為判斷檔案型別就需要使用更加安全的方式。
很多型別的檔案,其實的幾個位元組內容是固定的,因此根據這幾個位元組的內容,就可以確定檔案型別,而這幾個位元組也被成為 魔數
以上便是檔案型別的魔數,然後我們通過獲取檔案的檔案頭與檔案型別的魔數相比較來判斷檔案型別
五、DDOS攻擊
DDos攻擊 又稱為 分散式拒絕服務攻擊 (Distributed Denial of Service),是目前最為強大,最難以防禦的攻擊方式之一。
在瞭解 DDoS 之前,我們需要先知道什麼是 DoS。最基本的 DoS 就是利用合理的客戶端請求裡佔用過多的伺服器資源,從而使合法使用者無法得到伺服器的響應。DDoS 攻擊便是在傳統的 DoS 攻擊的基礎上產生的一類攻擊方式。傳統的 DoS攻擊一般是一對一的方式,當攻擊目標的CPU速度、記憶體或者網路頻寬等各項效能指標不高的情況下,它的效果是明顯的,但隨著計算機與網路技術的發展,計算機的處理能力顯著增加,記憶體不斷增大,這便使得 DoS 攻擊逐漸失去了效果。
這就跟單體應用向分散式架構的演進一樣,傳統的 DoS 演進到了分散式DoS (DDoS) 。
1、攻擊原理
DDoS 攻擊指的便是攻擊者藉助公共網路,將數量龐大的計算機裝置聯合起來作為攻擊平臺,對一個或多個目標發動攻擊,從而達到癱瘓目標主機的目的。通常在攻擊開始之前,攻擊者會提前控制大量的使用者計算機,這類計算機稱之為 肉雞
,並通過指令使大量的的肉雞在同一時刻對某個主機進行訪問,從而達到癱瘓目標主機的目的。
2、DDoS分類
DDoS 是一種攻擊手段,其中又分為好幾種 DDoS攻擊
1)SYN Flood
SYN Flood 是網際網路中最經典的攻擊方式之一,要了解該攻擊方式,我們需要從 TCP 協議連線的過程說起。眾所周知,TCP 協議在通訊之前,必須先建立基於 TCP 協議的一個連線,以下是建立連線的過程:
這是一張非常建議的 TCP 三次握手的過程。
- 第一步,客戶端傳送一個包含 SYN 標識的 TCP 報文,SYN 即同步(Synchronized)的意思,SYN報文會指明客戶端的埠號以及 TCP 連線的初始序列號
- 第二步,伺服器在收到客戶端的 SYN 報文後,會返回一個 SYN+ACK 的報文,表示客戶端請求被接收,同時 TCP 序列號被加 1,ACK 即確認(Acknowledgment)的意思
- 第三步,客戶端在接收到服務端的 SYN + ACK 報文後,也會返回一個 ACK 報給服務端,同樣,TCP 的序列號加 1,這時,TCP連線便建立好了,接下來便可以進行資料通訊了。
TCP 協議 是可靠的傳輸協議,在三次握手的過程中設定了一些異常處理機制。第三步中如果伺服器沒有收到客戶端的 ACK 報文,服務端一般會進行重試,也就是再次傳送 SYN + A程式設計客棧CK 報文給客戶端,並且一直處於 SYN_RECV 的狀態,將客戶端加入等待列表;另一方面,伺服器在發出 SYN + ACK 報文後,會預先分配一部分資源給即將建立的 TCP 連線,這個資源在等待重試期間一直保留,由於伺服器的資源有限,可以維護的等待列表超過極限之後就不會再接收新的 SYN 報文,也就是拒絕建立新的 TCP 連線。
這個時候我們便可以說說 SYN Flood 是怎麼回事了,SYN Flood就是利用了 TCP 協議三次握手的過程來達到攻擊的目的。攻擊者偽造大量的 IP 地址給伺服器傳送 SYN 報文,因為偽造的 IP 地址不可能存在,也就不可能從客戶端得到任何響應,就會一直卡在第三步,服務端就得維護一個非常大的半連線等待列表,並且不斷對這個列表中的 IP 地址進行遍歷重試,佔用了大量的系統資源。而由於伺服器資源有限,惡意的連線佔滿了伺服器的等待佇列,導致伺服器不再接收新的 SYN 請求,使正常的使用者無法完成通訊。
2)DNS Query Flood
DNS Query Flood 實際上就是 UDP Flood 攻擊的一種變形,因為 DNS 服務在網際網路中具有不可替代的作用,因此一旦 DNS 伺服器 癱瘓,影響將非常大!
DNS Query Flood 攻擊採用的方法是向被攻擊的伺服器傳送海量的域名解析請求。而這部分請求解析的域名一般都是隨機生成的,大部分不存在,並且通過偽造埠和客戶端IP,防止查詢請求被 ACL(訪問控制列表)過濾。被攻擊的 DNS伺服器 在收到域名解析的請求後,首先會在自己的伺服器上查詢是否該域名的 IP,因為域名的不存在,在自身自然是找不到的,因此DNS 伺服器便會向上層的 DNS伺服器遞迴查詢域名,直到全球網際網路的 13臺 根DNS伺服器。大量不存在的域名解析請求給伺服器帶來了很大的負載,當解析請求超過一定量級的時候,就會造成 DNS伺服器 解析域名超時,使正常的域名都查詢不到對應的 IP,達到了攻擊的效果。
3)CC 攻擊
CC(Challenge Collapsar)攻擊是基於應用層 HTTP 協議發起的攻擊,也稱為 HTTP Flood
CC攻擊的原理是通過控制大量的 “肉雞” 或者利用從網際網路上搜尋的大量匿名的 HTTP 代理,模擬正常使用者給網站發起請求直到該網站拒絕服務為止。大部分網站會通過 CDN 以及分散式快取來加快服務端的響應,提高網站的吞吐量。而這些惡意的 HTTP 請求會有意的避開這些快取,需要進行多次 DB 查詢操作或者一次請求會返回大量的資料,加速系統資源的消耗,從而拖垮後端的業務處理系統。
以上便是常見的 Web 攻擊手段,知其然知其所以然,安全是極為重要也是極難防護的,每個開發人員都應該引起重視!
以上就是詳解常見web攻擊手段的詳細內容,更多關於web攻擊手段的資料請關注我們其它相關文章!