熱騰騰的漏洞排行榜 2021 OWASP TOP 10

Hannah Lin
Starbugs Weekly 星巴哥技術專欄
13 min readMar 30, 2022
指標性機構 OWASP 歸納出容易攻擊的網頁安全弱點並彙整為十大資安問題、排名、防範措施。

OWASP TOP 10 平均 3–5 年會更新一次排行榜,上一次寫的 2017 OWASP TOP 10 蠻受好評,可能網路上資安文章普遍都像天書搬難懂,所以也想挑戰自己能寫出簡單易懂 2021 OWASP TOP 10 😃,希望就算不是工程師也能夠理解!文章內容會盡量舉生活中的例子,其中些許跟 2017 有重覆到,但大部分都是更新過的。

此文只能算是很粗淺的介紹,若實際想深入看程式碼的範例還有解決方案可以點擊 OWASP 官網,每一個排行都很清楚列出 How to prevent、Scenerios、Mapped CWEs。

L: OWASP TOP 10 / R: OWASPCheat Sheet Series

另外也很推薦把 OWASP Cheat Sheet Series 放到書籤裡,他集合超多優秀工程師把弱點整理並列出,每個分類底下也有很詳細的攻擊範例。

2017 vs. 2021

OWASP TOP 10 for 2021 在分類跟名字上有一些變化,也有新分類擠進排行榜裡。

黃色: 跟其他類別做了合併

若從來沒看過 2017 OWASP TOP 10 其實也不用回頭去看了,畢竟 2021 的版本才是最新也最需要知道的弱點。

A1 Broken Access Control 嘿嘿,我看到不該看的東西

This exposure occurs when confidential information is viewed by a user who should not have permission to access that data.
機密資料被沒有授權的人察看、修改、刪除

正確的 Access Control 就是確保機密資訊可以被哪些人看到而哪些人不行,例如下圖公司 HR 可以看到所有人薪水; 員工只能看到自己薪水; 駭客則是什麼都看不到

但若因為 Broken Access Control 而讓本來不該看到的的人查看了機密資訊,就產生了漏洞

駭客看到公司內部資訊; 一般員工看到 admin 才能看到的資訊都是 Broken Access Control

Daily Scenario

  • HR 把所有員工的地址電話 (機密資訊) 留在印表機裡忘了拿出來,被一般員工/外送人員看到 (被沒被授權的人察看) 也是 Broken Access Control
  • HR 不小心把所有員工的地址電話(機密資訊)用 email 寄給所有人 (被沒被授權的人察看)

前端可以做得事

  • 僅打開面向外部網路的HTTP/HTTPS,不要連設定檔或其他檔都能讓駭客存取
  • 確保任何機密資訊都不要放在公共場合 / 公開網站

A2 Cryptographic Failures 防君子不防小人的保護

敏感資料保護度不足,使得駭客入侵系統後輕易竊取達成詐欺冒用等犯罪行為

什麼是敏感資料? 只要是不能公開的資料,就是敏感資料。例如你的信用卡資料、醫療紀錄、公司機密、個人資訊等等。越機密的資料需要受的保護就越多 (受妥當的加密保護)。

可以做得事

  • 若你沒必要儲存機密資料,就不要存 (這樣就不會被偷走)例如網購時網站會叫你存信用卡資訊,你可以選擇不要存,甚至直接經由第三方加密網站 (paypal, google pay ) 處理你的付款會更加安全
  • 如果一定要存敏感資料,記得要加密
  • 使用 SSL 加密連線進行資料傳輸
  • 以加密、雜湊(hash)等方式保存敏感資料,例如帳號密碼
  • 檢查系統防火牆規則設定,限制所需的連接埠,定期查看內部是否有對外大量不同目的 IP 之異常連線,與帳號活動。

A3 Injection 偷偷串改造成語意改變

When an application accepts data as input and processes it as instruction
偷偷串改造成語意改變就是 Injection。XSS 也被合併到這個分類底下

