1. 程式人生 > >怕什麼真理無窮, 進一寸有一寸的歡喜

怕什麼真理無窮, 進一寸有一寸的歡喜

概述:常見的安全漏洞:

漏洞名稱漏洞背景避免方法解決方案
CSRF(跨站請求偽裝)攻擊者誘導使用者點選連線,使用者瀏覽器攜帶cookie成功請求伺服器,造成使用者資訊丟失。
  • 驗證 HTTP Referer 欄位
  • token驗證機制
  • 驗證碼
spring-boot-security-csrf
XSS(CSS,跨站指令碼攻擊)惡意攻擊者往web頁面插入惡意js程式碼,當用戶瀏覽時潛入的程式碼會被執行,從而控制使用者的瀏覽器。
  • 過濾特殊字元
  • 使用HTTP頭指定型別
spring-boot-security-xss
SQL注入外部輸入引數在拼接時,沒有和資料庫語句做嚴格區分,導致攻擊者注入自定義的資料庫語句,從而非預期地操作資料庫。預編譯sql語句。對mybatis而言,可用#{}代替${}。
Jsonp劫持jsonp存在非法站點惡意呼叫、callback引數惡意新增標籤-XSS漏洞等問題。
  • refer白名單匹配
  • callback引數檢查
spring-boot-security-jsonp
DoS攻擊偽造請求,建立大量的半連線,使伺服器連線佇列滿,導致拒絕服務。
設計安全:脫敏:在對使用者敏感資訊(密碼、金鑰、信用卡、借記卡、個人資訊(身份證,姓名,tel,mail,add,uid))進行展示/使用時,應遵循一些原則,以防止使用者資訊洩露。對於一些使用者敏感資訊,在前後端傳輸過程中,需要加密處理,以防被監聽而洩露。可以使用Http手動加密和Https。對於Http,客戶端收到使用者鍵入的敏感資訊後,可以考慮使用base64編碼或者加密處理後,傳送到後端。

CSRF

GET 請求,用一個<img src = "...">就可以實現CSRF攻擊,但是GET請求的CSRF攻擊不用防範,前提是我們的介面設計要保證符合HTTP規範,即是:GET請求應該是冪等的,不涉及資料狀態的更新。(冪等,我們可以理解為強一致:讀:每次的結果都一致。寫:連續呼叫10次的結果,要保證寫不會重複。另外,當我們呼叫其他的業務介面時,當出現失敗,要保證結果一定是失敗,即保證一致)。POST 表單提交:這個CSRF可以進行攻擊,模擬表單提交。解決方案就是伺服器使用隨機生成的token,嵌入到表單中,CSRF無法獲得此表單的token值。當進行表單提交時,我們先驗證此token是否合法。框架解決方案是:Spring-security。增加可信任的域。驗證HTTP的refer頭,看是否是信任的域發起的請求。可參考:

XSS

由攻擊者輸入惡意資料儲存在資料庫,再由伺服器指令碼程式從資料庫中讀取資料,然後顯示在公共顯示的固定頁面上,那麼所有瀏覽該頁面的使用者都會被攻擊。由於攻擊者輸入惡意資料儲存在資料庫,再由伺服器指令碼程式從資料庫中讀取資料。所以大部分的儲存型XSS漏洞都是在表單提交上會發生的。比如在個人資訊或發表文章等地方,加入程式碼,如果沒有過濾或過濾不嚴,那麼這些程式碼將儲存到伺服器中,使用者訪問該頁面的時候觸發程式碼執行。這種XSS比較危險,容易造成蠕蟲,盜竊cookie等。             只要有form表單提交,並且回顯邏輯時,當一個虛假的黑客在表單中提交js程式碼時,回顯頁面時,js執行引擎解釋這段危險程式碼,會造成比較嚴重的問題。比如:流量劫持,彈窗,釣魚等。。。json回寫時,需要經過security的一層轉義。      但是對於介面來說,你偽造一個賬號來攻擊我的介面是不行的,dos攻擊時,當出現ip超過一定的閾值後,會禁止掉。 如果A提交的內容影響到了B,比如A提交資訊時寫了一段js程式碼,當上遊B去檢視時,這個js程式碼就會執行,所以會影響B。如果隻影響A,那麼就不用去解決,因為對自己負責。      跨站點指令碼攻擊(為了不跟CSS混淆,叫XSS),在網頁中插入惡意的Java script指令碼程式碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的Script程式碼會被執行,從而達到惡意攻擊使用者的目的。比如:在留言板插入下邊的指令碼內容:
<script>alert(“hey!you are attacked”)</script>
這樣,使用者在訪問此留言板時,就會彈出提醒框。XSS攻擊可以:竊取使用者cookie值,劫持流量向某個網頁跳轉等。可用:過濾特殊字元,使用HTTP頭指定型別解決。 框架解決方案是:Spring-security。

Jsonp劫持

