相關學習推薦:javascript
你的Web系統真的安全嗎?
在Web系統中,一個小小的漏洞,往往能引發極為嚴重的後果。因此,Web安全性是每個系統在設計、開發、維運時必須要重點考慮的問題。
現今許多Web系統所採取的防禦措施是偏向基礎和簡單的,往往只針對常見的安全漏洞做了防禦,例如:
#等等。這些基礎的防禦措施是必須要做的,且實施的成本不高,但它們只是系統安全防禦中的基礎部分。很多開發人員在意識中認為做好這些就足夠應付大部分情況了,這種想法是非常危險的。實際上,除了這些基礎且標準化的漏洞,每個業務系統本身的業務邏輯也很有可能成為駭客攻擊的目標,一旦被抓到並攻破,後果將是非常嚴重的。以下將列舉一些常見的商業邏輯漏洞,這些漏洞也是先前開發系統時踩過的坑,希望能對大家有所啟發。
我們都知道HTTP本身是無狀態的,為了能讓瀏覽器和伺服器互相知道身份並信任對方,大部分web系統都是利用“token”這種約定的憑證來實現的,token會在使用者登入之後產生,並在使用者主動登出或超過一段時間後失效。也就是說,請求帶了對應的token,那麼服務端就能拿到token做相應的校驗,校驗通過則信任該請求並執行相關業務邏輯,如果沒帶、帶一個非法的或者過期的則認為不合法。這看起來並沒有什麼問,但實際的實作上可能暗藏漏洞。
來看兩個例子:
1.前端開發人員小明在寫使用者點選退出按鈕的邏輯時,只是單純的清空了cookie或localstorage中的token值(token一般存這兩個地方),並沒有向後台發起請求讓token在業務中過期失效。那這個token的有效性本質上違背了使用者的意圖,此時就存在非常大的風險。當用戶自發性退出後,token仍然有效,假如該token被他人透過某種方式獲取並記錄下來,那他可以完美的回放用戶執行過的操作,比如更改用戶信息,下單等。
2.在上面的例子中,我們有提到token是要設定過期的,合理的過期時間能有效降低風險。但後台開發小哥也許在設定token過期的配置中,眼花加手抖,多打一位數,或者把單位理解錯,在S級單位上用了MS級的數值,那過期時間就會被設定的很長。對於登入之後就不喜歡主動登出或長期掛著頁面的使用者就非常的危險。 token在用戶長期不使用的情況下依然有效,如果被他人拿到token,也能幹很多的壞事。
檔案上傳應該是Web應用程式上比較常用的功能,例如上傳頭像,上傳檔案到網盤等等。惡意使用者可能會在上傳的時候,上傳木馬、病毒、惡意腳本等文件,這類文件在伺服器上被執行會帶來較嚴重的後果。這種攻擊方式成本較低,比較容易被攻擊者利用。允許上傳的檔案類型越多,受攻擊的可能性就越大。當惡意程式被成功上傳後,可能會被使用者下載,在使用者電腦上執行後使之中毒。也可能在伺服器上就執行惡意程序,造成伺服器被控制,進而伺服器癱瘓,資料遺失。
正常情況下,程式都會對檔案類型進行判斷,只允許我們認為合法的檔案上傳到伺服器。但是,這個判斷在某些web程式中,只在前端做了,後端沒做。這就為攻擊者帶來了機會,攻擊者可以輕鬆的串改請求,從而實現非法檔案的上傳。
正確的做法應該是後端進行檔案副檔名判斷、MIME偵測以及限制上傳檔案大小等限制來防禦。另外,可以將檔案保存在一個與業務隔離的伺服器來防止惡意檔案攻擊業務伺服器導致服務不可用。
在登入系統,大部分系統會在使用者登入的時候判斷使用者是否存在,然後給予提示「該手機號碼未註冊」。如果這個邏輯是用一個單獨的介面做的,那麼就會存在被暴力列舉的風險。攻擊者可以透過該介面利用手機號碼庫進行請求枚舉,識別出哪些手機號碼是在系統中註冊過的,為下一步暴力破解密碼帶來機會。
對於這個問題,建議是將該判斷放到登入驗證的介面中,並不會回傳明確的提示。你會看到做的好的網站上,通常會提示「該手機號碼未註冊或密碼錯誤」。雖然這在用戶體驗上打了折扣,但也更加的安全。
以一個論壇的發文舉例,利用抓包工具抓取論壇發文的請求過程,並透過該工具重播過程,會發現貼文清單出現了兩條一樣的帖子,這就是被重播攻擊了。如果加快重播頻率,不僅會在系統中產生大量的垃圾數據,還會因為頻繁寫入而給業務資料庫帶來巨大壓力。
對於此類有重播風險的請求,建議加上請求頻率限制。例如,可以判斷兩個請求的時間戳,設定大於某個時間值才有效。
權限校驗是Web系統的基本功能,例如一個公司組織架構管理系統,裡面提供了修改部門名稱、部門經理的功能。加上權限校驗能很好地避免任意使用者能透過這些功能修改他本無權限的資訊。這類系統中一定會實現權限校驗,但實際上真的實現對了嗎?
假設我們規定,系統中某使用者需要同時滿足具有超管權限且屬於A部門兩個條件,才能修改部門名稱。往往在實際的程式碼實作中,開發人員只是去判斷該使用者是否為超管,而沒有判斷該使用者是否屬於該部門。在這種情況下,我們可以用B部門的超管帳號,去修改A部門的名稱,相當於越權修改了,這顯然不是我們所期望的結果。即使B部門的超管使用者在介面上找不到修改A部門部門名稱的入口,也可以透過抓取請求修改參數來實現。
除了越權修改,當然還能越權查看。我們一定也不期望A部門的超管能看到B部門的部門訊息,是不是?
建議大家的系統要對使用者存取角色的權限進行嚴格的檢查及限制。
安全無小事,如同一開始所講,任何一個漏洞都有可能帶來毀滅性的打擊,希望大家能重視。不僅在業務設計上要重視,同時也要在程式碼審查上要重視,以避免因實作而帶來的低階漏洞問題。
以上只是舉了眾多安全漏洞中的一小部分,更多嚴重的Web應用程式安全風險可以查閱 OWASP Top 10 2017 發布的Top10安全問題。 www.owasp.org.cn/owasp-proje…
以上是使用JS檢測,你的Web系統真的安全嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!