Daily Scenario

你幫狗狗在領養表格上的名字欄取名叫 sit (input)。但這很 confused ,因為 sit 像是一個指令,所以當你只是想叫狗狗名字 Hello, Sit,你狗狗就會坐下

Cross-site scripting

Cross-site scripting 也在這個分類裡。web 裡面有無數個 input 可以被輸入 (包含網址列、form 表等等),所以當網站沒有做好的驗證,就可以讓駭客輕易輸入惡意程式碼在網站上,埋下一個地雷,讓點擊到該網站的其他使用者受到攻擊。

關於 XSS 太多東西可以說,也是前端工程師一定要知道的,有另外寫過文章介紹,有興趣可以參考。

SQL Injection

SQL Injection 就是駭客透過修改 SQL 來改變他原本語意,達到竊取資料/破壞資料的行為。

以登入這個簡單例子來說,若程式邏輯是只要輸入框滿足條件 (等於 true) 就可以拿到使用者資料,那駭客就算不需要知道使用者真實密碼也可以藉由 SQL Injection 輕易拿到使用者資料

上圖呈現是為了好理解,真正 SQL 語法如下

SELECT user_data FROM user_table
WHERE user_name = 'hannah'
AND paswword = 'xx' or 1=1 --'

A4 Insecure Design 地基打不穩,再好的建材都沒用

Focusing on risks related to design and architectural flaws

這個分類很特別,因為大部分的漏洞排行都是 focus 在 code level 的 bug 漏洞,但這個分類卻聚焦在 design level flaw type

Daily Scenario

電影院提供團體折扣,可以預定 15 人以內座位並且不需要預付押金,惡意人士就可以申請 N 個帳號把 600 人座位全部先預定下來並且不支付任何金錢,讓電影院造成巨大收入損失會造成這項損失就是在設計時就有缺陷才讓有心人士鑽漏洞

Web Scenario

網站安全上若把敏感資訊暴露在 error message 或是把 password 用 plain text 存在 client 端也都是 Insecure Design

A5 Security Misconfiguration 我的密碼是 1234

Application is without a concerted, repeatable application security configuration process. 系統管理或配置不當所造成的安全性漏洞。

Daily Scenario

  • 出門上班但忘了鎖家裡的門
  • 開車沒繫安全帶

Web Scenario

  • 系統預設帳密未更新
  • 錯誤的配置HTTP標頭
  • 偵錯模式(Debug)未關閉,導致錯誤訊息中包含的敏感性個資外流都包含在內

可以做得事

系統應該要 follow CIS(Center for Internet Security) guidelines,它針對一些常見的系統制定了一套安全配置指南,可以降低安全性漏洞的產生

A6 Vulnerable and Outdated Components 不更新就會引狼入室

Don’t know all the versions of all the components you use (and) if the software is vulnerable, unsupported, or out of date.
若沒有更新潛藏危險的舊套件就會被攻擊

Open source 風氣在這幾年非常盛行,為達到快速產出,工程師們也很習慣直接使用這些元件 (元件包括函示庫、框架以及其他的軟體模組)。但在選擇使用何種 Open source 時,會以好不好用為優先而忽略潛在的資安漏洞。

如果有一個容易受到攻擊的元件被駭客利用,就會導致使用這些元件的系統也有可能被駭客侵入。

Daily Scenario

若你使用已有白蟻著的木頭 (潛藏危險的元件) 蓋房子,那最後整間房子都會是白蟻

在美國看到這種 Termite Tenting 就代表整間屋子都在殺白蟻…

可以做得事

即時更新隱藏危險的套件自己公司是用 snyk,我在 create PR 時他就會幫我 check 有沒有 vulnerable package,若有就必須要更新到安全版本才能 release

A7 Identification and Authentication Failures 你以為是我但其實不是我

