1. 程式人生 > >從零學習安全測試,從XSS漏洞攻擊和防禦開始

從零學習安全測試,從XSS漏洞攻擊和防禦開始

WeTest 導讀

本篇包含了XSS漏洞攻擊及防禦詳細介紹,包括漏洞基礎、XSS基礎、編碼基礎、XSS Payload、XSS攻擊防禦。

第一部分:漏洞攻防基礎知識

XSS屬於漏洞攻防,我們要研究它就要了解這個領域的一些行話,這樣才好溝通交流。同時我建立了一個簡易的攻擊模型用於XSS漏洞學習。

1. 漏洞術語

瞭解一些簡單術語就好。

VUL

Vulnerability漏洞,指能對系統造成損壞或能借之攻擊系統的Bug。

POC

Proof of Concept,漏洞證明;可以是可以證明漏洞存在的文字描述和截圖,但更多的一般是證明漏洞存在的程式碼;一般不會破壞存在漏洞的系統。

EXP

exploit,漏洞利用;利用漏洞攻擊系統的程式碼。

Payload

(有效攻擊負載)是包含在你用於一次漏洞利用(exploit)中的攻擊程式碼。

PWN

是一個黑客語法的俚語詞 ,是指攻破裝置或者系統。

0DAY漏洞和0DAY攻擊

零日漏洞或零時差漏洞(Zero-dayexploit)通常是指還沒有補丁的安全漏洞。

零日攻擊或零時差攻擊(Zero-dayattack)則是指利用這種漏洞進行的攻擊。

零日漏洞不但是黑客的最愛,掌握多少零日漏洞也成為評價黑客技術水平的一個重要引數。

CVE漏洞編號

Common Vulnerabilities and Exposures,公共漏洞和暴露,為廣泛認同的資訊保安漏洞或者已經暴露出來的弱點給出一個公共的名稱。

可以在https://cve.mitre.org/網站根據漏洞的CVE編號搜尋該漏洞的介紹。也可以在中文社群http://www.scap.org.cn/上搜索關於漏洞的介紹

2. 漏洞攻擊模型

上圖為一個簡單的攻擊模型。攻擊就是將Payload通過注入點注入到執行點執行的過程。過程順暢就表明這個漏洞被利用了。

第二部分:XSS基礎知識

基礎知識看完,現在我們可以開始接觸瞭解XSS基礎了。XSS基礎不好就不用研究了,大家沒用共同語言。

1. 什麼是XSS?

XSS全稱Cross-site scripting,跨站指令碼攻擊。攻擊者通過網站注入點注入惡意客戶端可執行解析的Payload,當被攻擊者訪問網站時Payload通過客戶端執行點執行來達到某些目的,比如獲取使用者許可權、惡意傳播、釣魚等行為。

2. XSS的分類

不瞭解分類其實很難學好XSS,大家對XSS分類有很多誤解,而且很多文章上都解釋錯的,這裡我給出一個相對好的XSS分類。

2.1 按照Payload來源劃分

儲存型XSS

Payload永久存在伺服器上,所以也叫永久型XSS,當瀏覽器請求資料時,包含Payload的資料從伺服器上傳回並執行。

過程如圖:

儲存型XSS例子:

發表帖子內容包含Payload->存入資料庫->被攻擊者訪問包含該帖子的頁面Payload被執行

反射型XSS

又稱非持久型XSS,第一種情況:Payload來源在客戶端然後在客戶端直接執行。第二種情況:客戶端傳給服務端的臨時資料,直接回顯到客戶端執行。

過程如圖:

反射型XSS例子 :

1. 傳播一個連結,這個連結引數中包含Payload->被攻擊者訪問這個連結Payload在客戶端被執行。

2. 在客戶端搜尋框輸入包含payload的內容->服務端回顯一個頁面提示搜尋內容未找到,payload就被執行了。

2.2 按照Payload的位置劃分

DOM-based XSS

由客戶端JavaScript程式碼操作DOM或者BOM造成Payload執行的漏洞。由於主要是操作DOM造成的Payload執行,所以叫做DOM-based XSS,操作BOM同樣也可以造成Payload執行,所以這個名詞有些不準確,其實叫JavaScript-based XSS更好。

DOM-based的Payload不在html程式碼中所以給自動化漏洞檢測帶來了困難。

過程如圖:

反射型DOM-based XSS的例子:

在客戶端搜尋框輸入包含payload的內容->服務端回顯一個頁面提示搜尋內容未找到,payload就被執行了。

儲存型DOM-based XSS的例子:

從服務端介面中獲取包含Payload的內容->JavaScript通過操作DOM、BOM造成Payload執行

HTML-based XSS

Payload包含在服務端返回的HTML中,在瀏覽器解析HTML的時候執行。這樣的漏洞易於做自動化漏洞檢測,因為Payload就在HTML裡面。當然HTML-based XSS也有反射型和儲存型的。

