一網打盡!每個程式猿都該瞭解的黑客技術大彙總
上面這個段子估計很多朋友都看過,程式設計師被黑過無數次,在其他人眼中,彷彿我們需要寫得了木馬,翻得了圍牆,修得了電腦,找得到資源,但凡是跟計算機沾點邊的,咱都得會才行。
段子歸段子,言歸正傳,對於咱們程式設計師來說,多多少少了解一些資訊保安的技術知識還是大有裨益的,不僅能瞭解一些計算機和網路的底層原理,也能反哺我們的開發工作,帶著安全思維程式設計,減少漏洞的產生。
本文內容:
- 網路安全
- SQL注入
- XSS攻擊
- CSRF攻擊
- DDoS攻擊
- DNS劫持
- TCP劫持
- 埠掃描技術
- 系統安全
- 棧溢位攻擊
- 整數溢位攻擊
- 空指標攻擊
- 釋放後使用攻擊
- HOOK
- 許可權提升
- 可信計算
- 密碼學
- 對稱加密 & 非對稱加密
- 祕鑰交換技術
- 資訊摘要演算法
- 資料編碼技術
- 多因子認證技術
資訊保安大體可分為三個大的分支:
- 網路安全
- 系統安全
- 密碼學
下面軒轅君就這三個領域分別羅列一些常用的黑客技術,部分技術是存在領域交叉的,就將其劃入主要那個類別裡去了。
網路安全
SQL注入
Web安全三板斧之首,大名鼎鼎的SQL注入。
SQL注入攻擊的核心在於讓Web伺服器執行攻擊者期望的SQL語句,以便得到資料庫中的感興趣的資料或對資料庫進行讀取、修改、刪除、插入等操作,達到其邪惡的目的。
而如何讓Web伺服器執行攻擊者的SQL語句呢?SQL注入的常規套路在於將SQL語句放置於Form表單或請求引數之中提交到後端伺服器,後端伺服器如果未做輸入安全校驗,直接將變數取出進行資料庫查詢,則極易中招。
舉例如下:
對於一個根據使用者ID獲取使用者資訊的介面,後端的SQL語句一般是這樣:
select name,[...] from t_user where id=$id
其中,$id
就是前端提交的使用者id,而如果前端的請求是這樣:
GET xx/userinfo?id=1%20or%201=1
其中請求引數id轉義後就是1 or 1=1
,如果後端不做安全過濾直接提交資料庫查詢,SQL語句就變成了:
select name,[...] from t_user where id=1 or 1=1
其結果是把使用者表中的所有資料全部查出,達到了黑客洩露資料的目的。
以上只是一個極簡單的示例,在真實的SQL注入攻擊中引數構造和SQL語句遠比這複雜得多,不過原理是一致的。
防禦手段
:對輸入進行檢測,阻斷帶有SQL語句特徵對輸入
重點關注
:前端工程師、Web後端工程師
XSS攻擊
Web安全三板斧之二,全稱跨站指令碼攻擊(Cross Site Scripting),為了與重疊樣式表CSS區分,換了另一個縮寫XSS。
XSS攻擊的核心是將可執行的前端指令碼程式碼(一般為JavaScript)植入到網頁中,聽起來比較拗口,用大白話說就是攻擊者想讓你的瀏覽器執行他寫的JS程式碼。那如何辦到呢?一般XSS分為兩種:
反射型
1、攻擊者將JS程式碼作為請求引數放置URL中,誘導使用者點選
示例:
http://localhost:8080/test?name=<script>alert("you are under attack!")</script>
2、使用者點選後,該JS作為請求引數傳給Web伺服器後端
3、後端伺服器沒有檢查過濾,簡單處理後放入網頁正文中返回給瀏覽器
4、瀏覽器解析返回的網頁,中招!
儲存型
上述方式攻擊指令碼直接經伺服器轉手後返回瀏覽器觸發執行,儲存型與之的區別在於能夠將攻擊指令碼入庫儲存,在後面進行查詢時,再將攻擊指令碼渲染進網頁,返回給瀏覽器觸發執行。常見的套路舉例如下:
1、攻擊者網頁回帖,帖子中包含JS指令碼
2、回帖提交伺服器後,儲存至資料庫
3、其他網友檢視帖子,後臺查詢該帖子的回帖內容,構建完整網頁,返回瀏覽器
4、該網友瀏覽器渲染返回的網頁,中招!
防禦手段
:前後端均需要做好內容檢測,過濾掉可執行指令碼的侵入
重點關注
:前端工程師、Web後端工程師
CSRF攻擊
Web安全三板斧之三,攻擊示意圖如下:
核心思想在於,在開啟A網站的情況下,另開Tab頁面開啟惡意網站B,此時在B頁面的“唆使”下,瀏覽器發起一個對網站A的HTTP請求。
這個過程的危害在於2點:
1、這個HTTP請求不是使用者主動意圖,而是B“唆使的”,如果是一個危害較大的請求操作(發郵件?刪資料?等等)那就麻煩了
2、因為之前A網站已經打開了,瀏覽器存有A下發的Cookie或其他用於身份認證的資訊,這一次被“唆使”的請求,將會自動帶上這些資訊,A網站後端分不清楚這是否是使用者真實的意願
重點關注
:前端工程師、Web後端工程師
DDoS攻擊
DDoS全稱Distributed Denial of Service:分散式拒絕服務攻擊。是拒絕服務攻擊的升級版。
拒絕攻擊服務顧名思義,讓服務不可用。常用於攻擊對外提供服務的伺服器,像常見的:
- Web服務
- 郵件服務
- DNS服務
- 即時通訊服務
- ......
在早期網際網路技術還沒有那麼發達的時候,發起DoS攻擊是一件很容易的事情:一臺效能強勁的計算機,寫個程式多執行緒不斷向伺服器進行請求,伺服器應接不暇,最終無法處理正常的請求,對別的正常使用者來說,看上去網站貌似無法訪問,拒絕服務就是這麼個意思。
後來隨著技術對發展,現在的伺服器早已不是一臺伺服器那麼簡單,你訪問一個www.baidu.com的域名,背後是數不清的CDN節點,數不清的Web伺服器。
這種情況下,還想靠單臺計算機去試圖讓一個網路服務滿載,無異於雞蛋碰石頭,對方沒趴下,自己先趴下了。
技術從來都是一柄雙刃劍,分散式技術既可以用來提供高可用的服務,也能夠被攻擊方用來進行大規模殺傷性攻擊。攻擊者不再侷限於單臺計算機的攻擊能力,轉而通過成規模的網路叢集發起拒絕服務攻擊。
拒絕服務攻擊實際上是一類技術,根據具體實施手段的不同,又可以進一步細分:
- SYN Flood
- ICMP Flood
- UDP Flood
- ......
防禦手段
:即便是到現在,面對DDoS也沒有100%打包票的防禦方法,只能靠一些緩解技術一定層面上減輕攻擊的威力。這些技術包括:流量清洗
、SYN Cookie
等等。
重點關注
:運維工程師、安全工程師
DNS劫持
當今網際網路流量中,以HTTP/HTTPS為主的Web服務產生的流量佔據了絕大部分。Web服務發展的如火如荼,這背後離不開一個默默無聞的大功臣就是域名解析系統:
如果沒有DNS,我們上網需要記憶每個網站的IP地址而不是他們的域名,這簡直是災難,好在DNS默默在背後做了這一切,我們只需要記住一個域名,剩下的交給DNS來完成吧。
也正是因為其重要性,別有用心的人自然是不會放過它,DNS劫持技術被髮明瞭出來。
DNS提供服務用來將域名轉換成IP地址,然而在早期協議的設計中並沒有太多考慮其安全性,對於查詢方來說:
- 我去請求的真的是一個DNS伺服器嗎?是不是別人冒充的?
- 查詢的結果有沒有被人篡改過?這個IP真是這個網站的嗎?
DNS協議中沒有機制去保證能回答這些問題,因此DNS劫持現象非常氾濫,從使用者在位址列輸入一個域名的那一刻起,一路上的凶險防不勝防:
- 本地計算機中的木馬修改hosts檔案
- 本地計算機中的木馬修改DNS資料包中的應答
- 網路中的節點(如路由器)修改DNS資料包中的應答
- 網路中的節點(如運營商)修改DNS資料包中的應答
- ......
後來,為了在客戶端對收到對DNS應答進行校驗,出現了DNSSEC
技術,一定程度上可以解決上面的部分問題。但限於一些方面的原因,這項技術並沒有大規模用起來,尤其在國內,鮮有部署應用。
再後來,以阿里、騰訊等頭部網際網路廠商開始推出了httpDNS
服務,來了一招釜底抽薪,雖然這項技術的名字中還有DNS
三個字母,但實現上和原來但DNS已經是天差地別,通過這項技術讓DNS變成了在http協議之上的一個應用服務。
重點關注
:安全工程師、後端工程師、運維工程師
TCP劫持
TCP是TCP/IP協議族中非常重要的成員,位於傳輸層。協議本身並沒有對TCP傳輸的資料包進行身份驗證,所以我們只要知道一個TCP連線中的seq和ack後就可以很容易的偽造傳輸包,假裝任意一方與另一方進行通訊,我們將這一過程稱為TCP會話劫持(TCP Session Hijacking)
TCP劫持技術是一種很老的技術,1995年被提出來後深受黑客青睞。不過近些年來,隨著作業系統層面的安全機制增強和防火牆軟體的檢測能力提升,這種基礎的攻擊方式越來越容易被發現,慢慢的淡出了人們的視野。
重點關注
:安全工程師、運維工程師
埠掃描技術
埠掃描是黑客經常使用的一種技術,它一般是作為網路攻擊的前期階段,用於探測目標開啟了哪些服務,以便接下來發起針對該服務的攻擊。
記得剛剛學習網路安全的時候,大家總會沒事拿出工具來掃一掃,雖然掃了之後就沒有了下文,也總是樂此不疲,在不懂的人面前秀一把自己的“黑客”能力。
以TCP/IP協議族構建的網際網路,網路服務總是離不開埠這個概念,不管是TCP也好,UDP也罷,應用層都需要一個埠號來進行網路通訊。而我們常見的服務埠有:
21
: FTP檔案傳輸服務25
: SMTP郵件服務53
: DNS域名解析系統服務80
: HTTP超文字傳輸協議服務135
: RPC遠端過程呼叫服務443
: HTTPS3389
: MSRDP微軟遠端桌面連線服務- ......
埠掃描都原理,對於基於UDP的服務,傳送對應服務都請求包,檢視是否有應答;對於基於TCP的服務,嘗試發起三次握手傳送TCP SYN資料包,檢視是否有應答。
如果遠端伺服器進行了響應,則表明對端伺服器上運行了對應的服務,接下來則是進一步探知對端伺服器使用的作業系統、執行的伺服器程式型別、版本等等,隨即針對對應的漏洞程式發起網路攻擊。
由此可見,為安全著想,在網際網路上應當儘可能少暴露資訊,關閉不需要的服務埠。
防禦手段
:使用防火牆等安全產品,即時發現和阻斷非法的掃描探測行為。
重點關注
:運維工程師、安全工程師
[為防抄襲,手動插入文字水印,敬請諒解。本文來自微信公眾號:程式設計技術宇宙]
系統安全
系統安全版塊中的技術,一般是指攻擊發生在終端之上,與作業系統息息相關。
棧溢位攻擊
棧溢位攻擊歷史悠久,也是發生在系統側最基礎的攻擊。
現代計算機基本上都是建立在馮-諾伊曼
體系之上,而這一體系有一個最大的問題就是資料和指令都儲存在儲存器中。
在計算機的記憶體中,既包含了程式執行的所有程式碼指令,又包含了程式執行的輸入輸出等各種資料,並沒有一種強制的機制將指令和資料區分。因為對於計算機來說它們都是一樣的二進位制0和1,大部分時候都是靠程式按照既定的“規則”去解釋理解記憶體中的這些0和1。而一旦這些“規則”理解錯誤,事情就變得糟糕起來。
具體到我們現代CPU和OS,不管是x86/x64處理器,還是ARM處理器,均採用了暫存器+堆疊式的設計,而這個堆疊中,既包含了程式執行各個函式棧幀中的變數資料等資訊,還儲存了函式呼叫產生的返回地址。
所謂棧溢位攻擊,則是通過一些手段輸入到棧中的緩衝區中,衝破緩衝區原有的界限,將儲存返回地址的位置覆蓋為一個數值,使其指向攻擊者提前佈置的惡意程式碼位置,劫持了程式的執行流程。
防禦手段
:現代作業系統針對棧溢位攻擊已經有非常成熟的應對方案,像Linux平臺的Stack Canary,Windows平臺的GS機制等等,程式設計師需要做的就是充分利用這些機制。
重點關注
:C/C++工程師
整數溢位攻擊
和棧溢位攻擊一樣,整數溢位攻擊也是屬於溢位類攻擊,不一樣的是溢位的目標不是棧中的緩衝區,而是一個整數。
我們知道,計算機數值以補碼
的方式表示和儲存。在表示一個有符號數時,最高位是用來表示這是一個正數(0)還是一個負數(1),比如對於一個16位的short變數而言,+1和-1的表示方法如下:
+1: 0000 0000 0000 0001
-1: 1111 1111 1111 1111
一個16位的short變量表示的範圍是-32768~32767,現在思考一個問題,假如一個short變數的值現在是32767:
32767: 0111 1111 1111 1111
如果現在對其執行+1操作,將變成:
1000 0000 0000 0000
而這正是-32768的補碼形式!
試想一下,如果這個變數名字叫length作為strcpy引數,或是叫index作為陣列的下標,整數的溢位將導致可怕的後果,輕則程序崩潰,服務宕機,重則遠端程式碼執行,拿下控制權。
重點關注
:所有程式設計師
空指標攻擊
空指標一般出現在指標沒有初始化,或者使用new
進行物件建立/記憶體分配時失敗了,而粗心的程式設計師並沒有檢查指標是否為空而進行訪問導致的攻擊。
大多數情況下,這將導致記憶體地址訪問異常,程式會崩潰退出,造成拒絕服務的現象
而在一些特殊的情況下,部分作業系統允許分配記憶體起始地址為0的記憶體頁面,而攻擊者如果提前在該頁面準備好攻擊程式碼,則可能出現執行惡意程式碼的風險。
釋放後使用攻擊
釋放後使用Use After Free
意為訪問一個已經釋放後的記憶體塊。較多的出現在針對瀏覽器的JavaScript引擎的攻擊中。
正常情況下,一個釋放後的物件我們是沒法再訪問的,但如果程式設計師粗心大意,在delete物件後,沒有即時對指標設定為NULL,在後續又繼續使用該指標訪問物件(比如通過物件的虛擬函式表指標呼叫虛擬函式),將出現記憶體訪問異常。
在上面的場景中,如果攻擊者在delete物件後,馬上又new一個同樣記憶體大小的物件,在現代作業系統的堆記憶體管理演算法中,會有很大概率將這個新的物件放置於剛剛被delete的物件的位置處。這個時候還通過原來物件的指標去訪問,將出現鳩佔鵲巢,出現可怕的後果。
養成好的程式設計習慣,物件delete後,指標及時置空。
重點關注
:C/C++工程師
HOOK
HOOK原意鉤子的意思,在計算機程式設計中時常用到,用來改變原有程式執行流程。
在那個網際網路充斥著流氓軟體的年代,流行著一種鍵盤記錄器
的木馬,用於記錄使用者鍵盤的輸入,從而盜取密碼,這其中QQ曾經是重災區。
而實現這一功能的技術就是用到了HOOK技術,鉤到了鍵盤敲擊的事件訊息。
除了訊息HOOK,用得更多的是程式執行流程層面的HOOK。惡意程式碼被注入目標程式後,在函式入口處新增跳轉指令,導致執行到此處的執行緒轉而執行攻擊者的程式碼,實現修改引數、過濾引數的目的。
HOOK技術不僅為黑客使用,安全軟體用的更多,安全軟體需要守護整個系統的安全防線,通過HOOK技術在各處敏感API處設立檢查,從而抵禦非法呼叫攻擊行為。
另外,軟體補丁技術中也時常用到HOOK技術,軟體廠商發現原來程式漏洞後,通過HOOK,修改既有程式的執行邏輯,從而達到修復漏洞的目的。
重點關注
:C/C++工程師
許可權提升
現代作業系統都對運行於其中的程序、執行緒提供了許可權管理,因為安全攻擊無可避免,而許可權的限制作為一道頗為有效的屏障將程式被攻擊後的影響減少到最小。
換句話說,即便我們的程式因為漏洞原因被攻擊執行了惡意程式碼,但因為作業系統的許可權控制,惡意程式碼能幹的事情也有限。
就像一枚硬幣總有兩個面,有許可權限制,自然而然就有許可權提升。攻擊者想要做更多事情,就得突破作業系統的限制,獲取更高的許可權。
在Windows上,經常叫獲得管理員許可權。
在Linux上,經常叫獲得Root許可權,手機Root也是這個意思。
在iOS上,經常叫“越獄”。
許可權提升的方式五花八門,總體來說,程式執行的時候,所屬程序/執行緒擁有一個安全令牌,用以標識其安全等級,在訪問資源和執行動作的時候由作業系統核心稽核。
許可權提升的目標就是將這個安全令牌更改為高等級的令牌,使其在後續訪問敏感資源和執行敏感動作時,憑藉該令牌可以通過系統的安全稽核。
而更改這個安全令牌的慣用伎倆便是利用作業系統核心漏洞(如前面所述的棧溢位、整數溢位、釋放後使用等)執行攻擊者的程式碼,實現安全令牌的篡改。
重點關注
:安全工程師
可信計算
安全攻擊無處不在,不僅應用程式的環境不可靠,甚至連作業系統核心的環境也充滿了風險。
如果一段程式(比如支付)必須在一個極度絕密的環境下執行,該怎麼辦?
可信計算
的概念被安全研究者提了出來,根據百科的解釋:
可信計算/可信用計算(Trusted Computing,TC)是一項由可信計算組(可信計算叢集,前稱為TCPA)推動和開發的技術。可信計算是在計算和通訊系統中廣泛使用基於硬體安全模組支援下的可信計算平臺,以提高系統整體的安全性 [1] 。簽註金鑰是一個2048位的RSA公共和私有金鑰對,它在晶片出廠時隨機生成並且不能改變。這個私有金鑰永遠在晶片裡,而公共金鑰用來認證及加密傳送到該晶片的敏感資料。
可信計算中一個非常重要的概念是可信執行環境TEE(Trusted Execution Environment)
,簡單來說就是在現有的計算機內部的世界裡,再構建一個祕密基地,專門用於執行極度機密的程式。該祕密基地甚至連作業系統都輕易無法訪問,更別說作業系統之上的應用程式了。
在移動端,ARM晶片佔據了主流市場,ARM晶片提供了名為TrustZone
技術的技術,在硬體層面新增一個可信計算環境,包含一個可信OS,和一些可信APP,和普通環境在硬體層面隔離,處理器內部進行通訊完成兩個世界的互動。
重點關注
:終端系統工程師
密碼學
由於資料傳輸的過程中會遇到資訊洩漏、篡改、偽造的風險,加密技術應運而生。
對稱加密 & 非對稱加密
有加密就有解密,根據加密過程使用的金鑰和解密過程使用的金鑰是否相同,將加密演算法分為了兩個大類:對稱加密
和非對稱加密
。
最早出現的加密技術是對稱加密
- 對稱加密:加密金鑰和解密金鑰一致,特點是加密速度快、加密效率高。常用的對稱加密演算法有:
- DES
- AES
- RC4
這種加密方式中有一個非常關鍵的問題是,解密方需要拿到金鑰才能進行解密,而金鑰鑰匙通過網路傳輸又會面臨不安全的風險,這成了一個雞生蛋,蛋生雞的問題。
於是通訊技術上一個劃時代的技術被髮明瞭出來,這就是非對稱加密
!
- 非對稱加密:加密金鑰與解密金鑰不一致,特點是演算法較複雜,但安全性高。非對稱加密的金鑰一般分為公鑰和私鑰,公鑰公開,私鑰需保密。常用於數字認證,如HTTPS中握手階段的伺服器認證。常用的非對稱加密演算法有:
- RSA
- DH
- ECC(橢圓曲線加密)
可以毫不誇張的說,沒有了非對稱加密,網際網路絕不會發展到今天這樣的高度。
祕鑰交換技術
在網際網路通訊中,有加密就有解密,解密自然就需要金鑰,那如何把這個金鑰告訴對方呢?金鑰交換演算法
就是要解決這個問題:如何安全的將金鑰傳輸給對方?
回頭看看上面提到的非對稱加密,它就可以解決這個問題:
- 伺服器負責生成一對公私鑰,公鑰告訴客戶端,私鑰自己儲存
- 客戶端拿到公鑰後,使用它來對後續通訊將要使用的對稱加密演算法金鑰進行加密傳輸
- 服務端收到後使用私鑰解密,拿到這個金鑰
- 以後雙方可以通過對稱加密進行傳輸通訊
上面這個例子並不只是舉例,在早期版本的HTTPS中,就是通過這種方式來進行金鑰交換。而後來的版本中,另外一種叫DH及其變種的金鑰交換演算法用的越來越多。
DH全稱Diffie-Hellman,是兩位數學家的名稱構成,這種演算法的核心是完全依靠數學運算實現金鑰的交換。
資訊摘要演算法
資訊摘要演算法其實不算是一種加密演算法,加密的前提是可以通過解密還原,而資訊摘要演算法的目的並不是對資料進行保護,也無法解密還原。
在一些語境下,資訊摘要我們聽得少,聽的更多的名詞是雜湊
資訊摘要演算法的目的之一是校驗資料的正確性,演算法公開,資料通過該演算法得出一個摘要值,收到資料後通過該演算法計算出這個摘要,前後對比就知道是否有被篡改。
常用的資訊摘要演算法有:
- MD5
- SHA1
- SHA256
資料編碼技術
嚴格來說,資料編碼技術也不算是加密演算法,因為其目的同樣不是為了加密,而只是為了將資料編碼以便傳輸。
最常見的編碼演算法就是base64
了,多用於編碼二進位制的資料,將不可見的字元編碼後轉換成64個常見字元組成的文字,便於列印、展示、傳輸、儲存。如郵件eml格式中,將附件檔案通過base64編碼。
除了base64,還有常用於比特幣錢包地址編碼的base58。base家族還有base85、base92、base128等眾多演算法。它們的區別不僅僅在於參與編碼的字符集不同,演算法執行也是各有千秋。
多因子認證技術
說到認證,最常出現的莫過於登入、支付等場景。傳統的認證技術就是密碼技術,但隨著網路攻擊的日益猖獗以及網際網路滲透到人們生活的方方面面,傳統密碼技術的安全性不足以滿足網際網路的發展。
多因子認證技術意為在傳統密碼認證之外,引入其他認證技術進行補充,使用2種及以上的方式共同完成認證。隨著人工智慧技術的發展,基於生物特徵的認證技術突飛猛進:
- 指紋認證
- 虹膜認證
- 人臉識別
- ......
這個世界從來不缺先行者,多因子認證看上去很複雜,好在已經有不少頭部企業搭建了認證平臺,對於絕大多數企業,需要做的只是下載SDK,呼叫API而已。
目前國內外主流的多因子認證平臺有三大派系:
-
FIDO
,國際標準,在國內,翼支付、百度錢包、京東錢包、微眾銀行等都已經應用 -
IFAA
,阿里系,憑藉阿里在電商領域的優勢,也吸引了眾多追隨者。 -
TUSI
,騰訊系
總結
本文羅列了一些常見的資訊保安技術,主要分網路安全、系統安全和密碼學三個領域展開。
資訊保安技術不僅僅是安全工程師的事情,作為一位程式設計師,瞭解這些技術將幫助我們更好的Build The World
!
知識在於分享,轉發這篇文章,讓更多的人看到。