黑客為什麼可以做到無需知道源碼的情況下找出系統漏洞?

柔沢十


關注我,帶你以技術思維看世界~


作為一個7年老程序員,來強答一波。


找漏洞的過程

題主這個問題其實是從一個慣性思維來提出的。為什麼呢?

因為一個新的漏洞其實不是通過某種方式先知道這裡有個漏洞之後再利用它來攻擊的,而更像是“蒙”的。是通過不斷的調整輸入的數據和輸入方式,直到出現“意料之外”的情況,這才是找漏洞的真正過程。


很多黑客雖然算不上是coding高手,但是對於一個程序是如何編寫出來的,還是有基本的認識的。藉此,他其實就知道自己如果發起一個請求可能會怎麼樣被處理,然後剩下的與編寫這部分代碼的程序員之間的博弈,這個過程有點像兩個人下圍棋。

一般黑客會將自己用過的“攻擊方法和攻擊數據”整合到自己的一個“武器箱”中,後續就通過程序化的方式自動去運行攻擊,自己則是觀察整個攻擊過程,看看能不能發現新的機會。


這些才是黑客的工作過程。


視角有什麼區別嗎?

黑客和軟件開發者的視角肯定是不同的,而且正好相反。

軟件開發者要做的事是什麼?就是如何把一個程序寫“正確”,符合設定的預期。你可以這樣來理解,好比是帶著一個“參考答案”和“解題思路”去寫代碼。

但是我們知道,任何事物都有兩面性,或者說不是“完美”的,“解題思路”也是如此。

更何況,“解題思路”的目的是如何變得“正確”,而不是“不正確”,從思維慣性上就不會考慮那些讓它變得“不正確”情況。否則不是和自己要完成的事背道而馳麼。


黑客的視角與軟件開發者正好相反,倒是和常見的「測試工程師」的視角比較接近。就是通過逆向思維來想盡辦法把這個程序搞的“不正確”。

具體的過程就是第一部分內容講的那些。


希望對你有所幫助:)

歡迎在留言區補充或者闡述不同觀點,與我交流。


如果覺得回答對你有所幫助的話給我點個「贊同」並「關注我」吧,支持我的創作。

謝謝你的舉手之勞~

瞭解Z哥更多,歡迎搜索微信公號:跨界架構師。讓我們一起為了理想的生活而奮鬥。

我還會不定期的送出粉絲福利哦。

內容包括:架構設計丨分佈式系統丨產品丨運營丨個人深度思考。


跨界架構師


因為世界上沒有絕對安全的系統。

如果一個「黑客」需要看源碼去發現漏洞的話,那他真是侮辱了「黑客」這個詞。

想象一下,在你的面前有一個黑盒子,如何在不打開盒子的情況下知道里面有什麼樣的構造呢?我們可以在盒子上面插上一些小的管子對吧,從這些小的管子去觀察盒子內部的結果。

對於黑客來講,你的網站系統就像是一個黑盒子,他要通過一系列的手段發現其中的漏洞。試想下如果這個黑盒子沒有任何管子,那再厲害的黑客也拿這個盒子沒辦法。這時候他們就會構造一些合法的請求,然後通過這些請求返回的數據結果來分析你的網站系統。這些合法的請求就是我們上面所說的管子。

通過不斷地請求,黑客會蒐集大量相關數據,為之後的攻擊做準備。

因為大多數的漏洞都是有規律的,而且迄今為止很多系統已經爆出了超級多的漏洞,這些信息都是公開的,黑客們會用一些專業的工具對網站進行掃描,對一些高危漏洞掃描之後很容易找到一些漏網之魚,然後在通過上面自己蒐集到的數據再加以驗證。

