應用安全技術論壇知識點整理

2020-10-28 12:01:01

在這裡插入圖片描述

漏洞

程式碼漏洞

XSS指令碼注入

XSS攻擊是Web攻擊中最常見的攻擊方法之一,它是通過對網頁注入可執行程式碼且成功地被瀏覽器執行,達到攻擊的目的,形成了一次有效XSS攻擊,一旦攻擊成功,它可以獲取使用者的聯絡人列表,然後向聯絡人傳送虛假詐騙資訊,可以刪除使用者的紀錄檔等等,有時候還和其他攻擊方式同時實施比如SQL隱碼攻擊伺服器和資料庫、Click劫持、相對連結劫持等實施釣魚,它帶來的危害是巨大的,是web安全的頭號大敵。

XSS攻擊能做什麼?

1、Cookie劫持
利用瀏覽器外掛,可以獲取請求中的Cookie資訊,從獲取到的Cookie資訊中,讀取使用者的私密資訊。

2、模擬GET、POST請求操作使用者的瀏覽器。使用JavaScript模擬瀏覽器發包
「Cookie劫持」失效時,或者目標使用者的網路不能存取網際網路等情況下,這種方式非常有用

3、XSS釣魚
利用JavaScript在當前頁面「畫出」一個偽造的登入框,當使用者在登入框中輸入使用者名稱與密碼後,其密碼將被傳送到駭客的伺服器

4、獲取使用者瀏覽器資訊
JavaScript指令碼通過XSS讀取瀏覽器的UserAgent物件來識別瀏覽器的版本。alert(navigator.userAgent)
通過JavaScript指令碼區分瀏覽器之間的實現差異

5、識別使用者安裝的軟體
通過查詢某些屬性是否存在,從而判斷是否安裝了某個軟體或某個外掛

6、通過CSS,來發現使用者曾經存取過的網站
通過style的visited屬性,來判斷連結是否被存取

7、劫持瀏覽器對談,從而執行任意操作,如進行非法轉賬、強制發表紀錄檔、傳送電子郵件等

8、強制彈出廣告頁面,刷流量等

9、進行大量的使用者端攻擊,如DDoS攻擊

10、獲取使用者電腦的真實IP

我們專案中之前也遇到了XSS指令碼注入,但那時候不知道這個專業名詞,直到上週一個技術論壇分享了這個名字的解釋之後才知道。我們在前臺頁面輸入框中輸入<script>alert(111)</script>,在讀取該介面內容是出現彈窗,當然這只是無惡意的測試。我們的處理方式是過濾像<和>這種型別的字元,當然也可以進行跳脫,具體看專案需求了。
在這裡插入圖片描述

CSRF跨站請求偽造

在這裡插入圖片描述
從上圖可以看出,要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:

1.登入受信任網站A,並在本地生成Cookie。

2.在不登出A的情況下,存取危險網站B。
 
目前防禦 CSRF 攻擊主要有三種策略:驗證 HTTP Referer 欄位;在請求地址中新增 token 並驗證(表單令牌驗證);在 HTTP 頭中自定義屬性並驗證。

1、儘量使用POST,限制GET

