本文由葡萄城技術團隊於原創並首發javascript
轉載請註明出處:葡萄城官網,葡萄城爲開發者提供專業的開發工具、解決方案和服務,賦能開發者。php
在昨天的公開課中,因爲參與的小夥伴們積極性和熱情很是高,咱們的講師Carl(陳慶)把原定第二講的大部分也一併獻出了,因此原定三場的公開課也變爲了兩場,本系列的公開課生動有趣、乾貨滿滿、受衆普遍,因此沒有參與上次課程的小夥伴們此次請不要忘記了,本期公開課,咱們將着重介紹OWASP Top 10(10項最嚴重的Web應用程序安全風險預警)及其應對策略。公開課地址:http://live.vhall.com/137416596html
《OWASP Top 10》的目的在於爲廣大企業肯定一組最嚴重的風險項目。對於其中的每一項風險,咱們將使用基於OWASP風險等級排序的評級方案,爲您提供關於漏洞廣泛性、可檢測性、業務/技術影響等信息。前端
將不受信任的數據做爲命令或查詢的一部分發送到解析器時,會產生諸如SQL注入、NoSQL注入、OS注入和LDAP注入等注入缺陷。攻擊者的惡意數據能夠誘使解析器在沒有適當受權的狀況下執行非預期命令或訪問數據。java
可利用性:容易正則表達式
幾乎任何數據源都能成爲注入載體,包括環境變量、全部類型的用戶、參數、外部和內部Web服務。當攻擊者能夠向解釋器發送惡意數據時,注入漏洞即可產生。算法
廣泛性:常見數據庫
注入漏洞十分廣泛,尤爲是在遺留代碼中。注入漏洞一般能在SQL、LDAP、XPath或是NoSQL查詢語句、OS命令、XML解析器、SMTP包頭、表達式語句及ORM查詢語句中找到。編程
可檢測性:易後端
注入漏洞很容易經過代碼審查發現。掃描器和模糊測試工具能夠幫助攻擊者找到這些漏洞。
技術影響:嚴重
注入能致使數據丟失、破壞或泄露給無受權方、缺少可審計性或是拒絕服務。注入有時甚至能致使主機被徹底接管。
業務影響:未知
您的應用和數據須要受到保護,以免對業務形成影響。
當您的應用有以下狀況時,是脆弱且易受到攻擊的:
一些常見的注入,包括:SQL、OS命令、ORM、LDAP和表達式語言(EL)或OGNL注入。
全部編譯器的原理都是類似的,所以 Code Review是目前爲止最有效的檢測應用程序注入風險的辦法之一。固然,您也能夠對代碼中全部參數、字段、頭、cookie、JSON和XML數據輸入進行DAST掃描,並將SAST和DAST工具添加到CI/CD進程中,以便在項目部署前對現有代碼或新代碼進行注入檢測。
防止注入漏洞須要將數據與命令語句、查詢語句分隔開來:
1 2 3 4 5 6 7 8 9 10 11 |
|
在這兩個案例中,攻擊者在瀏覽器中將「id」參數的值修改爲: ’or’1’=’1。例如:
http://example.com/app/accountView?id=' or '1'='1
這樣查詢語句的意義就變成了從accounts表中返回全部記錄。
SQL盲注,就是在SQL語句注入後且成功執行時,執行的結果不能回顯到前端頁面。此時,咱們須要利用一些方法進行判斷或者嘗試,這個過程稱之爲盲注。
盲注通常分爲三類:
1、基於布爾的盲注
基於布爾的盲注一般使用邏輯判斷推測獲取的數據,經過給定條件,服務器返回真或假。使用二分法或者正則表達式等方法便可縮小判斷的範圍。
2、基於時間的盲注
主要是利用延時或者執行的時間來判斷。
If(ascii(substr(database(),1,1))>115,0,sleep(5))%23 //if 判斷語句,條件爲假,執行 sleep
由於延時會受到網絡環境的影響,所以這種方法不是很可靠。
3、基於報錯的盲注
構造payload讓信息經過錯誤提示顯示。
count(*)和rand(0)和group by報錯
rand(0)是僞隨機數列,01101100。產生報錯的緣由是由於rand(0)並非一個定值,至關於一個變量。使用group by時,會創建一張虛擬表,字段爲key和count(*)。執行插入操做,第一次返回0,但虛擬表中沒有這個項,數據庫會認爲須要插入這個項,但數據庫並無記錄下來,所以,會再次執行rand(0) 試圖獲取,但此時獲取的是第二個數。依次類推,當數據庫查詢發現0這個項不存在,執行插入操做時, rand(0)返回值爲1,可是1已經存在,這時插入已經存在的項就會報錯。
之因此要談到WAF的常見特徵,是爲了更好的瞭解WAF的運行機制,以便增長繞過WAF的機會。整體來講,WAF(Web Application Firewall)具備如下四個方面的功能:
WAF過濾機制:
繞過WAF的方法:
從目前能找到的資料來看,繞過WAF的技術主要分爲9類,包含:
經過錯誤地使用Web應用程序的身份認證和會話管理功能,攻擊者可以破譯密碼、密鑰和會話令牌,或者利用其它開發缺陷來暫時性或永久性地冒充管理員的身份。
可利用性:容易
攻擊者能夠輕鬆獲取數百萬條有效用戶名和密碼組合,包括證書、默認的帳戶管理列表、自動的暴力破解和字典攻擊工具,以及高級的GPU破解工具。會話管理能夠很容易地被利用,尤爲是沒有過時的會話密匙。
廣泛性:常見
大多數管理系統的設計和實現,都存在身份認證失效的問題。會話管理是身份驗證和訪問控制的基礎,而且存在於整個應用程序的進程中。
可檢測性:通常
攻擊者一般使用指南手冊來檢測失效的身份驗證。除此以外,也會關注密碼轉儲、字典攻擊,或者在相似釣魚、社會工程攻擊後,發現失效的身份認證。
技術影響:嚴重
攻擊者只需訪問幾個帳戶,或者一個管理員帳戶就能夠破壞咱們的系統。根據應用程序業務場景的不一樣,可能會致使洗錢、欺詐、用戶身份盜竊、泄露法律保護的敏感信息等嚴重違法行爲。
確認用戶身份、身份驗證和會話管理很是重要,這些措施可用於將惡意的、未經身份驗證的攻擊者與受權用戶進行分離。若是您的應用程序存在以下問題,那麼可能存在身份驗證失效漏洞:
場景#1:最多見的攻擊方式——憑證填充,使用已知密碼的列表。若是應用程序不限制身份驗證嘗試次數,則能夠將應用程序用做密碼oracle, 以肯定憑證是否有效。
場景#2:大多數身份驗證攻擊都是因爲密碼做爲惟一的認證因素。
場景#3:應用會話超時設置不正確。用戶使用公共計算機訪問應用程序時,直接關閉瀏覽器選項卡就離開,而不是選擇「註銷」。
撞庫,是黑客經過收集互聯網已泄露的用戶和密碼信息,生成對應的字典表,嘗試批量登錄其餘網站後,獲得一系列能夠登陸的用戶。不少用戶在不一樣網站使用的是相同的帳號和密碼,所以黑客能夠經過獲取用戶在A網站的帳戶從而嘗試登陸B網站,這就是撞庫攻擊。
撞庫能夠經過數據庫安全防禦技術解決,數據庫安全技術包括:數據庫漏掃、數據庫加密、數據庫防火牆、數據脫敏、數據庫安全審計系統。
撞庫並不神祕,事實上,它正被普遍的使用。舉例而言,根據Shape Security的報告,「攻擊者們一旦鎖定了一個財富100強的B2C(企業對消費者)網站,就會在一個星期內使用遍及世界各地的代理服務器,對其進行超過五百萬次登陸嘗試。」 雪上加霜的是,被竊取的憑證也並不難找。黑客們會爲了找樂子或尋求揚名立萬的機會把憑證散播到網上。當黑客們在憑證黑市(好比Cracking-dot-org、 Crackingking-dot-org以及 Crackingseal-dot-io)作生意時,這些名聲會派上大用場。
多因素驗證(Multi-factor authentication,縮寫爲 MFA),又譯多因子認證、多因素認證,是一種計算機訪問控制的方法,用戶要經過兩種以上的認證機制以後,才能獲得受權,使用計算機資源。例如,用戶要輸入PIN碼,插入銀行卡,最後再經指紋比對,經過這三種認證方式,才能得到受權。這種認證方式能夠提升安全性。
許多Web應用程序和API都沒法正確保護敏感數據,例如:財務數據、醫療數據和PII數據。攻擊者能夠經過竊取或修改未加密的數據來實施信用卡詐騙、身份盜竊或其餘犯罪行爲。未加密的敏感數據容易受到破壞,所以,咱們須要對敏感數據加密,這些數據包括:傳輸過程當中的數據、存儲的數據以及瀏覽器的交互數據。
可利用性:通常
攻擊者並不是直接攻擊,而是在傳輸過程當中、從客戶端(例如:瀏覽器)竊取密鑰、發起中間人攻擊,或從服務器端直接竊取明文數據。
廣泛性:普遍
這是最多見,也是最具影響力的攻擊手段。在數據加密的過程當中,因爲不安全的密鑰生成、管理以及使用弱加密算法、弱協議和弱密碼(未加鹽的哈希算法或弱哈希算法),致使數據泄露事件頻發。
可檢測性:通常
在服務器端,檢測傳輸過程當中的數據弱點很容易,但檢測存儲數據的弱點卻異常困難。
技術影響:嚴重
敏感數據泄露事件形成的影響是很是嚴重的,由於這些數據一般包含了不少我的信息(PII),例如:醫療記錄、認證憑證、我的隱私、信用卡信息等。這些信息受到相關法律和條例的保護,例如:歐盟《通用數據保護條例》(GDPR)和地方隱私保護法律。
首先你須要確認哪些數據(包含:傳輸過程當中的數據、存儲數據)是敏感數據。例如:密碼、信用卡卡號、醫療記錄、我的信息等,這些數據應該被加密,請Review:
對一些須要加密的敏感數據,應該作到如下幾點:
10. 將工做因素(延遲因素)設置在可接受的範圍。
11. 單獨驗證每一個安全配置項的有效性。
場景 #1:假設一個應用程序使用自動化的數據加密系統加密了信用卡信息,並存儲在數據庫中,當數據被檢索時自動解密。這會致使SQL注入漏洞可以以明文形式得到全部信用卡卡號。
場景 #2:一個網站上沒有使用或強制使用TLS,或者僅使用弱加密算法。攻擊者經過監測網絡流量(如:不安全的無線網絡),將網絡鏈接從HTTPS降級到HTTP,就能夠截取請求並竊取用戶會話 cookie。而後,攻擊者能夠複製用戶cookie併成功劫持通過認證的用戶會話、訪問或修改用戶我的信息。除此以外,攻擊者還能夠更改全部傳輸過程當中的數據,如:轉款的接收者。
場景 #3:密碼數據庫使用未加鹽的哈希算法或弱哈希算法去存儲密碼,此時,一個文件上傳漏洞可以使黑客可以獲取密碼文件,而這些未加鹽的哈希密碼經過彩虹表暴力破解方式便可快速破解。
日本我的信息保護法
近年來,因信息、通訊技術的發展,企業須要收集大量我的信息,用以提供準確且迅速的服務。我的信息的利用,不管是對現今的商業活動,仍是對國民生活都變得不可或缺。可是,另外一方面,因爲處理我的信息情況不當,致使我的權利和利益受到損害的可能性也在增大。在日本,包含企業和政府等團體的組織內部,泄露的我的信息數量累積超過了1000萬件。因而,鑑於規範處理我的信息,明確國家及地方公共團體的職責,確保我的信息有效利用等目的,日本於2005年4月1日起頒佈《我的信息保護法》。
歐盟《通用數據保護條例》(GDPR)
歐盟《通用數據保護條例》(General Data Protection Regulation,簡稱GDPR),其前身是歐盟在1995年制定的《計算機數據保護法》,該法明確規定:
數據安全防範的方法簡單來講,當數據從用戶鍵盤敲出的那一刻,到服務器後臺存儲過程當中,都需保持正確的姿式。如:
a) 低級錯誤:明文保存密碼
b) 低級錯誤:可逆加密密碼
c) 錯誤方法:md5 加密密碼
d) 正確方法:加鹽 hash 保存密碼
a) 驗證服務端的合法性
b) 確保通訊的安全
許多較早的或配置錯誤的XML處理器評估了XML文件中的外部實體引用。攻擊者能夠利用外部實體竊取使用URI文件處理器的內部文件和共享文件、監聽內部掃描端口、執行遠程代碼和實施拒絕服務攻擊。
可利用性:通常
若是攻擊者能夠上傳XML文檔或在XML文檔中添加惡意內容(如,易受攻擊的代碼、依賴項或集成),他們就可以攻擊含有缺陷的XML處理器。
廣泛性:常見
通常來講,許多舊的XML處理器可以對外部實體、XML進程中被引用和評估的URI進行規範。SAST 工具能夠經過檢查依賴項和安全配置來發現XXE缺陷。DAST工具須要額外的手動步驟來檢測和利用XXE缺陷。
技術影響:嚴重
XXE缺陷可用於提取數據、執行遠程服務器請求、掃描內部系統、執行拒
絕服務攻擊和其餘攻擊。
應用程序,特別是基於XML的Web服務,可能在如下方面容易受到攻擊:
培訓開發人員的安全意識,是識別和減小XXE的關鍵,除此以外,還須要:
目前,已經有大量XXE缺陷被發現並公開,這些缺陷包括上傳可被接受的惡意XML文件、嵌入式設備的 XXE缺陷及深嵌套的依賴項等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
XML是用於標記電子文件使其具備結構性的標記語言,能夠用來標記數據、定義數據類型,是一種容許用戶對本身的標記語言進行定義的源語言。XML文檔結構包括XML聲明、DTD文檔類型定義(可選)、文檔元素。
圖片來自網絡
XML由3個部分構成,分別是:文檔類型定義(Document Type Definition,DTD),即XML的佈局語言;可擴展的樣式語言(Extensible Style Language,XSL),即XML的樣式表語言;以及可擴展連接語言(Extensible Link Language,XLL)。
XML 中的實體分爲如下五種:字符實體,命名實體,外部實體,參數實體,內部實體,普通實體和參數實體都分爲內部實體和外部實體兩種,外部實體定義須要加上 SYSTEM關鍵字,其內容是URL所指向的外部文件實際的內容。若是不加SYSTEM關鍵字,則爲內部實體,表示實體指代內容爲字符串。
XML外部實體表示外部文件的內容,用 SYSTEM 關鍵詞表示:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
在上面的代碼中, XML外部實體 ‘entityex’ 被賦予的值爲:file://etc/passwd。在解析XML文檔的過程當中,實體’entityex’的值會被替換爲URI(file://etc/passwd)內容值(也就是passwd文件的內容)。 關鍵字’SYSTEM’會告訴XML解析器,’entityex’實體的值將從其後的URI中讀取,並把讀取的內容替換entityex出現的地方。
假如 SYSTEM 後面的內容能夠被用戶控制,那麼用戶就能夠隨意替換爲其餘內容,從而讀取服務器本地文件(file:///etc/passwd)或者遠程文件(http://www.baidu.com/abc.txt)。
XXE注入(即XML External Entity, XML外部實體注入)。經過 XML 實體,」SYSTEM」關鍵詞致使 XML 解析器能夠從本地文件或者遠程 URI 中讀取數據。攻擊者能夠經過 XML 實體傳遞本身構造的惡意值,從而引導處理程序解析它。當引用外部實體時,攻擊者經過構造惡意內容,可讀取任意文件、執行系統命令、探測內網端口、攻擊內網網站等行爲。
最多見的XXE漏洞類型分爲如下三種:
既然XML能夠從外部讀取DTD文件,那咱們就天然地想到了若是將路徑換成另外一個文件的路徑,那麼服務器在解析這個XML的時候就會把那個文件的內容賦值給SYSTEM前面的根元素中,只要咱們在XML中讓前面的根元素的內容顯示出來,就能夠讀取那個文件的內容了。這就形成了一個任意文件讀取的漏洞。
假設咱們指向的是一個內網主機的端口呢?是否會給出錯誤信息,咱們是否是能夠從錯誤信息上來判斷內網主機這個端口是否開放,這就形成了一個內部端口被探測的問題。通常來講,服務器解析XML有兩種方式,一種是一次性將整個XML加載進內存中,進行解析;另外一種是一部分的、「流式」地加載、解析。若是咱們遞歸地調用XML定義,一次性調用巨量的定義,那麼服務器的內存就會被消耗完,形成了拒絕服務攻擊。
未對經過身份驗證的用戶實施恰當的訪問控制。攻擊者能夠利用這些缺陷,訪問未經受權的功能或數據,例如:訪問其餘用戶的帳戶、查看敏感文件、修改其餘用戶的數據、更改訪問權限等。
安全配置錯誤是最多見的安全問題,這一般是因爲不安全的默認配置、不完整的臨時配置、開源雲存儲、錯誤的 HTTP 標頭配置以及包含敏感信息的詳細錯誤信息所形成的。所以,咱們不只須要對全部的操做系統、框架、庫和應用程序進行安全配置,並且必須及時修補和升級它們。
當應用程序的新網頁中包含不受信任的、未經驗證或轉義的數據時,或者使用能夠建立 HTML或 JavaScript 的瀏覽器 API 更新現有網頁時,就會出現 XSS 缺陷。XSS 讓攻擊者可以在受害者的瀏覽器中執行腳本,並劫持用戶會話、破壞網站或將用戶重定向到惡意站點。
可利用性:容易
自動化工具可以檢測並利用全部的三種XSS形式,而且存放在便於攻擊者利用的漏洞中。
廣泛性:普遍
XSS是OWASP Top10中第二廣泛的安全問題,存在於近三分之二的應用程序中。
可檢測性:容易
自動化工具能發現XSS問題,尤爲是一些成熟的技術框架中,如:PHP、J2EE或JSP、ASP.NET等。
技術影響:中等
XSS對於反射和DOM的影響是中等的,而對於存儲的XSS,XSS的影響更爲嚴重,譬如在受到攻擊的瀏覽器上執行遠程代碼,如:竊取憑證和會話或傳遞惡意軟件等。
針對用戶的瀏覽器,存在三種XSS類型:
典型的XSS攻擊形成的結果包含:盜取Session、帳戶、繞過MFA、DIV替換、對用戶瀏覽器的攻擊(例如:惡意軟件下載、鍵盤記錄)以及其餘用戶側的攻擊。
防止XSS,須要將不可信的數據與動態的瀏覽器內容區分開:
場景#1:應用程序在下面的HTML代碼段構造中使用了未經驗證或轉義的不可信的數據源:
1 |
|
攻擊者在瀏覽器中修改「CC」 參數爲以下值:
1 |
|
這個攻擊會致使受害者的會話ID被髮送到攻擊者的網站,使得攻擊者可以劫持用戶當前會話。
內容安全策略 (CSP) 是一個額外的安全層,用於檢測並削弱某些特定類型的攻擊,包括跨站腳本 (XSS) 和數據注入攻擊等。不管是數據盜取、網站內容污染仍是惡意軟件,這些攻擊都是主要的手段。
CSP 被設計成徹底向後兼容(除CSP2 在向後兼容有明確說起的不一致外)。不支持CSP的瀏覽器也能與實現了CSP的服務器正常合做,反之亦然:不支持 CSP 的瀏覽器只會忽略它,如常運行,默認爲網頁內容使用標準的同源策略。若是網站不提供 CSP Header,瀏覽器將使用標準的同源策略。
爲使CSP可用, 你須要配置你的網絡服務器返回 Content-Security-Policy HTTP Header ( 有時你會看到一些關於X-Content-Security-Policy Header的提法, 那是舊版本,你無須再如此指定它)。
除此以外, <meta> 元素也能夠被用來配置該策略, 例如:
1 |
|
上下文敏感數據編碼(XSS編碼與繞過)
對於瞭解Web安全的朋友來講,都知道XSS這種漏洞,其危害性不用強調。通常對於該漏洞的防禦有兩個思路:一是過濾敏感字符,諸如【<,>,script,'】等,另外一種是對敏感字符進行html編碼,諸如php中的htmlspecialchars()函數。
通常狀況,正確實施這兩種方案之一就能夠有效防護XSS漏洞了。但其實也會有一些場景,即便實施了這兩種方案,攻擊者也能夠繞過防禦,致使XSS漏洞被利用。
場景一:XSS注入點在某個html標籤屬性中,代碼片斷以下:
能夠看到,這裏防禦措施採用的是方案一:過濾敏感字符。這裏若是輸入javascript:alert (11),是會被過濾掉的,輸出的內容會是:
場景二:XSS注入點在js標籤中,代碼片斷以下:
這裏採用的防禦措施是第二種,即便用php內置函數htmlspecialchars對敏感字符進行編碼。若是輸入正常的payload,如:<img src=1 onerror=alert(11)>,是不會有彈窗的,此時瀏覽器的輸出以下圖:
這裏的敏感字符< >,已經被html編碼了,最後在<div>標籤裏面輸出的時候,瀏覽器再使用html解碼將其原文顯示出來,可是並不會觸發js引擎,因此也就沒有彈窗。
下圖是js編碼後的payload:
不安全的反序列化會致使遠程代碼執行。即便反序列化缺陷不會致使遠程代碼執行,攻擊者也能夠利用它們來執行攻擊,包括:重播攻擊、注入攻擊和特權升級攻擊。
可利用性:難
對反序列化的利用很是困難。由於在不更改或調整底層可被利用代碼的狀況下,現成的反序列化漏洞很難被使用。
可檢測性:通常
有些工具能夠被用於發現反序列化缺陷,但常常須要人工幫助來驗證發現的問題。但願有關反序列化缺陷的廣泛性數據將隨着工具的開發而被更多的識別和解決。
技術影響:嚴重
反序列化缺陷的影響不能被低估。它們可能致使遠程代碼執行攻擊,這是可能發生的最嚴重的攻擊之一。
若是反序列化進攻者提供惡意代碼或者被篡改過的對象,將會使整個應用程序和API變的脆弱,這可能會致使如下兩種主要類型的攻擊:
在應用程序中,序列化可能被用於:
惟一安全的架構模式是:不接受來自不受信源的序列化對象,或使用只容許原始數據類型的序列化媒體。 若是上述均沒法實現,請考慮使用下面的方法:
場景 #1:一個React應用程序調用了一組Spring Boot微服務,爲了確保原有的代碼不變,解決方法是序列化用戶狀態,並在每次請求時來回傳遞。這時,攻擊者可利用「R00」Java對象簽名,並使用Java Serial Killer工具在應用服務器上得到遠程代碼執行。
場景 #2:一個PHP論壇使用PHP對象序列化來保存一個「超級」cookie。該cookie包含了用戶的ID、角色、密碼哈希和其餘狀態:
a:4:{i:0;i:132;i:1;s:7:"Mallory";i:2;s:4:"user"; i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
攻擊者能夠更改序列化對象以授予本身爲admin權限:
a:4:{i:0;i:1;i:1;s:5:"Alice";i:2;s:5:"admin"; i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
組件(例如:庫、框架和其餘軟件模塊)擁有和應用程序相同的權限。若是應用程序中含有已知漏洞的組件被攻擊者利用,可能會形成嚴重的數據丟失或服務器接管。同時,使用含有已知漏洞的組件和API會破壞應用程序的防護手段,形成各類攻擊併產生嚴重影響。
不足的日誌記錄和監控,以及事件響應缺失或無效的集成,使攻擊者可以進一步攻擊系統,並篡改、提取或銷燬數據。大多數缺陷研究顯示,缺陷被檢測出的時間超過200天,且一般經過外部檢測方檢測,而不是經過內部流程或監控檢測。
a) ZAP Tools
b) 靜態代碼分析
以上即是從本次公開課分享——「WebApp 安全風險與防禦(系列二)」中截取的部份內容,相信必定能對您的WebApp應用程序安全防禦有所幫助。