Java web應用中的安全問題整理
背景
幾年前在CSDN的C幣商城換購過一本《白帽子講Web安全》,瞭解過Web網站在滲透測試過程中常見的安全問題。近來,自己開發的Java Web應用中存在一些安全漏洞,被迫要求關注這些安全隱患、並加固。
那麼本文就順便整理一下Java Web開發過程中容易忽略的幾個安全問題吧,這些問題都能搜到,並且加固方式也不復雜。初學者或者對安全要求不高的開發流程中,很可能被忽略。
密碼明文傳輸
當年初學Java Web時,簡單的資訊管理系統中,根本沒有安全意識。僅僅靠表單的password型別掩蓋了密碼的表面形象而已。
但是,在實際應用中,這是個大問題,最初也知道這個問題,只是鑑於應用使用者較少,而且只能處於內網環境中,就直接忽略了。但是表單中明文傳送密碼,的確不應該。最簡單的方式是密碼通過js加密傳遞到後臺,然後Controller校驗時直接取資料庫中的密文進行匹配。
使用者名稱被猜中
這個問題可能出現在密碼校驗邏輯中:校驗結果的不同分支,返回給頁面提示資訊不同,密碼錯誤和使用者名稱不存在是兩個不同分支中的。這樣依一來,居心叵測者就可能通過多次輸入並提交而猜中系統中可能存在的使用者名稱。
這一點,Linux使用者,Oracle使用者,資料表的校驗,處理都很高明,能預防敏感資訊洩漏。(這點沒有考證,初入職場時的入職培訓老師講過這些,印象較深刻,整理本文時就想起這幾方面了。如有錯誤,歡迎指正!)
1 Linux的登入錯誤提示資訊是統一的:使用者名稱或密碼錯誤!
2 檔案目錄一旦輸入錯誤:統一提示檔案或目錄不存在的。
3 Oracle資料庫查詢操作查詢時,如果表名稱錯誤,提示資訊是表不存在。
檔案上傳
檔案上傳最好使用專門的檔案伺服器,與當前web應用隔離開。如果條件不允許,應該用獨於Web應用部署目錄之外的目錄,這樣攻擊者就不能通過web伺服器內部的目錄結構獲取使用者上傳的檔案資訊了。
其次,對上傳的檔案的校驗,處理頁面空間的限制外,後臺Controller也許要對對檔案進行校驗,比如檔名或這檔案內容。因為攻擊者傳送的請求不是通過頁面完成的,而是模擬表單請求的話,檔名稱就可以是任意的。
所以,後臺也應該對使用者請求中的上傳檔名稱進行校驗,保證只有系統允許的檔案內容才能被處理。
檔案下載
凡是涉及到檔案下載的地方,應該提高安全意識,編碼過程中,校驗下載檔名稱。應用下載檔案的根目錄應該是固定的,而且檔名稱只能是最終名稱,不能包含路徑“.”的。
如果一個檔案下載請求中,直接使用使用者請求的fileName引數,而不經過任何安全校驗的話,那麼不法分子就可能通過上述模擬請求下載到Linux伺服器的密碼檔案。
加固措施為:校驗檔名稱引數,不能是包含路徑的檔名稱,只能是簡單名稱或者路徑固定,即專案指定存放下載檔案的路徑。
表單輸入校驗
不能對使用者的輸入過於信任,所有的需要使用者輸入的地方,應該新增驗證。例如:使用者可以在一個input表單中輸入js程式碼:
<script> alert(new Date());
</script>
這就是典型的CRSF,跨站請求偽造;此外,如果一個input輸入框裡面,使用者輸入了html標籤
</button>
而後臺又沒有進行任何攔截處理,那麼該表單資料回顯的時候,頁面就會多一個button按鈕了。
解決辦法:可以在前端統一對頁面的input進行限制不能輸入html標籤;然後在Controller層使用Filter,對使用者輸入的請求頭域的資料進行預處理,攔截或者過濾輸入資訊中的有害資料。
重要模組的CRSF
在任何一個登入後的頁面上,進入一個敏感資料新增頁面如:使用者新增頁面。輸入表單資訊之後,將頁面原始碼扒下來,儲存htm檔案,點選htm檔案的表單提交,就可以通過CRSF表單提交資料到指定伺服器。
敏感資訊的所有操作應該新增token資訊,這點我想起了微信工作平臺開發API中,所有的操作都是需要Token資訊的,那麼這裡Token的作用應該是一樣的,防止攻擊者偽造表單請求。
伺服器版本資訊洩漏
下圖404頁面,開發過程中經常見到,但是它會對Web應用造成什麼威脅呢?
顯然,它洩漏Web應用伺服器的資訊。攻擊者在知道應用的伺服器資訊後,就可能利用對應版本的伺服器的漏洞,發起進一步攻擊行為。
這個問題主要是web應用的404、500等常見錯誤頁面資訊的配置不當導致的。增強安全意識,應該避免使用伺服器預設的錯誤頁面資訊,在web.xml中增加自定義的錯誤頁面配置資訊。
<!-- 配置系統錯誤顯示的頁面 -->
<error-page>
<error-code>500</error-code>
<location>/error/500.html</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error/404.html</location>
</error-page>
啟示錄
安全是一件大事,如果一點都沒有注意的話,我們的Java Web應用是不是分分鐘就能被攻擊者黑掉呢?
想起以前遇到過iteye這個網站被黑掉新增很多垃圾資訊的情況.
樹立安全意識,Too simple ! Too dangerous!