GET介面太容易被拿來做CSRF攻擊,看第一個範例就知道,只要構造一個img標籤,而img標籤又是不能過濾的資料。介面最好限制為POST使用,GET則無效,降低攻擊風險。(get和post區別:https://blog.csdn.net/qq_42806764/article/details/86596589?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param)當然POST並不是萬無一失,攻擊者只要構造一個form就可以,但需要在第三方頁面做,這樣就增加暴露的可能性。

2、加驗證碼

驗證碼,強制使用者必須與應用進行互動,才能完成最終請求。在通常情況下,驗證碼能很好遏制CSRF攻擊。但是出於使用者體驗考慮,網站不能給所有的操作都加上驗證碼。因此驗證碼只能作為一種輔助手段,不能作為主要解決方案。

3、Referer Check

Referer Check在Web最常見的應用就是「防止圖片盜鏈」。同理,Referer Check也可以被用於檢查請求是否來自合法的「源」(Referer值是否是指定頁面,或者網站的域),如果都不是,那麼就極可能是CSRF攻擊。但是因為伺服器並不是什麼時候都能取到Referer,所以也無法作為CSRF防禦的主要手段。但是用Referer Check來監控CSRF攻擊的發生,倒是一種可行的方法。

4 、Anti CSRF Token

現在業界對CSRF的防禦,一致的做法是使用一個Token(Anti CSRF Token)。

例子:
使用者存取某個表單頁面。伺服器端生成一個Token,放在使用者的Session中,或者瀏覽器的Cookie中。在頁面表單附帶上Token引數。使用者提交請求後, 伺服器端驗證表單中的Token是否與使用者Session(或Cookies)中的Token一致,一致為合法請求,不是則非法請求。這個Token的值必須是隨機的,不可預測的。由於Token的存在,攻擊者無法再構造一個帶有合法Token的請求實施CSRF攻擊。另外使用Token時應注意Token的保密性,儘量把敏感操作由GET改為POST,以form或AJAX形式提交,避免Token洩露。

這一塊目前專案中沒遇到過,讀懂了大概的意思,有機會會去嘗試復現。

SQL隱碼攻擊

SQL隱碼攻擊比較常見,舉個例子:
執行一條sql,如下:

String sql = "select * from user_table where username =
' "+userName+" ' and password =' "+password+" '"

–當輸入了上面的使用者名稱和密碼(or 1 = 1, 123456),上面的SQL語句變成:

SELECT * FROM user_table WHERE username = or 1 = 1 and password= 123456

此時這條sql無論如何都會成功執行,成功繞過了使用者名稱和密碼校驗並獲取到了資料庫中的資訊,甚至還可以刪除或者運算元據庫中的資料。

這個sql例子是很常見的一個問題,同時目前在公司中開發都採用比較成熟的框架進行開發,所以基本不會碰見此類問題,但是如何在mybatis的框架下成功進行sql注入?
那就是引數獲取用${param},我們之前在專案中許多地方都用了${param}獲取引數值,後面發現了會出現sql注入的問題,而#{param}可以很好的避免這一問題。

明文傳輸

明文的意思就是沒有加密的文字。例如http協定,我們常存取的http網站就是明文傳輸,如果被抓包那就直接暴露裡面的資訊,因為沒有加密,所以非常不安全,目前越來越多的網站使用https,s就是safe安全的意思,也就是https協定在傳輸的過程是加密的,這樣就安全很多了。現在有的瀏覽器開啟http網站直接就說網站不安全就是這個原因。我們專案是用的base64加密方式,可能也不是很安全,還需要進一步的加強,關於登入和安全這一塊沒怎麼接觸過,學習過後再來補充。

越權

資料越權

找了一圈資料,關於資料越權的很少,但是搜到了一些資料,關於水平越權的,資料越權應該也叫水平越權吧。水平越權也可以把其稱作存取控制攻擊漏洞。Web應用程式在接收到使用者的請求時,我們在增刪改查某條資料時候,沒有判斷資料所對應的使用者,或者在判斷資料的使用者時是通過從使用者表單引數中獲取userid來實現的,這裡的話我們可以修改userid來實現水平越權。

功能越權

垂直越權又叫做許可權提升攻擊,具體原因就是web應用沒有做使用者許可權控制,或者只是在選單上做了許可權控制,導致惡意使用者只要猜測到其他管理頁面的URL,就可以存取或者控制其他角色擁有的資料或者頁面,達到許可權提升的目的。這一塊目前專案中還沒做,但在後續工作安排中會實現,待補充。

錯誤紀錄檔輸出

由於時間關係分享人沒做分享,個人猜測是紀錄檔輸出級別設定相關的。

URL注入

URL注入攻擊與XSS跨站、SQL隱碼攻擊類似,也是引數可控的一種攻擊方式。URL注入攻擊的本質就是URL引數可控。攻擊者可通過篡改URL地址,修改為攻擊者構造的可控地址,從而達到攻擊的目的。

登入錯誤次數未做控制

主要是為了防止運用工具暴力破解,在日常生活中已經很常見了。

登陸、提交頁面未加入驗證碼或驗證簡訊

也是為了防暴力破解,有效bai防止這種問題對某一du個特定註冊使用者用特定程式暴力破解方zhi式進行不斷的登陸嘗試。

弱口令

密碼簡單容易被破解,如:名字+生日。常見的弱口令分為預設型弱口令和社工型弱口令。對於我們普通使用者來說,主要是社工型弱口令。

檔案上傳漏洞

大部分的網站和應用系統都有上傳功能,一些檔案上傳功能實現程式碼沒有嚴格限制使用者上傳的檔案字尾以及檔案型別,導致允許攻擊者向某個可通過Web存取的目錄上傳任意PHP檔案,並能夠將這些檔案傳遞給PHP直譯器,就可以在遠端伺服器上執行任意PHP指令碼。

當系統存在檔案上傳漏洞時攻擊者可以將病毒,木馬,WebShell,其他惡意指令碼或者是包含了指令碼的圖片上傳到伺服器,這些檔案將對攻擊者後續攻擊提供便利。根據具體漏洞的差異,此處上傳的指令碼可以是正常字尾的PHP,ASP以及JSP指令碼,也可以是篡改字尾後的這幾類指令碼。

上傳檔案是病毒或者木馬時,主要用於誘騙使用者或者管理員下載執行或者直接自動執行;

上傳檔案是WebShell時,攻擊者可通過這些網頁後門執行命令並控制伺服器;

上傳檔案是其他惡意指令碼時,攻擊者可直接執行指令碼進行攻擊;

上傳檔案是惡意圖片時,圖片中可能包含了指令碼,載入或者點選這些圖片時指令碼會悄無聲息的執行;

上傳檔案是偽裝成正常字尾的惡意指令碼時,攻擊者可藉助本地檔案包含漏洞(Local File Include)執行該檔案。如將bad.php檔案改名為bad.doc上傳到伺服器,再通過PHP的include,include_once,require,require_once等函數包含執行。

此處造成惡意檔案上傳的原因主要有三種:

檔案上傳時檢查不嚴。沒有進行檔案格式檢查。一些應用僅僅在使用者端進行了檢查,而在專業的攻擊者眼裡幾乎所有的使用者端檢查都等於沒有檢查,攻擊者可以通過NC,Fiddler等斷點上傳工具輕鬆繞過使用者端的檢查。一些應用雖然在伺服器端進行了黑名單檢查,但是卻可能忽略了大小寫,如將.php改為.Php即可繞過檢查;一些應用雖然在伺服器端進行了白名單檢查卻忽略了%00截斷符,如應用本來只允許上傳jpg圖片,那麼可以構造檔名為xxx.php%00.jpg,其中%00為十六進位制的0x00字元,.jpg騙過了應用的上傳檔案型別檢測,但對於伺服器來說,因為%00字元截斷的關係,最終上傳的檔案變成了xxx.php。

檔案上傳後修改檔名時處理不當。一些應用在伺服器端進行了完整的黑名單和白名單過濾,在修改已上傳檔案檔名時卻百密一疏,允許使用者修改檔案字尾。如應用只能上傳.doc檔案時攻擊者可以先將.php檔案字尾修改為.doc,成功上傳後在修改檔名時將字尾改回.php。

使用第三方外掛時引入。好多應用都參照了帶有檔案上傳功能的第三方外掛,這些外掛的檔案上傳功能實現上可能有漏洞,攻擊者可通過這些漏洞進行檔案上傳攻擊。如著名的部落格平臺WordPress就有豐富的外掛,而這些外掛中每年都會被挖掘出大量的檔案上傳漏洞。

敏感資訊洩露

JavaScript作為一種相當簡單但功能強大的使用者端指令碼語言,本質是一種直譯語言。所以,其執行原理是邊解釋邊執行。上述特性就決定了JavaScript與一些伺服器指令碼語言(如ASP、PHP)以及編譯型語言(如C、C++)不同,其原始碼可以輕鬆被任何人獲取到。一些粗心的開發者將各式敏感資訊儲存在JavaScript指令碼中,由於JS的特性,攻擊者可以對這些資訊一覽無餘,從而導致對WEB服務和使用者隱私造成不同程度的威脅。

目錄遍歷

一. 什麼是目錄遍歷漏洞
目錄遍歷(路徑遍歷)是由於web伺服器或者web應用程式對使用者輸入的檔名稱的安全性驗證不足而導致的一種安全漏洞,使得攻擊者通過利用一些特殊字元就可以繞過伺服器的安全限制,存取任意的檔案(可以使web根目錄以外的檔案),甚至執行系統命令。

二. 目錄遍歷漏洞原理
程式在實現上沒有充分過濾使用者輸入的…/之類的目錄跳轉符,導致惡意使用者可以通過提交目錄跳轉來遍歷伺服器上的任意檔案。

三. 目錄遍歷漏洞範例
讀取檔案的url:
http://www.test.com/my.jsp?file=abc.html

惡意url:
http://www.test.com/my.jsp?file=…/…/Windows.system.ini

四. 目錄遍歷漏洞的防禦
1.對使用者的輸入進行驗證,特別是路徑替代字元「…/」

2.儘可能採用白名單的形式,驗證所有輸入

3.合理設定web伺服器的目錄許可權

4.程式出錯時,不要顯示內部相關細節

五.出現場景
出現在檔案讀取或者展示圖片等對檔案讀取互動的功能塊。

總結:對照著一個個的點,我發現許多問題在我目前專案中都存在,說明對於web安全這塊我們還有許多工作要做,這可能也是目前許多中小型網際網路公司專案的弊端,還不夠注重安全這一塊。希望在接下來的工作中我可以和團隊一起完善安全這一塊。