過程如圖:

反射型HTML-based XSS的例子:

在客戶端搜尋框輸入包含payload的內容->服務端回顯一個頁面提示搜尋內容未找到,payload包含在HTML被執行。

儲存型HTML-based XSS的例子:

發表帖子內容包含Payload->存入資料庫->被攻擊者訪問包含該帖子的頁面Payload在HTML頁面中被執行

3. XSS的攻擊目的及危害

很多寫出不安全程式碼的人都是對漏洞的危害沒有清晰的認識,下圖是2017 OWASP 網路威脅Top10:

可以看到XSS在網路威脅中的地位舉足輕重。

3.1 目的

1. cookie劫持

2. 篡改網頁,進行釣魚或者惡意傳播

3. 網站重定向

4. 獲取使用者資訊

3.2 危害

1. 傳播類危害

2. 系統安全威脅

第三部分:XSS攻擊的Payload

這部分我們分析下攻擊模型中的Payload,瞭解Payload必須瞭解編碼,學習好JS也必須要了解好編碼。要想真正做好網路安全編碼是最基本的。

1. 編碼基礎

編碼部分是最重要的雖然枯燥但必須要會。後面很多變形的Payload都建立在你的編碼基礎。這裡通16進位制編碼工具讓你徹底學會編碼。

1.1 編碼工具

16進位制檢視器:方便檢視檔案16進位制編碼

MAC:HEx Friend

windows: HxD

編輯器Sublime:可以通過Sublime將檔案儲存不同編碼型別

1.2 ASCII

定義:美國資訊交換標準程式碼,是基於拉丁字母的一套計算機編碼系統,主要用於顯示現代英語和其他西歐語言。

編碼方式:屬於單子節編碼。ASCII碼一共規定了128個字元的編碼,只佔用了一個位元組的後面7位,最前面的1位統一規定為0。0~31及127(共33個)是控制字元或通訊專用字元。32~126(共95個)是字元(32是空格。

1.3 ISO-8859-1(Latin1)

定義:Latin1是ISO-8859-1的別名,ISO-8859-1收錄的字元除ASCII收錄的字元外,還包括西歐語言、希臘語、泰語、阿拉伯語、希伯來語對應的文字元號。歐元符號出現的比較晚,沒有被收錄在ISO-8859-1當中。

編碼方式:ISO-8859-1編碼是單位元組編碼,向下相容ASCII,其編碼範圍是0x00-0xFF,0x00-0x7F之間完全和ASCII一致,0x80-0x9F之間是控制字元,0xA0-0xFF之間是文字元號。

注意:ISO-8859-1編碼表示的字元範圍很窄,無法表示中文字元。但是,由於是單位元組編碼,和計算機最基礎的表示單位一致,所以很多時候,仍舊使用ISO-8859-1編碼來表示。比如,雖然”中文”兩個字不存在iso8859-1編碼,以gb2312編碼為例,應該是”d6d0 cec4”兩個字元,使用iso8859-1編碼的時候則將它拆開為4個位元組來表示:”d6 d0 ce c4”(事實上,在進行儲存的時候,也是以位元組為單位處理的)。所以mysql中latin1可以表示任何編碼的字元。

Latin1與ASCII編碼的關係:完全相容ASCII。

1.4 Unicode編碼(UCS-2)

Code Point: 碼點,簡單理解就是字元的數字表示。一個字符集一般可以用一張或多張由多個行和多個列所構成的二維表來表示。二維表中行與列交叉的點稱之為碼點,每個碼點分配一個唯一的編號,稱之為碼點值或碼點編號。

BOM(Byte Order Mark):位元組序,出現在檔案頭部,表示位元組的順序,第一個位元組在前,就是”大端方式”(Big-Endian),第二個位元組在前就是”小端方式”(Little-Endian)。

在Unicode字符集中有一個叫做”ZERO WIDTH NO-BREAK SPACE“的字元,它的碼點是FEFF。而FFFE在Unicode中是不存在的字元,所以不應該出現在實際傳輸中。在傳輸位元組流前,我們可以傳字元”ZERO WIDTH NO-BREAK SPACE“表示大小端,因此字元”ZERO WIDTH NO-BREAK SPACE“又被稱作BOM。

BOM還可以用來表示文字編碼方式,Windows就是使用BOM來標記文字檔案的編碼方式的。Mac上檔案有沒有BOM都可以。

例如:\u00FF :00是第一個位元組,FF是第二個位元組。和碼點表示方式一樣屬於大端方式。

Unicode編碼字符集:旨在收集全球所有的字元,為每個字元分配唯一的字元編號即程式碼點(Code Point),用 U+緊跟著十六進位制數表示。所有字元按照使用上的頻繁度劃分為 17 個平面(編號為 0-16),即基本的多語言平面和增補平面。基本的多語言平面又稱平面 0,收集了使用最廣泛的字元,程式碼點從 U+0000 到 U+FFFF,每個平面有 216=65536 個碼點;

Unicode編碼:Unicode 字符集中的字元可以有多種不同的編碼方式,如 UTF-8、UTF-16、UTF-32、壓縮轉換等。我們通常所說的Unicode編碼是UCS-2 將字元編號(同 Unicode 中的碼點)直接對映為字元編碼,亦即字元編號就是字元編碼,中間沒有經過特別的編碼演算法轉換。是定長雙位元組編碼:因為我們UCS-2只包括本的多語言平面(U+0000 到 U+FFFF)。

UCS-2的BOM:大端模式:FEFF。小端模式:FFFE。

檔案儲存成UTF-16 BE with BOM相當於UCS-2的大端模式,可以看到16進位制開頭為FEFF

Latin1與Unicode編碼的關係:Latin1對應於Unicode的前256個碼位。

1.5 UTF-16

定義及編碼:UTF-16是Unicode的其中一個使用方式,在Unicode基本多文種平面定義的字元(無論是拉丁字母、漢字或其他文字或符號),一律使用2位元組儲存。而在輔助平面定義的字元,會以代理對(surrogate pair)的形式,以兩個2位元組的值來儲存。是雙位元組編碼。

UTF-16與UCS-2的關係:UTF-16可看成是UCS-2的父集。在沒有輔助平面字元(surrogate code points)前,UTF-16與UCS-2所指的是同一的意思。但當引入輔助平面字元後,就稱為UTF-16了。現在若有軟體聲稱自己支援UCS-2編碼,那其實是暗指它不能支援在UTF-16中超過2bytes的字集。對於小於0x10000的UCS碼,UTF-16編碼就等於UCS碼。

UTF-16的BOM:大端模式:FEFF。小端模式:FFFE。

1.6 UTF-8

定義及編碼:UTF-8就是在網際網路上使用最廣的一種Unicode的實現方式,這是為傳輸而設計的編碼,並使編碼無國界,這樣就可以顯示全世界上所有文化的字元了。UTF-8最大的一個特點,就是它是一種變長的編碼方式。它可以使用1~4個位元組表示一個符號,根據不同的符號而變化位元組長度,當字元在ASCII碼的範圍時,就用一個位元組表示,保留了ASCII字元一個位元組的編碼作為它的一部分,注意的是unicode一箇中文字元佔2個位元組,而UTF-8一箇中文字元佔3個位元組)。從unicode到utf-8並不是直接的對應,而是要過一些演算法和規則來轉換。

