練習 51: lessweb
lessweb
原文: Exercise 51: lessweb 譯者: 飛龍 協定: CC BY-NC-SA 4.0 自豪地采用 谷歌翻譯
我們很接近這本書的末尾了,是以在最後兩個練習中我将給你一個項目。您将要建立一個 Web 伺服器。在本練習中,您隻需了解 Python
http.server
子產品以及如何建立簡單 Web 伺服器來使用它。我将給你訓示,然後讓你閱讀文檔來了解如何實作它。這裡沒有太多的指導,因為現在你應該可以自己做大部分的事情。
建立 Web 伺服器後,您将會編寫一組測試,來嘗試破壞您的 Web 伺服器。我将在“破壞它”部分中為您提供一些指導,但現在您應該非常樂意在您編寫的代碼中找到缺陷。
挑戰練習
您需要閱讀 Python 3 的
http.server
文檔來起步。您還應閱讀 Python 3 的
http.client
文檔以及
requests
的文檔。您将使用
requests
或
http.client
為您建立的
http.server
編寫測試。
接下來,您的工作是使用
http.server
建立一的 Web 伺服器,可以執行以下操作:
- 從配置檔案中進行配置
- 一直運作并處理收到的請求
- 提供配置目錄中的檔案
- 響應網站的請求并提供正确的内容
- 記錄所有進入檔案的請求,以便之後讀取
如果您閱讀文檔中的示例,您大概可以以基本的方式,讓大部分東西都工作。這個練習的一部分是,如何 Hack 一個樸素的 Web 伺服器,是以你應該隻是讓它能夠工作,然後我們将轉到下一部分。
破壞它
您在本節中的工作是,以任何方式攻擊您的 Web 伺服器。您可以從
OWASP 十大漏洞清單開始,然後繼續進行其他常見攻擊。您還将閱讀 Python 3
os
子產品文檔來實作一些修複。這是一個額外的錯誤清單,我敢肯定你會犯這些錯誤:
- 非預期的目錄周遊。您可能從URL(
)中擷取基本路徑,僅僅按照請求打開它。也許你在作業系統上添加了檔案的完整路徑(/some/file/index.html
),并認為你做得很好。嘗試使用/Users/zed/web/some/file/index.html
路徑說明符來通路此目錄外的檔案。如果你可以請求..
,那麼你赢了。嘗試解釋為什麼會發生這種情況,以及您可以如何解決這個問題。/../../../../../../../../etc/passwd
- 沒有處理非預期的請求。你最有可能尋找
和GET
,但如果有人執行POST
HEAD
,會發生什麼?OPTIONS
- 發送一個巨大的 HTTP 協定頭。看看您是否可以通過發送一個非常大的 HTTP 請求頭,使 Python
崩潰或減慢速度。http.server
- 請求未知域時不會出現錯誤。有些人認為它是一個功能(咳咳,Nginx),當伺服器無法識别域時,會提供“随機”網站。您的伺服器應該隻是白名單,如果它不識别該域,它應該給出 404 錯誤。
這些隻是人們所犯的一些小錯誤。研究盡可能多的其他人,然後為您的伺服器編寫自動化測試,以便在您解決問題之前展示它們。如果您的伺服器中找不到任何這些錯誤,那麼故意建立它們。了解如何犯下這些錯誤也是有益的。
研究性學習
閱讀
Python 3os
文檔 中的
os.chroot
函數。
研究如何使用這個函數和其他
os
子產品的函數來建立“根目錄限制”。
使用
os
中的許多函數以及您可以找到的任何子產品,重寫您的伺服器,來正确地實作“根目錄限制”,并丢棄權限變成安全使用者(而不是 root)。在 Windows 上,這可能非常困難,是以要麼在 Linux 計算機上嘗試,要麼完全跳過它。