- CTF快速上手:PicoCTF真題解析(Web篇)
- 李華峰
- 2712字
- 2024-04-22 11:58:33
2.1 Web應用程序的工作流程
1973年,美國開始將阿帕網(Advanced Research Projects Agency Network,ARPANET)擴展成互聯網。當時的互聯網和現在所看到的互聯網完全不同,不僅非常原始,傳輸速度也慢得驚人,但是卻已具備互聯網的基本形態和功能。此后互聯網在規模和速度兩個方面都得到了飛速的發展。
今天看似平常的網上購物、支付、瀏覽信息等操作都是基于互聯網實現的。但是如果當年沒有蒂姆·伯納斯·李提出萬維網這個創意,今天的人們可能正在通過其他方式來使用互聯網,那些人們耳熟能詳的Web應用程序也可能是另一個樣子。
互聯網最初的目的是實現信息的共享,通過互聯網連接在一起的計算機彼此間可以分享自己存儲的文件。人們可以像瀏覽自己的計算機一樣去查看其他人的計算機,但是當計算機中存儲的內容越來越多時,這顯然變成了一件令人十分苦惱的工作。設想一下,這個難度不亞于在春運期間的火車站里尋找一個走散的同伴。
蒂姆·伯納斯·李顯然不屑于做這種重復的工作,于是他將計算機中重要文檔的地址都進行了記錄,并以超文本的形式保存為一個文件。這樣人們只需要瀏覽這個文件,就能知道自己的計算機中都有哪些文件,以及這些文件都處于什么位置。但是這個文件還不能通過互聯網訪問。
到了1990年,蒂姆·伯納斯·李將歐洲核子研究組織(European Organization for Nuclear Research)的電話號碼簿制作成了第一個Web應用程序,并在自己的計算機上運行了它。網絡用戶可以通過訪問蒂姆·伯納斯·李的計算機來查詢每名研究人員的電話號碼。這個在今天看起來平淡無奇的想法,卻是改變人類命運的偉大發明。蒂姆·伯納斯·李為他的這個發明起名為World Wide Web(也就是WWW)。而他的計算機也成為世界上的第一臺Web服務器。至此,萬維網開始走上了歷史舞臺。
1991年,蒂姆·伯納斯·李又發明了萬維網的3項關鍵技術:
● 超文本標記語言(Hyper Text Markup Language,HTML);
● 統一資源標識符(Uniform Resource Identifier,URI);
● 超文本傳輸協議(Hyper Text Transfer Protocot,HTTP)。
這些規范時至今日仍然發揮著重要的作用。當然,僅僅憑借這3項技術并不能實現現在的Web應用程序,不過在萬維網剛剛誕生時,它們已經足夠用了。
當前的Web應用程序分為靜態和動態兩種類型,而在最初的萬維網時期,則只有靜態Web應用程序。當時的Web應用程序的工作原理很簡單,程序員只需按照HTML編寫靜態頁面并將其放置在Web服務器中。HTML十分簡單易學,它并不是一種編程語言,而是一種標記語言,依靠標記標簽來描述網頁。
如圖2-1所示,當用戶需要訪問這臺Web服務器中的index.html文件時,需要在自己的瀏覽器輸入目標URI。URI是標識某一互聯網資源名稱的字符串,Web服務器上可用的每種資源(如HTML文檔、圖像、視頻片段、程序等)都由一個URI進行定位。而人們平時使用的統一資源定位器(Uniform Resource Locator,URL)就是URI的一種實現。一個簡單的URL由以下3部分組成:
● 用于訪問資源的協議(如HTTP);
● 要與之通信的Web服務器的地址;
● 主機上資源的路徑。
當圖2-1中的Web服務器的IP地址為192.168.0.1時,用戶可以使用http://192.168.0.1/index. html這個URL來獲取上面的資源。這里的index.html就是主機上資源的路徑。如圖2-2所示,這個路徑看起來有些復雜,但是實際上與主機操作系統的目錄是相互關聯的。

圖2-1 放入Web服務器的靜態文檔

圖2-2 將個人計算機作為Web服務器時的目錄
這里以基于Windows操作系統的計算機為例,當其安裝了Web服務器軟件之后,就成為一個Web服務器。這個實例以Windows操作系統D盤下的WWW文件夾作為Web發布目錄,并將其進行了映射,訪問http://192.168.0.1/相當于在Windows操作系統下訪問D:\WWW\。所以,用戶同樣可以使用http://192.168.0.1/Test/test1.htm訪問計算機中的test1.htm文件。這里需要注意的是,Windows約定使用反斜線(\)作為路徑中的分隔符,UNIX和Web應用則使用正斜線(/)作為路徑中的分隔符。
Web服務器已準備完畢,現在切換到客戶端。萬維網的客戶端就是常使用的各種瀏覽器(如火狐、Google Chrome等)。客戶端的第一個功能是將用戶的請求按照HTTP標準封裝成報文發送給Web服務器,如圖2-3所示。
Web服務器接收HTTP請求后,會對其進行解析,并將其請求的資源返回給客戶端,如圖2-4所示。