Confirmation of the user’s identity, authentication, and session management is critical to protect against authentication-related attacks.
網站必須確認你是真的的你,不然若身分認證有缺陷,就能導致駭客竊取相關機密資訊

Scenario: 登入

Cookie 就像一張通行證,通行證裡面會存有一組 Session ID 來驗證你身份,就像你加入某某俱樂部一樣,認卡不認人,誰擁有這張通行證就可以進入俱樂部。

一般來說 Server 會創立 Session,儲存 Session ID,並回傳 cookie 給瀏覽器。若使用者登入時的 session ID (通行證) 跟 Server 的 session ID 相同就可以成功登入

最容易理解的例子就是你在公共電腦登入之後忘記登出就離開電腦,駭客直接取用你的登入資訊 (拿走你的通行證)

另外透過錯誤使用身份認證和會話(Session)管理功能,攻擊者能夠破解密碼或竊取 Session Token,或者利用其它開發漏洞來暫時性或永久性冒充其他用戶的身份。

用 http 連線而不是 https,或是用免費 wifi 讓駭客從中竊取
透過 XSS 盜用 cookie

Session 處理流程的最佳實踐有下列幾點

  • 確保用 HTTPS 連線,避免封包被監聽導致密碼外洩
  • Client 端的 validation 都是無用的,因為使用者可以透過開發者工具改變,所以 Server 端一定要再做一次驗證
  • 確保程式碼沒有 SQL Injection 漏洞
  • 確保 cookie 設定為 HttpOnly (無法被 JavaScript 存取) 且 Session ID 應為不可被預測的
  • Session ID 不應該是固定不變且需要有時效性

Scenario: 忘記密碼

若點選忘記密碼,網站就叫你提供信箱把密碼寄給你,那就是沒有驗證你真的是你。比較安全的做法是直接寄驗證碼到當初使用者留的信箱,再讓使用者自己重設新密碼。

A8 Software and Data Integrity Failures 我只管好不好用不管安不安全

An insecure CI/CD pipeline can introduce the potential for system compromise. Many applications now include auto-update functionality, where updates are downloaded without sufficient integrity verification.

雖然自動化很棒,但可能會帶來潛在的安全漏洞,所以還是要再完整的安全驗證下再更新比較安全。

Scenario

巧克力是由麵粉、糖、可可等等製作的,若可可的品質很差,那做出來的巧克力品質一定也會大受折扣。

以上例子對應到軟體,現在網站系統多數由 plugins、libraries、framework 所組成,若其中一個 plugin 有漏洞那勢必整個系統都有可能受到攻擊

Insecure Deserialization

2017 的 A8 Insecure Deserialization 也被合併在此分類下,Deserialization 指得是將格式化的資料轉回原本,但若在轉回之前被插入一些惡意程式碼,網站可能就會被攻擊

A9 Security Logging and Monitoring Failures 監控室沒人

Without logging and monitoring, breaches cannot be detected.

大部分的攻擊都是有跡可循的,例如來自特定來源的失敗登錄嘗試太多或在沒有預期的情況下出現高峰流量等等。不要等發生事情才來處理,應該要平常就做好監控 / 定期掃描,系統出現可疑行為就要趕快處理。

Daily Scenario

舊金山有很破車窗偷東西事件,通常都會派一組人看車門有沒有鎖、車裡有沒有貴重物品等等。然後看好目標車再利用第二組人馬下手。若先偵測可疑人士/車門,或是車主忘記鎖門就提醒車主,就可以再犯人犯案之前抵達現場防止被偷。

A10 Server-Side Request Forgery (SSRF) 項莊舞劍,意在沛公

SSRF flaws, allow attacker to coerce the application to send a crafted request to an unexpected destination.
攻擊者假裝成使用者發送 request 去攻擊 server

圖來自: 程式猿吃香蕉

SSRF 終於擠進前弱點排行了,之前曾經看果兩篇很不錯又淺顯易懂文章,很建議可以參考

--

--