安裝dvwa靶場,DVWA(Damn Vulnerable Web Application)是一款比較著名的漏洞靶場,很多 Web 安全的初學者都會拿它來練習。DVWA 的專案開源地址為https://github.com/digininja/DVWA。一、透過docker安裝,拉取映象,啟動docker容器。
docker pull citizenstig/dvwadocker run -d --name dvwa --rm -p80:80 citizenstig/dvwa
二、在瀏覽器裡訪問機器IP點選Creat/Restart Database,建立資料庫
頁面跳轉到登入頁,登入密碼預設為admin/password
在“DVWA Security“中設定安全等級,即題目的難易程度,Impossible代表漏洞被修復的。
根據 HackerOne 漏洞獎勵平臺釋出的《The 2020 Hacker Report》統計報告,XSS 漏洞型別佔所有報告漏洞中的 23%,排名第一。
XSS(Cross Site Scripting) 漏洞,通常指的是使用者輸入資料未做有效過濾,攻擊者可以將惡意指令碼注入網站頁面中,達到執行惡意程式碼的目的。攻擊者只需要誘使受害者開啟特定的網址,就可以在受害者的瀏覽器中執行被注入的惡意程式碼,從而竊取使用者身份,執行一些敏感操作,或是進行其他的危害行為。我們先看下XSS(Cross Site Scripting)漏洞,種類分為1、反射型、2、儲存型1、反射型 XSS,獲取cookie,開啟DVWA這個XSS(Reflected)
我們在輸入框中輸入
分析下原因,首先是這個地方是存在反射性XSS漏洞的。這個輸入框的程式碼如下,含義是獲取輸入框的name的值。並且打印出來
我們看到當我們輸入name=這個值的時候,瀏覽器會把解析這個script標籤,然後彈出alert彈窗,彈窗的內容是和獲取cookie。
2、儲存型XSS,也叫持久型跨站指令碼,攻擊者把惡意程式碼存到伺服器上,只要誘導使用者訪問被插入惡意程式碼的頁面就可以觸發。這個一般存在於發表評論的地方,比如部落格、帖子。DVWA也有個儲存型XSS案例,案例的原理是將使用者輸入的資料直接儲存到資料庫,並輸出到頁面上,這個過程沒有做過濾,導致XSS漏洞。利用DVWA來演示,裡面有個選單XSS(Stored),這個form表單有兩個輸入框,一個是name,一個是message,擋在message裡輸入攻擊指令碼時。
<script>alert(document.cookie)</script>1
這個表單的原始碼如下,是獲取name和message的值存到資料庫中,然後,在輸出到頁面。
瀏覽器對輸出的這個script標籤內容進行了解析,然後彈出alert彈窗,獲取cookie。
XSS 漏洞挖掘人工測試日常收集一些 XSS cheat sheet,然後編號整理出來,用於日常測試用例;可以先一次性批次輸入測試,如果無效,再輸入一些特殊字元看過濾情況,根據返回資料作相應的調整測試。
自動測試針對XSS漏洞掃描有開源工具,XSStrike,開源地址(https://github.com/s0md3v/XSStrike),需要clone下程式碼,並且安裝python3,非常有利於自己新增 XSS payload,或者做二次開發。XSStrike 支援很多功能,比如 DOM XSS 掃描(基於正則掃描敏感函式,存在一定誤報)、WAF 檢測與繞過、爬蟲、HTML&JS 動態解析引擎驗證。常用的測試命令如下:
爬蟲整個網站進行 XSS 掃描:python3 xsstrike.py -u "http://testphp.vulnweb.com/" --crawl針對單個 URL 進行掃描:python3 xsstrike.py -u "http://ip/vulnerabilities/xss_r/"
因此,這裡再推薦另一款工具,叫 NoXSS(https://github.com/lwzSoviet/NoXss),,clone下程式碼,並且安裝python3,它的特點就是批次掃描速度快,而且告警展示效果比 XSStrike 好,但漏洞檢測能力不如 XSStrike,你可以把這兩款搭配著使用。NoXSS 的使用方法也很簡單,常用命令如下:
python start.py --url="http://localhost/vulnerabilities/XSS_r/?name=a"
防禦 XSS 攻擊做好過濾,如何過濾1、輸入檢查在測試 XSS 時,經常需要輸入一些特殊字元,所以在一開始直接做好輸入檢查有利於減少攻擊的可能性。我在協助業務修復漏洞的時候,經常推薦的方法就是白名單限制,比如引數是個整數值,那直接限制死即可,若不符合就拋異常。不要單純只想著過濾替換特殊字元,這很容易就被繞過了。
如果白名單範圍不好確定,我就會採用黑名單的方式,把常用的 XSS payload 特殊字元或字串做檢測,比如
<script>、javascript:、<、>、'、"、&、#。1
但是黑名單這種方式,有時結合業務場景,以及瀏覽器特性,就有可能找到繞過方法。
還有一定不要單純只在客戶端上做過濾,還要結合服務端做限制。若只是客戶端上做過濾,那麼抓包後修改資料重發就繞過了。
2、輸出檢查跨站漏洞的觸發關鍵點就在於輸出的位置,所以對輸出進行檢查尤為重要。我們要根據不同的位置採取不同的 XSS 防禦方案。
3、Httponly Cookie如果你在 Cookie 中設定了 HttpOnly 屬性,那 JavaScript 指令碼將無法讀取到 Cookie,這樣就能防止透過 XSS 竊取 Cookie,在一定程度上能夠減少 XSS 的攻擊範圍。透過google瀏覽器安裝EditThisCookie這個外掛可以檢視cookie,可以看下百度的加了HttpOnly
4、Content Security Policy內容安全策略(Content Security Policy,CSP)也是減少 XSS 攻擊的一種方式 ,是瀏覽器提供一種防禦機制。它採用的是白名單機制,告訴瀏覽器可以載入和執行哪些外部資源,這樣就能防止被一些第三方惡意指令碼注入執行。開啟 CSP 有兩種方式:(1)透過 HTTP 頭資訊的 Content-Security-Policy 的欄位:
Content-Security-Policy: script-src 'self'; object-src 'none';style-src cdn.example.org third-party.org; child-src https:
(2)透過網頁的標籤設定:
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.examp