圖2-3 按照HTTP標準封裝成報文

圖2-4 客戶端與服務端之間的通信
HTTP的請求和應答都是以數據包的形式傳輸的,但是在瀏覽器中看到和操作的都是十分直觀的圖形化頁面。這就要歸功于客戶端的第二個功能——解析Web服務器返回的HTTP應答,然后以常見的頁面樣式呈現出來,如圖2-5所示。

圖2-5 瀏覽器將HTTP應答解析為圖形化頁面
前面介紹的是靜態Web應用程序的情形,在這個實例中Web服務器的工作是接收來自客戶端的請求,對其解析后再將請求的資源以應答的方式返回給客戶端。在這種情況下,服務器所面臨的安全威脅主要來自操作系統(Windows和Linux操作系統等)和Web服務器程序(IIS和Apache等)的漏洞和錯誤配置等,而用HTML編寫的靜態頁面本身并不存在任何漏洞。由于沒有身份驗證機制,Web服務器所發布的內容本身就允許被所有人所訪問,同時也不會保存用戶的任何信息,因此并不存在信息泄露的危險。在這種情況下,Web服務器的安全維護難度相對較小。攻擊者所造成的破壞也只限于篡改 Web 應用程序頁面,或者讓Web應用程序服務器無法被訪問。
隨著萬維網的發展,單純使用靜態技術的 Web 應用程序顯得越來越無法滿足使用者的需要,其主要缺陷如下。
● 擴展性極差,如果要修改Web應用程序,必須重新編寫應用程序代碼。
● 純靜態的Web應用程序存儲信息時,所占用的空間相當大。
● 使用者只能對純靜態的Web應用程序進行讀操作,無法實現交互。
其中最后一點是最為致命,試想一下,如果現在十分流行的購物Web應用程序(如淘寶)上只能展示商品信息,但是用戶在客戶端既不能下單購物,也不能對商品進行評論,那這個應用程序還會有這么大的影響力嗎?
基于動態技術的Web應用程序的出現則有效解決了上述問題。動態技術需要使用專門的服務器端編程語言來實現,如PHP、JSP、ASP.net等。圖2-6給出了一個使用PHP語言編寫的簡單動態Web應用程序。

圖2-6 一個簡單的動態Web應用程序
這時的Web服務端除了用來響應客戶端請求的Web服務器軟件之外,還需要一個專門用來處理服務器端編程語言的解釋器,有時還會需要儲存數據的數據庫。由于Web應用程序采用的編程語言不同,服務器端的組織結構也有所不同。例如,使用PHP語言編寫的動態Web應用程序的服務器端組織結構,如圖2-7所示。
相比單純的靜態Web應用,動態Web應用程序中的網頁實際上并不是獨立存在于服務器上的網頁文件。只有當用戶請求時,Web服務器才會生成并返回一個完整的網頁。這樣既可以大大降低網站維護的工作量,還可以實現更多的功能。
但是PHP語言引擎、數據庫和動態Web應用程序的加入,導致服務端遭受攻擊的情況變得更加嚴重了,其中的重災區就是動態Web應用程序。目前用來開發動態Web應用程序的語言就有數十種,僅國內就有數以百萬計的動態Web應用程序發布到了互聯網上,它們的代碼質量參差不齊,其中不乏漏洞百出者。而動態Web應用程序本身的安全性往往又與程序員的個人能力息息相關。

圖2-7 使用PHP語言編寫的動態Web應用程序的服務端組織結構
- Rootkit和Bootkit:現代惡意軟件逆向分析和下一代威脅
- 走進新安全:讀懂網絡安全威脅、技術與新思想
- 反黑命令與攻防從新手到高手(微課超值版)
- 諸神之眼:Nmap網絡安全審計技術揭秘
- Python Penetration Testing Cookbook
- 解密彩虹團隊非凡實戰能力:企業安全體系建設(共5冊)
- End to End GUI Development with Qt5
- 信息技術基礎:提高篇·實驗與習題
- 數據安全架構設計與實戰
- 計算機網絡安全實驗指導
- Manga Studio 5 Beginner's Guide
- Metasploit 5.0 for Beginners
- 2023—2024年中國網絡安全發展藍皮書
- Web安全之機器學習入門
- 數據安全實踐:能力體系、產品實現與解決方案