另外在網站方面,容易被黑客利用的地方就是 sql 注入了。比如大家熟知的搜索其大致流程是這樣子的,用戶在搜索框輸入關鍵詞,然後將請求發送至服務器,服務器接收到關鍵詞之後在數據庫中匹配相關的結果,最後將結果返回給瀏覽器。看起來沒什麼對不對,然而黑客就是利用了這點,他們的輸入是 sql 關鍵字,當你的程序沒有對這些 sql 關鍵字做過濾或者轉換時,有很大可能你服務器的數據庫會執行黑客發送的指令,然後得到他們想要的結果,嚴重的甚至會將整個庫拖下來。

當然,現在的網站系統沒有那麼脆弱,上線之前用工具掃描一下就可以避免大部分漏洞。黑客要想破解是要下一番功夫的,跟其自身的經驗和技術水平有相當大的關係。


stormzhang


這個世界上有那麼一群人,他們不喜歡遵規守據,不喜歡按部就班,你越是向他規定了什麼不能做,他越是想去嘗試。


黑客就是這麼一個群體,喜歡去搞一些不同尋常的東西。比如題主說的找 web 方面的漏洞,一般是可以分為黑盒測試和白盒測試,白盒測試就是黑客拿到了服務端的源碼(授權或未授權,拿到源碼就算),在整個網站的運行流程可見的情況下進行測試,黑盒測試指的是沒有源碼的情況下進行的測試。


在挖 web 漏洞的時候,一般需要足夠的耐心和腦洞,要去嘗試一些比較奇葩的操作,或許就會有意想不到的結果。


舉個例子,之前我遇到的一個任意用戶密碼重置漏洞:

你點擊忘記密碼,然後會發送驗證碼到你綁定的手機號上,輸入正確的驗證碼,驗證成功即可修改密碼,看起來一切都沒有什麼問題。但是你要是換個操作呢?

先隨便用個別人的賬號,忘記密碼,這時候系統發送驗證碼到這個賬戶所有著的手機上了,這時候不要關閉當前頁面,新建一個標籤頁,再次打開忘記密碼的頁面,輸入你自己的賬號,系統發送了驗證碼到你的手機上,你輸入正確的驗證碼,驗證成功,進入了重置密碼的頁面,這時候不用著急重置密碼,切回之前的那個標籤頁,還在停留在要求輸入驗證碼的時候,這時候你刷新一下頁面。

之前那個別人的賬戶已經跳過了驗證碼的驗證,密碼隨便改了,你只需要註冊一個這個網站的賬號,你就可以修改別人的密碼了。


修改任意用戶的密碼,聽起來很爽,這操作看起來也不復雜,可關鍵是你想得到嗎???


Aida無茫


為什麼黑客能夠找到漏洞?

我是一個學Python的web開發的,在web這方面我比較瞭解,所以主要從這方面去講解,其他的其實也很類似,但不一樣,可以進行類比。

web方面其實不是需要知道源碼的,當然,你能夠知道的話,那可能就更方便了。首先,黑客會去試探你的服務器,如何試探呢?通過進行一些合法的請求,通過你返回的這些信息中,能夠得出你的服務器類型,你是用什麼語言來寫的(當然,這個判斷不一定準)。

就如一個黑盒子,黑客不斷地根據輸入和輸出,來了解你的整個web(或者說是服務器或者網站)。

在網站方面,很多的漏洞都出在輸入上,有輸入的地方,就需要去防止黑客。這是為什麼呢?舉個例子,如果一個博客,它有一個評論功能,你評論完成之後就會返回到這個頁面上(就是可以看到你的評論),假如,你現在輸入的評論不是一個正常的評論,而是一段代碼(js,h5,sql語句都有可能),再如果,你沒有對這些東西進行過濾或者轉義的話,那麼你就會將一個可能帶有不可預測性的代碼加入到你的網站裡面了。(很可能用戶只要進入這個頁面,那麼他的信息就會暴露,然後進一步感染電腦。)