JSON是一種基於文字的資料交換方式,或者叫做資料描述格式。Jsonp用來跨域。一個眾所周知的問題,Ajax直接請求普通檔案存在跨域無許可權訪問的問題,甭管你是靜態頁面、動態網頁、web服務、WCF,只要是跨域請求,一律不準。另外:我們還發現凡是擁有"src"這個屬性的標籤都擁有跨域的能力,比如<script>、<img>、<iframe>。
  • 把跨域伺服器寫成 呼叫本地的函式 ,回撥資料回來不就好了?jsonp的核心則是動態新增<script>標籤來呼叫伺服器提供的js指令碼
  1. 首先是利用script標籤的src屬性來實現跨域。
  2. 通過將前端方法作為引數傳遞到伺服器端,然後由伺服器端注入引數之後再返回,實現伺服器端向客戶端通訊。
  3. 由於使用script標籤的src屬性,因此只支援get方法
為了便於客戶端使用資料,逐漸形成了一種非正式傳輸協議,人們把它稱作JSONP,該協議的一個要點就是允許使用者傳遞一個callback引數給服務端,然後服務端返回資料時會將這個callback引數作為函式名來包裹住JSON資料,這樣客戶端就可以隨意定製自己的函式來自動處理返回資料了。其實核心就是:<script> 可跨域,本地呼叫<script>呼叫遠端,然後用callback指定呼叫方本地的回撥函式。Jsonp劫持:
jsonp存在非法站點惡意呼叫、callback引數惡意新增標籤-XSS漏洞等問題。
  • refer白名單匹配
  • callback引數檢查
spring-boot-security-jsonp

SQL注入

漏洞背景

        外部輸入引數沒有經過過濾,直接拼接到SQL語句中執行,沒有和資料庫語句做嚴格區分,導致攻擊者注入自定義的資料庫語句,從而非預期地操作資料庫。比如我們可以用 -- 來註釋查詢條件。select * from user where username = "zhangsan" and password = "..."利用引數拼接實現sql注入:select * from user where username = "zhangsan" and "1" = "1"-- and password =

避免方法

        預編譯sql語句。對mybatis而言,可用#{}代替${}。因為#{}相當於JDBC的PreparedStatement,會對自動傳入的資料加一個雙引號;${}是未經預編譯,僅取變數的值,非安全。

DoS 攻擊

是Denial of Service的簡稱,即拒絕服務。 DoS攻擊是指故意的攻擊網路協議實現的缺陷或直接通過野蠻手段地耗盡被攻擊物件的資源,目的是讓目標計算機或網路無法提供正常的服務或資源訪問,使目標系統服務系統停止響應甚至崩潰,而在此攻擊中並不包括侵入目標伺服器或目標網路裝置。這些服務資源包括網路頻寬,檔案系統空間容量,開放的程序或者允許的連線。這種攻擊會導致資源的匱乏,無論計算機的處理速度多快、記憶體容量多大、網路頻寬的速度多快都無法避免這種攻擊帶來的後果。比如SYN的Flood攻擊SYN洪水攻擊屬於DoS攻擊的一種,它利用TCP協議缺陷,通過傳送大量的半連線請求,耗費CPU和記憶體資源。SYN攻擊除了能影響主機外,還可以危害路由器、防火牆等網路系統,事實上SYN攻擊並不管目標是什麼系統,只要這些系統開啟TCP服務就可以實施。從圖4-3可看到,伺服器接收到連線請求(SYN=i )將此資訊加入未連線佇列,併發送請求包給客戶端( SYN=j,ACK=i+1 ),此時進入SYN_RECV狀態。當伺服器未收到客戶端的確認包時,重發請求包,一直到超時,才將此條目從未連線佇列刪除。配合IP欺騙,SYN攻擊能達到很好的效果,通常,客戶端在短時間內偽造大量不存在的IP地址,向伺服器不斷地傳送SYN包,伺服器回覆確認包,並等待客戶的確認,由於源地址是不存在的,伺服器需要不斷的重發直至超時,這些偽造的SYN包將長時間佔用未連線佇列,正常的SYN 請求被丟棄,目標系統執行緩慢,嚴重者引起網路堵塞甚至系統癱瘓。解決方案:第一種是縮短SYN Timeout時間第二種方法是設定SYN Cookie,就是給每一個請求連線的IP地址分配一個Cookie,如果短時間內連續受到某個IP的重複SYN報文,就認定是受到了攻擊,以後從這個IP地址來的包會被一概丟棄。>netstat -n -p tcp >result.txtPing of Death  "ping ofdeath"攻擊就是我們常說的"死亡Ping"  這種攻擊通過傳送大於65536位元組的ICMP包使作業系統崩潰;通常不可能傳送大於65536個位元組的ICMP包,但可以把報文分割成片段,然後在目標主機上重組;最終會導致被攻擊目標緩衝區溢位,引起拒絕服務攻擊。有些時候導致telne和http服務停止,有些時候路由器重啟。