Unicode符號範圍

UTF-8編碼方式(十六進位制)

0000 0000-0000 007F

0xxxxxxx

0000 0080-0000 07FF

110xxxxx 10xxxxxx

0000 0800-0000 FFFF

相關推薦

學習安全測試XSS漏洞攻擊防禦開始

WeTest 導讀 本篇包含了XSS漏洞攻擊及防禦詳細介紹,包括漏洞基礎、XSS基礎、編碼基礎、XSS Payload、XSS攻擊防禦。 第一部分:漏洞攻防基礎知識 XSS屬於漏洞攻防,我們要研究它就要了解這個領域的一些行話,這樣才好溝通交流。同時我建立了一個簡易的攻擊模型用於XSS漏洞學習。 1

學習人工智慧開啟職業規劃之路!

####作者介紹 零壹,資深演算法工程師,目前擔任 AI 醫療專案技術負責人,CSDN 專家。前供求世界網路科技運營總監、數學碩士,數十次獲得建模獎項,全國研究生數學建模競賽一等獎得主,熱衷分享。個人微訊號:huangtaonide、微信公眾號:R-data、還

學習freemarker(2)給模板傳遞引數的測試

原文:http://www.java2000.net/p7841程式程式碼  package freemarker;import java.io.File;import java.io.FileOutp

學習selenium2(WebDriver)自動化測試系列視訊課程-任健勇-專題視訊課程

從零學習selenium2(WebDriver)自動化測試系列視訊課程—10183人已學習 課程介紹        通過案例講解及其演示,掌握使用java語言開發測試指令碼的技術,包括資料驅動指令碼、關鍵字驅動指令碼等,如何對自動化測試指令碼進行有效管理和維護; 讓學員正確地

手牽手學習Vue原始碼 系列二(變化偵測篇)

系列文章: 手牽手,從零學習Vue原始碼 系列一(前言-目錄篇) 手牽手,從零學習Vue原始碼 系列二(變化偵測篇) 陸續更新中... 預計八月中旬更新完畢。 1 概述 Vue最大的特點之一就是資料驅動檢視,那麼什麼是資料驅動檢視呢? 其實,我們可以把資料理解為狀態,而檢視就是使用者可直觀看到頁面。頁面不可