再說一下,用前端框架很容易出現漏洞,因為防黑客的必須是後端,前端是為了用戶體驗,減小服務器壓力,如果由於前端將這些過濾的事情做了,而後端由於疏忽沒有去做,那麼黑客是完全可以繞過前端的檢測,攻擊後端(你的服務器。)

另一個很重要的就是sql注入,比如一個請求,你是直接用這些參數去數據庫取數據,那麼如果這些參數是一個sql語句,修改你的數據庫權限(通常是通過一些其他的信息來獲取數據庫的類型,如查看報錯信息等等),如果你進行了過濾,但是不周全的話,可以進行轉碼,然後你的數據庫還是會執行這些漏洞。

我的回答差不多就結束了,想要獲取更多關於黑客的好玩的東西,可以關注我哦~~~~


還有一點點需要提一下,就是如果獲取到了你的服務器,數據庫,代碼等等,黑客通常會先查看一下已經出現的漏洞,進行窮舉法(一般是用黑客軟件進行)。

再對於軟件這方面的,一個是,通過下載了惡意軟件(通過獲取了權限,然後就可以完全掌控你的計算機),一般是偽造相似的軟件,其實你的應用軟件越多,留下的後門的可能性就越大,每個軟件都有一定的權限,但是如果這些權限被黑客利用的話,就是一場浩劫了。


Python雁橫


首先黑客沒有傳說中大家想象的那麼神奇,因為即使再牛逼的黑客起碼也是一名標準的程序員,現在大家對於黑客的印象很多都被帶溝裡去了。真正的黑客除了是程序員之外還具備極客思想,這是黑客區別於普通程序員的唯一標記,也是最明顯的標記。

事實中很多人覺得黑客能夠隨意進入別人的服務器做自己想做的事情,順便給自己弄點好處,估計大家心目中黑客的想象和現實中駭客標準更加的貼近。真正搞破壞的是駭客,不是黑客所為,黑客在一定層面上還能促進網絡安全的進步,會給一些政府或者企業善意的提醒促進進一步提升自身的網絡安全。

所以不要只看到黑客光鮮的一面,背後無數的日子對著電腦解決探索問題的時間才是黑客絕大部分精力所在。

從樓主的描述看還處於程序員的初級階段,能夠讀懂大段的代碼是一個程序員必備的標準,而且源碼的讀取不是挨著一點點的來,靠對整個框架有個理解然後再去考慮閱讀代碼,做事情先有指導思想,有了大方向然後推斷哪方面有問題,然後找到對應模塊代碼進行修改調試,再牛逼的黑客也需要經歷這個過程。

另外黑客算是軟件領域的安全科目,需要具備一定的安全基礎,常見的網絡TCP/IP,彙編語言,C語言基礎,以及常見的安全知識都要具備,不僅僅是熟悉的那回事了,不知道樓主從事的什麼技術行業用的什麼編程語言,如果距離很遠感覺很神秘也屬於很正常的心裡反映,所話說隔行如隔山。

想做點事情還是需要一定的積累。要想人前顯貴學會背後受罪。


大學生編程指南


每天活躍在互聯網上的應用成百上千萬,包括PC端以及目前越來越主流的移動端,不僅有通過瀏覽器訪問的,還有需要安裝客戶端的,不僅有與服務器強交互的,還有獨立運行的本地軟件。

而這其中,開源的(包括開放源碼的)產品少之又少。但,這並不妨礙一個黑客找出其中的漏洞。換句話說,找漏洞並不需要源碼。

當然了,在有源碼的情況下,挖洞是一件難度係數指數下降的事情。雖然讀懂一個大型軟件源碼耗時又耗力,但對於黑客來說,可以略去其中大半的代碼來閱讀,只關心可能造成危險的部分。就像一名建築工程師看一份大樓的施工圖,要看懂大樓的結構、建築材料、水電線路等等各方各面,而對於《Prison Break》中的Michael Scofield可能只關心地下管道的分佈。

