上面這個段子估計不少朋友都看過,程序員被黑過無數次,在其餘人眼中,彷彿咱們須要寫得了木馬,翻得了圍牆,修得了電腦,找獲得資源,但凡是跟計算機沾點邊的,咱都得會才行。前端
段子歸段子,言歸正傳,對於我們程序員來講,多多少少了解一些信息安全的技術知識仍是大有裨益的,不只能瞭解一些計算機和網絡的底層原理,也能反哺咱們的開發工做,帶着安全思惟編程,減小漏洞的產生。程序員
本文內容:算法
- 網絡安全 - 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後端工程師
Web安全三板斧之二,全稱跨站腳本攻擊(Cross Site Scripting),爲了與重疊樣式表CSS區分,換了另外一個縮寫XSS。
XSS攻擊的核心是將可執行的前端腳本代碼(通常爲JavaScript)植入到網頁中,聽起來比較拗口,用大白話說就是攻擊者想讓你的瀏覽器執行他寫的JS代碼。那如何辦到呢?通常XSS分爲兩種:
一、攻擊者將JS代碼做爲請求參數放置URL中,誘導用戶點擊
示例:
http://localhost:8080/test?name=<script>alert("you are under attack!")</script>
二、用戶點擊後,該JS做爲請求參數傳給Web服務器後端
三、後端服務器沒有檢查過濾,簡單處理後放入網頁正文中返回給瀏覽器
四、瀏覽器解析返回的網頁,中招!
上述方式攻擊腳本直接經服務器轉手後返回瀏覽器觸發執行,存儲型與之的區別在於可以將攻擊腳本入庫存儲,在後面進行查詢時,再將攻擊腳本渲染進網頁,返回給瀏覽器觸發執行。常見的套路舉例以下:
一、攻擊者網頁回帖,帖子中包含JS腳本
二、回帖提交服務器後,存儲至數據庫
三、其餘網友查看帖子,後臺查詢該帖子的回帖內容,構建完整網頁,返回瀏覽器
四、該網友瀏覽器渲染返回的網頁,中招!
防護手段
:先後端均須要作好內容檢測,過濾掉可執行腳本的侵入
重點關注
:前端工程師、Web後端工程師
Web安全三板斧之三,攻擊示意圖以下:
核心思想在於,在打開A網站的狀況下,另開Tab頁面打開惡意網站B,此時在B頁面的「挑撥」下,瀏覽器發起一個對網站A的HTTP請求。
這個過程的危害在於2點:
一、這個HTTP請求不是用戶主動意圖,而是B「挑撥的」,若是是一個危害較大的請求操做(發郵件?刪數據?等等)那就麻煩了
二、由於以前A網站已經打開了,瀏覽器存有A下發的Cookie或其餘用於身份認證的信息,這一次被「挑撥」的請求,將會自動帶上這些信息,A網站後端分不清楚這是不是用戶真實的意願
重點關注
:前端工程師、Web後端工程師
DDoS全稱Distributed Denial of Service:分佈式拒絕服務攻擊。是拒絕服務攻擊的升級版。
拒絕攻擊服務顧名思義,讓服務不可用。經常使用於攻擊對外提供服務的服務器,像常見的:
在早期互聯網技術尚未那麼發達的時候,發起DoS攻擊是一件很容易的事情:一臺性能強勁的計算機,寫個程序多線程不斷向服務器進行請求,服務器目不暇接,最終沒法處理正常的請求,對別的正經常使用戶來講,看上去網站貌似沒法訪問,拒絕服務就是這麼個意思。
後來隨着技術對發展,如今的服務器早已不是一臺服務器那麼簡單,你訪問一個www.baidu.com的域名,背後是數不清的CDN節點,數不清的Web服務器。
這種狀況下,還想靠單臺計算機去試圖讓一個網絡服務滿載,無異於雞蛋碰石頭,對方沒趴下,本身先趴下了。
技術歷來都是一柄雙刃劍,分佈式技術既能夠用來提供高可用的服務,也可以被攻擊方用來進行大規模殺傷性攻擊。攻擊者再也不侷限於單臺計算機的攻擊能力,轉而經過成規模的網絡集羣發起拒絕服務攻擊。
拒絕服務攻擊其實是一類技術,根據具體實施手段的不一樣,又能夠進一步細分:
防護手段
:即使是到如今,面對DDoS也沒有100%打包票的防護方法,只能靠一些緩解技術必定層面上減輕攻擊的威力。這些技術包括:流量清洗
、SYN Cookie
等等。
重點關注
:運維工程師、安全工程師
當今互聯網流量中,以HTTP/HTTPS爲主的Web服務產生的流量佔據了絕大部分。Web服務發展的如火如荼,這背後離不開一個默默無聞的大功臣就是域名解析系統:
若是沒有DNS,咱們上網須要記憶每一個網站的IP地址而不是他們的域名,這簡直是災難,好在DNS默默在背後作了這一切,咱們只須要記住一個域名,剩下的交給DNS來完成吧。
也正是由於其重要性,別有用心的人天然是不會放過它,DNS劫持技術被髮明瞭出來。
DNS提供服務用來將域名轉換成IP地址,然而在早期協議的設計中並無太多考慮其安全性,對於查詢方來講:
DNS協議中沒有機制去保證能回答這些問題,所以DNS劫持現象很是氾濫,從用戶在地址欄輸入一個域名的那一刻起,一路上的兇險防不勝防:
後來,爲了在客戶端對收到對DNS應答進行校驗,出現了DNSSEC
技術,必定程度上能夠解決上面的部分問題。但限於一些方面的緣由,這項技術並無大規模用起來,尤爲在國內,鮮有部署應用。
再後來,以阿里、騰訊等頭部互聯網廠商開始推出了httpDNS
服務,來了一招釜底抽薪,雖然這項技術的名字中還有DNS
三個字母,但實現上和原來但DNS已是天差地別,經過這項技術讓DNS變成了在http協議之上的一個應用服務。
重點關注
:安全工程師、後端工程師、運維工程師
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原意鉤子的意思,在計算機編程中時經常使用到,用來改變原有程序執行流程。
在那個互聯網充斥着流氓軟件的年代,流行着一種鍵盤記錄器
的木馬,用於記錄用戶鍵盤的輸入,從而盜取密碼,這其中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,和普通環境在硬件層面隔離,處理器內部進行通訊完成兩個世界的交互。
重點關注
:終端系統工程師
因爲數據傳輸的過程當中會遇到信息泄漏、篡改、僞造的風險,加密技術應運而生。
有加密就有解密,根據加密過程使用的密鑰和解密過程使用的密鑰是否相同,將加密算法分爲了兩個大類:對稱加密
和非對稱加密
。
最先出現的加密技術是對稱加密
這種加密方式中有一個很是關鍵的問題是,解密方須要拿到密鑰才能進行解密,而密鑰鑰匙經過網絡傳輸又會面臨不安全的風險,這成了一個雞生蛋,蛋生雞的問題。
因而通訊技術上一個劃時代的技術被髮明瞭出來,這就是非對稱加密
!
能夠絕不誇張的說,沒有了非對稱加密,互聯網毫不會發展到今天這樣的高度。
在互聯網通訊中,有加密就有解密,解密天然就須要密鑰,那如何把這個密鑰告訴對方呢?密鑰交換算法
就是要解決這個問題:如何安全的將密鑰傳輸給對方?
回頭看看上面提到的非對稱加密,它就能夠解決這個問題:
上面這個例子並不僅是舉例,在早期版本的HTTPS中,就是經過這種方式來進行密鑰交換。然後來的版本中,另一種叫DH及其變種的密鑰交換算法用的愈來愈多。
DH全稱Diffie-Hellman,是兩位數學家的名稱構成,這種算法的核心是徹底依靠數學運算實現密鑰的交換。
信息摘要算法其實不算是一種加密算法,加密的前提是能夠經過解密還原,而信息摘要算法的目的並非對數據進行保護,也沒法解密還原。
在一些語境下,信息摘要咱們聽得少,聽的更多的名詞是哈希
信息摘要算法的目的之一是校驗數據的正確性,算法公開,數據經過該算法得出一個摘要值,收到數據後經過該算法計算出這個摘要,先後對比就知道是否有被篡改。
經常使用的信息摘要算法有:
嚴格來講,數據編碼技術也不算是加密算法,由於其目的一樣不是爲了加密,而只是爲了將數據編碼以便傳輸。
最多見的編碼算法就是base64
了,多用於編碼二進制的數據,將不可見的字符編碼後轉換成64個常見字符組成的文本,便於打印、展現、傳輸、存儲。如郵件eml格式中,將附件文件經過base64編碼。
除了base64,還有經常使用於比特幣錢包地址編碼的base58。base家族還有base8五、base9二、base128等衆多算法。它們的區別不只僅在於參與編碼的字符集不一樣,算法執行也是各有千秋。
說到認證,最常出現的莫過於登陸、支付等場景。傳統的認證技術就是密碼技術,但隨着網絡攻擊的日益猖獗以及互聯網滲透到人們生活的方方面面,傳統密碼技術的安全性不足以知足互聯網的發展。
多因子認證技術意爲在傳統密碼認證以外,引入其餘認證技術進行補充,使用2種及以上的方式共同完成認證。隨着人工智能技術的發展,基於生物特徵的認證技術日新月異:
這個世界歷來不缺先行者,多因子認證看上去很複雜,好在已經有很多頭部企業搭建了認證平臺,對於絕大多數企業,須要作的只是下載SDK,調用API而已。
目前國內外主流的多因子認證平臺有三大派系:
FIDO
,國際標準,在國內,翼支付、百度錢包、京東錢包、微衆銀行等都已經應用
IFAA
,阿里系,憑藉阿里在電商領域的優點,也吸引了衆多追隨者。
TUSI
,騰訊系
本文羅列了一些常見的信息安全技術,主要分網絡安全、系統安全和密碼學三個領域展開。
信息安全技術不只僅是安全工程師的事情,做爲一位程序員,瞭解這些技術將幫助咱們更好的Build The World
!
知識在於分享,轉發這篇文章,讓更多的人看到。
Python一鍵轉Jar包,Java調用Python新姿式!