cocos2dx 3.1學習(二)——菜單、場景切換、場景傳值

天空 ptr select 特效 new 要點 綁定 使用 water 回想一下上一篇的內容,我們已經學會了創建一個新的場景scene,加入sprite和label到層中。掌握了定時事件schedule。我們能夠順利的寫出打飛機的主場景框架。 上一篇的內容我練習了七個新

學習哈希長度擴展攻擊

之前 轉化 等於 哈希 添加 計算 消息摘要 table register 哈希長度擴展攻擊,利用了md5、sha1等加密算法的缺陷,可以在不知道原始密鑰的情況下來進行計算出一個對應的hash值。 引言 最開始出現好像是在PCTF2014上最近做題突然看見了先來看下代碼

學習openCV】IOS7下的openCV開發起步(Xcode5.1.1&openCV2.49)

rgb load fcm 12px 轉換 sim 圖像 round ios 前言: 開發IOS7已經有一月的時間了。近期在準備推研的事,有點想往CV方向發展。於是開始自學openCV。 關註CSDN已經非常久了。也從非常多博主那學到了非常多知識,於是我也從這周開

優秀開源軟件學習系列(一)——學習Spring4以及學習方法分享

文檔 軟件 準備 相關性 培訓 獎勵 在哪裏 方式 列表 一、目的1.掌握Spring4怎樣使用,以便將這個框架作為自己的一項技能。2.掌握Spring官網是怎樣介紹其產品的,在心中對Spring有最官方的、最直觀的了解。在Spring的相關領域,能夠知道怎麽下載Sprin

如何學習 React 技術棧

教授 新人 註冊 將不 hat 前端 案例 產品 代碼   達人課是GitChat的一款輕閱讀產品,由特約講師獨家發布。每一個課程你都可獲得6-12篇的深度文章,同時可在讀者圈與講師互動交流。GitChat達人課,讓技術分享更簡單。    如何從零學習 React 技術棧 

如何學習python?

學習python最近學習Python語言的夥伴越來越多,對於很多Python初學者來說,如何快速高效的學好Python是其現階段最關心的問題,以下是相應的學習建議!1. 明確目標很多人在學習Python之前很少想這個,更多是因為Python很火才學習的,除了這個目標,我們可以定一個更加具有吸引力的目標,比如,

Python3學習(七)

import json data = {'no' : 1, 'name' : 'Runoob', 'url' : 'https://www.baidu.com' } json_str = json.dumps(data) print("JSON

Python3學習(六)

# -*- coding:utf-8 -*- year =int(input("請輸入一個年份:")) if (year % 4) == 0: if (year % 100) == 0: if (year % 400) == 0: print

Python3學習(五)

# -*- coding:utf-8 -*- #輸出與輸入 # Python兩種輸出值的方式: 表示式語句和 print() 函式。 # 第三種方式是使用檔案物件的 write() 方法,標準輸出檔案可以用 sys.stdout 引用。 # 如果你希望輸出的形式更加多樣,可以使用 str.fo

Python3學習(四)

#def關鍵字 def hello(): print("Hello") return hello() def arae(width, height): return width * height print(arae(3, 3)) def changelis

Python3學習(三)

#條件控制 #if語句 t = 'true' f = 'false' var = 100 if var: print(t) print(var) age = int(input("請輸出數字")) if age < 0: print('<0') el

Python3學習(二)

# -*- coding: utf-8 -*- #數字型別轉換 a = 1.0 print(int(a)) a = 1 print(float(a)) #complex(x) 將x轉換到一個複數,實數部分為 x,虛數部分為 0。 a = 1.1 print(complex(a)) #com

Python3學習(一)

# python 3.+ # -*- coding: utf-8 -*- #檢視版本號python -V #列印 print("Hello Python") #等待使用者輸入 input("請按下回車鍵") #同一行顯示多條語句 import sys;x = '同一行顯示多條語句';sy

大資料技術學習路線有信心能堅持學習的朋友現在開始

如果你看完有信心能堅持學習的話,那就當下開始行動吧! 一、大資料技術基礎 1、linux操作基礎 linux系統簡介與安裝 linux常用命令–檔案操作 linux常用命令–使用者管理與許可權 linux常用命令–系統管理 linux常用命令–免密登陸

大資料技術學習路線有信心能堅持學習的朋友現在開始學習

      大資料技術前景我們是毋庸置疑的,而對於學習更是爭先恐後。在這些人中,不乏有已經在it圈混跡好幾年的程式設計師,自然也有初出茅廬的零基礎小白。說實話,大資料不比程式設計學習,還是需要一定的基礎的,那些說根本不需要基礎的人,你出來,保證不打死你