那麼,在沒有源碼的情況下,黑客怎麼挖洞呢?這種情況,我們可以稱之為黑盒。而挖洞,的確需要與程序編輯者持有完全相反的角度和看法。對於輸入輸出點,程序猿考慮的是正確的輸入獲得正確的輸出,而黑客則考慮特殊的非法輸入獲得異常的有價值輸出。那系統登錄來說,程序猿考慮的是用戶輸入註冊的用戶名、口令能夠在登錄時與數據庫中的數據匹配成功,而黑客則會嘗試引起數據庫查詢異常的輸入作為用戶名、口令內容,希望應用返回更多數據庫中的有效數據。

對於黑客來說,不知道源碼情況下,只要有輸入就可以了,不管是應用具有的功能頁面,還是一個輸入接口,通過一種叫做模糊測試的技術就可以開始你的挖洞之旅。模糊測試可以構造一系列正常和異常的輸入值,根據應用的返回來判斷脆弱點的存在。

在黑客的武器庫中,模糊測試只是其中一個利器,像什麼漏掃、逆向、脫殼、注入、暴破等等不一而足。

作為程序猿,在編寫程序時不僅要從正向角度完成應用的功能,還需要從黑客角度逆向分析應用在處理異常輸入時的反應,才能做出高安全的應用。


留白說


一般滲透測試工程師在審計一業務完備的系統的時候,會選擇兩種審計方法。


第一種 黑盒審計。

即在不需要知道程序源碼的情況下,僅依靠輸入和輸出來判斷漏洞的存在。

為什麼僅僅通過輸入和輸出就可以判斷?假設一個頁面正常運行的結果是顯示了一列圖片和文字。當我的輸入變化成一些程序意料之外的數據之後,程序沒有事先準備對應的輸出,因此就有可能輸出與正常情況下完全不相同排版錯亂甚至是直接報錯。

因此,我們在對程序測試的時候,會採用一些特定的輸入來嘗試找出漏洞。

怎麼知道哪些特定的輸入會產生漏洞?這就需要依靠滲透測試人員的專業知識以及對各種漏洞形成機理的理解程度去構造了。

至於題主所說的開源與不開源,在黑盒審計這裡,沒有什麼區別。


第二種 白盒審計。

即在已知程序源碼的情況下,通過通讀源碼,理解程序邏輯,分析程序邏輯從而找出漏洞的存在。

這裡要涉及到題主所說的,開源與不開源的問題。開源與不開源影響的只是審計的困難程度。假設一個程序是開源的,那很好,省去了很多事情,我們可以直接上手去分析程序可能的易錯點。那假如要分析一個閉源的程序呢?那就要引出我們一門高深的學問,所謂逆向工程。軟件逆向工程就是通過將程序反編譯後,研究如何將程序邏輯還原出來並且還原的更好的一門學問。有了這樣的神器,閉源的問題也能得到解決。那麼為什麼軟件可以被逆向?因為所有的程序都建立在硬件的基礎之上,而CPU的運行是依靠著指令集來操作,所有的程序無論經過多少層的封裝到底層都是那些高低電平都是那些彙編代碼,因此所有的程序無論高級低級,都有機會還原出行為邏輯。因為它們都運行在相同標準的硬件上。

白盒審計的難度相對於黑盒審計會高很多,往往要求審計員有相關方面的編程經驗才有可能更好的去理解程序並且找出漏洞。我們在測試的時候,有的時候也會選擇直接搜索可能出現問題的函數來定位漏洞點。總之,方法多種多樣。


點個關注再走吧。


只做技術不做宅


其實上這個問題,對一般人來說很神秘,但也不是什麼高深的東西。

掃描站點指紋信息

所有的漏洞都是有規律,有定勢的,體現在網站上就是表現出一些特徵,比如站點信息的指紋,目錄結構,特定的文件。這些都可以通過掃描器自動掃描到,你裝個掃描軟件就行。比如nmap,Nikto,httprint,Skipfish,DIRB 國產的御劍等工具。



結果:一些直接問題,bug可直接暴露出來,甚至有些網站備份的www.zip源碼都能通過列舉掃描掃到。站點web服務器及版本,開的端口,應用程序語言,用的cms及版本等。一般有問題可直接利用了。

web滲透測試

有了第一步的測試就可以知道站點大概信息,還有直接暴露的bug可利用。如果沒有的話,可以做滲透測試比如通過Nikto,AWVS,APPSCAN對站點做測試。



通過web滲透掃描可以得到web常見的漏洞,比如SQL注入(SQL Injection)、弱口令、文件上傳、目錄遍歷和執行、跨站腳本(Cross-site>

放棄或者人工滲透

如果以上兩部都沒有結果,說明站點安全做的還可以,這時候就要出動人力做苦力滲透,旁路,apt滲透,或者直接放棄換另一個站點。

關於一些掃描滲透的工具和教程可以關注筆者,看筆者的文章和github倉。也可以留言索取。


蟲蟲安全


針對Web方面

在網絡滲透工程師眼裡,你說的這種行為通常被稱為“黑盒測試”,這也是大部分黑(script)客(kid)最常用的測試手段。

在這種情況下,黑客進行黑盒測試的首要任務就是收集信息,儘可能的收集web網站的DNS、程序結構、數據庫信息等等,為之後的滲透測試奠定基礎。

下一步便是使用一些專業的掃描器如awvs nessus等,進行一些高危漏洞的掃描,同時進行手工檢測,找一些掃描器容易忽略的地方進行利用。

最後把這些信息綜合總結來進行利用。

上面是2017年總結的Owasp Top 10,也就是近幾年間最流行的高危漏洞。


在我看來,黑盒測試為首當測試,沒有什麼特別的問題的話,白盒測試便更能挖掘出藏在深處的漏洞。


怪咖玩家


黑盒確實是比較難從外部攻破的,但是這也是滲透過程中非常非常非常常見的現象,如果每個目標網站或者目標系統,你都能拿到源代碼,那,做這個還有什麼樂趣可言呢?


首先回答一下答主的描述中的疑問,讀懂源碼已經很不容易了,何況還要從中找出漏洞。我的觀點是,題主和黑客的心態不同,題主的心態是以讀懂,學習為主,就像是一個學者,在考據東西,黑客的心態則不一樣,黑客的心態是攻擊性的,他不需要明白所有函數的作用,不需要知道上下的連接,左右的影響,他就像一個獵狗,只在乎自己最關心的部分,從這個部分往外推演,就像是抽絲剝繭般,找到自己需要的內容。例如一套網站系統,涉及到註冊,登錄,用戶管理,文章發佈,商品更新,訂單管理,數據統計,倉儲銷售,這是一個非常龐大繁雜的系統,要完全吃下來, 非常耗費精力,可是黑客會把注意力放在輸入輸出上面,去找可能提權的地方,這麼做的效率是非常高的。


現在來講,如何做黑盒滲透。


所有黑盒,即便你不知道內部如何,但是必有輸入輸出,如果沒有輸入輸出,那麼再厲害的黑客也拿它沒辦法,但是話又說回來,一個系統沒有輸入輸出,那對任何人也毫無價值,所以說,一切系統,都是有可能被滲透的。


不同的輸入,可能會獲得不同的輸出,這是一切攻擊滲透的前提,這裡面大有學問,例如一個網站,我輸入正確的用戶密碼,就可以登錄成功,我輸入錯誤的用戶密碼,則會提示密碼錯誤,這就是根據不同的輸入給出的不同輸出,通過構造輸入內容,獲得輸出反饋,可以揣測系統的內部工作流程,甚至直接推斷出具體代碼


這不是一件容易的事,但也不是不可以做到


分享到:


相關文章: