OWASP
資訊安全

什麼是『OWASP』?

誰是 OWASP® 基金會?

OWASP foundation 是一個致力於提升軟體安全的非營利組織。透過社群領導的open source 軟體計畫,有上百的地方學會 (包括 非、亞、大洋洲、歐洲、北美洲、南美洲、美國)成千上萬的成員,還有領導教育和訓練研討會。OWASP組織提供開發者和技術人員資源去保護他們的網站
OWASP 全名為 Open Web Application Security Project 「開放式Web應用程式安全專案 」,OWASP基金會針對Web應用程式漏洞和攻擊趨勢進行深入研究,建立了一套軟體安全行業指南和標準。
其中,OWASP Top 10 是最受歡迎和使用最廣泛的Web應用程式安全意識指南。

上圖為2013 ➝ 2017年 安全指標的浮動
就今日已經有 OWASP TOP 2021 了,下回有機會再與大家分享
以下將介紹從 2017 年A1 到 A10 的簡單範例分享

A1 Injection 注入攻擊

  1. 這除了是 2017 版的第一名,同時也是 2013 版的第一名。廣為人知的是 SQL
  2. Injection,通常會發生在惡意程式輸入時;主要是因為沒有經過妥善的檢查、排除符號等,所造成的弱點風險。
  3. 可能造成洩漏機敏資料(A3),讓竊取者可讀取資料庫,或進而發生作業系統漏洞,執行系統指令,甚至讓主機被竊取者接管等等。

建議的控制措施為:

  1. 使用 Prepared Statements(MySQL), Stored Procedures (SQL Server)。
  2. 嚴密檢查所有輸入值。
  3. 控管錯誤訊息僅管理者可以閱讀。
  4. 使用過濾字串函數過濾非法的字元。
  5. 控管資料庫及網站使用者帳號權限。

Prepare Statement

例如下方範例, username, pwd 是兩個輸入參數因此在進行 SQL 執行時, username 與 pwd 永遠只會被當作參數來處理,而不會變成整個 SQL 語句中的一部分這樣才能夠有效防止 SQL injection.

由上圖可見 username 與 pwd 的參數輸入直接與 SQL 語句字串,也就是說只要未將username或pwd進行處理,讓駭客在輸入時插入非法的sql語句就有可能導致資料庫系統損壞。

上圖可見,username, pwd 是兩個輸入參數,即可透過過濾字串函數過濾非法的字元。

Stored Procedures

StoreProcedure使用動態SQL撰寫時,需注意權限的設定

  1. 當使用exec直接執行SQL述式時

只要設定StoreProcedure的執行權限即可

  1. 但若透過sp_executesql執行

除了須設定StoreProcedure的執行權限外,也要設定Table相對應的使用權限才可正常行
接下程式碼為例,是進行select的動作,所以也要開啟可對Customers資料表 select 的權限才可正常執行。

➝將 條件值以組字串的方式執行,會有SQL Injection的問題

A2 Broken Authentication 無效的身分驗證

  1. 發生 Broken Authentication 風險通常是脆弱的帳戶認證,或是採取了不安全的管理機制。例如:登入未加密、Session 無控管 Cookie 為保護等。這容易造成帳號 / 身分盜用,或身分認證機制無效化,讓有心人士可肆意在伺服器做任何新增修改刪除查詢,進而接管主機等。

建議的控制措施為:

  1. 使用完善的 Cookie Session 保護機制。
  2. 不允許外部 Session。
  3. 登入及修改資訊頁面使用 SSL 加密。
  4. 設定完善的 Timeout 機制。
  5. 多因素認證。
  6. 驗證密碼強度及密碼定期更換機制。

什麼是 Session?什麼是 Cookie?

  1. Cookie 是網站在瀏覽器中存放的資料,內容包括使用者在網站上的偏好設定、或者是登入的 Session ID。
  1. Cookie 既然存放在 Client 端,那就有被竊取的風險。例如透過 Cross-Site Scripting(跨站腳本攻擊,又稱 XSS),攻擊者可以輕易竊取受害者的 Cookie。如果 Cookie 被偷走了,你的身份就被竊取了。

Session 攻擊手法有三種:

  1. 猜測 Session ID (Session Prediction)
  2. 竊取 Session ID (Session Hijacking)
  3. 固定 Session ID (Session Fixation)

Session Prediction(猜測 Session ID)

Session ID 如同我們前面所說的,就如同是會員卡的編號。只要知道 Session ID,就可以成為這個使用者。如果 Session ID 的長度、複雜度、雜亂度不夠,就能夠被攻擊者猜測。攻擊者只要寫程式不斷暴力計算 Session ID,就有機會得到有效的 Session ID 而竊取使用者帳號
分析 Session ID 的工具可以用以下幾種

  1. OWASP WebScarab
  2. Stompy
  3. Burp Suite

防護措施
使用 Session ID 分析程式進行分析,評估是否無法被預測。如果沒有 100% 的把握自己撰寫的 Session ID 產生機制是安全的,不妨使用內建的 Session ID 產生 function,通常都有一定程度的安全。

Session Hijacking (竊取 Session ID)

竊取 Session ID 是最常見的攻擊手法。攻擊者可以利用多種方式竊取 Cookie 獲取 Session ID:
1. 跨站腳本攻擊 (Cross-Site Scripting (XSS)):利用 XSS 漏洞竊取使用者 Cookie2. 網路竊聽:使用 ARP Spoofing 等手法竊聽網路封包獲取 Cookie3. 透過 Referer 取得:若網站允許 Session ID 使用 URL 傳遞,便可能從 Referer 取得 Session ID

第一招受害者已經登入網站伺服器,並且取得 Session ID,在連線過程中攻擊者用竊聽的方式獲取受害者 Session ID。

第二招攻擊者直接使用竊取到的 Session ID 送至伺服器,偽造受害者身分。若伺服器沒有檢查 Session ID 的使用者身分,則可以讓攻擊者得逞。

防護措施

  1. 禁止將 Session ID 使用 URL (GET) 方式來傳遞
  2. 設定加強安全性的 Cookie 屬性:HttpOnly (無法被 JavaScript 存取)
  3. 設定加強安全性的 Cookie 屬性:Secure (只在 HTTPS 傳遞,若網站無 HTTPS 請勿設定)
  4. 在需要權限的頁面請使用者重新輸入密碼

第三招攻擊者誘使受害者使用特定的 Session ID 登入網站,而攻擊者就能取得受害者的身分1. 攻擊者從網站取得有效 Session ID2. 使用社交工程等手法誘使受害者點選連結    使用該 Session ID 登入網站3. 受害者輸入帳號密碼成功登入網站4. 攻擊者使用該 Session ID,操作受害者的帳號
防護措施

  1. 在使用者登入成功後,立即更換 Session ID,防止攻擊者操控 Session ID 給予受害者。
  2. 禁止將 Session ID 使用 URL (GET) 方式來傳遞

Session Fixation(Session固定攻擊)

  1. 方法一:Session ID透過URL參數指定
  2. 攻擊者試圖讓受害者點選他所提供的超連結
  3. 方法二:Session ID由表單隱藏欄位指定
  4. 攻擊者會設法讓受害者填寫含有指定session ID的登入表單,可能是使用仿造的網站或者利用Cross-site scripting弱點。
  5. 方法三:Session ID由Cookie傳送
  6. 攻擊者要設法在受害者的瀏覽器設定含有Session ID的cookie。常見方法如下:
  7. 使用客戶端程式語言指定cookie值
  8. 透過XSS的漏洞,設定document.cookie值。如 http://unsafebank.com/<script>document.cookie=“sessionid=1234”;</script>
  9. 使用<meta>標籤來設定cookie
  10. 伺服器可以在回應的Http標頭裡使用<meta>的標籤來設定瀏覽器的cookie值,如<meta http-equiv=Set-Cookie content=“sessionid=1234”>。攻擊者可透過Meta tag injection來達成這個目的。
  11. 使用set-cookie來設定cookie
  12. 想辦法在回應的http標頭裡包含Set-cookie的header

Session 防護 – 檢查個人識別資訊每個使用者在登入網站的時候,我們可以用每個人特有的識別資訊來確認身分:

  1. 來源 IP 位址
  2. 瀏覽器 User-Agent

如果在同一個 Session 中,使用者的 IP 或者 User-Agent 改變了,最安全的作法就是把這個 Session 清除,請使用者重新登入。雖然使用者可能因為 IP 更換、Proxy 等因素導致被強制登出,但為了安全性,便利性必須要與之取捨。
Session 防護 – Session ID 的防護方式
每個使用者在登入網站的時候,我們可以用每個人特有的識別資訊來確認身分:

  1. Cookie 設定 Secure Flag (HTTPS)
  2. Cookie 設定 HTTP Only Flag
  3. 成功登入後立即變更 Session ID

Session 防護 – Session 清除機制時機
當伺服器偵測到可疑的使用者 Session 行為時,都應該立刻清除該 Session ID以免被攻擊者利用。

  1. 識別資訊無效時
  2. 逾時
  3. 偵測到惡意嘗試 Session 

A3 Sensitive Data Exposure 機敏資料外洩

  1. 當資料未加密、或使用脆弱的金鑰時,容易使得密碼被攻破,造成機敏資料外洩的風險,將重要資料暴露在危險之中。常見於網路應用程式對於資料的保護不足,若駭客取得這些金融資訊、個人資料,即可偽造 / 竊取身分,或進行其他的犯罪行為。

建議的控制措施為:

  1. 備份檔、開發版本不應出現於正式機上 
  2. 使用完善的 Cookie Session 保護機制。
  3. 軟體中已經被識別的機敏資料,於實作階段應考量於傳輸時、儲存時、備份後,採用加密作法。
  4. 使用國際機構驗證且未遭破解的演算法,不使用自行創造加密方式。
  5. 盡可能使用該演算法支援的最大金鑰長度。應對金鑰進行適當保護,金鑰應定期更換。

A4 XML External Entities (XXE) [NEW] XML 外部處理器弱點

此項目為 2017 年新進榜,主要因為以 XML 為基礎的網路應用程式沒有做好管控權限,直接讀取外部資源提供的 XML 檔案。故攻擊者可以利用 XML 為基礎,讓系統讀取後,進行文件的共享、監聽內部網路、執行遠端城市,進而導致資料外洩,或系統被駭客接管。
建議的控制措施為:

  1. 修補或升級有引用的套件,並將 XML 升級到最新。
  2. 驗證 XML 或 XSL 文件是否經 SCD 驗證會類似方法傳入。
  3. 禁止外部實體引用。
  4. 以 PHP 為例,在程式碼中加入libxml_disable_entity_loader(true);即可防止 parser 處理外部實體

XML External Entities (cont.)

什麼是 XML ?

  1. Extensible Markup Language,簡稱:XML。跟 HTML 一樣同為是標記式語言。
  2. 為目前 XML 訊息主要用來簡化網頁伺服器訊息傳遞的標準化格式

什麼是 SOAP ?

  1. 簡單物件存取協定 (Simple Object Access Protocal,SOAP)

案例一 – 文件包含漏洞 Local File Inclusion

  1. 一個簡單網站頁面,要求輸入一個暱稱,輸入後發現他是以 XML 格式傳遞資料。
  1. 假設額外宣告一個實體 xxe,目的是輸出本機資料夾中的密碼檔,並將原本丟出暱稱的位置更改成實體名稱。
  1. 沒有禁止解析外部實體的狀況下就會獲得

RCE (Remote Code Execute)

  1. 使伺服器訪問指定的外部網站

SSRF (Server-Side Request Forgery, 服務請求偽造)

  1. 使伺服器訪問外網無法訪問的內部系統

案例二 – Billion Laugh Attack

當XML parser載入這個檔案時,包含了一個根元素“lolz”,而“lolz”包含了“&lol9;”,而“&lol9;”是一個被定義為擴展為包含十個“&lol8;”字串的實體;而每個“&lol8;”是一個被定義為擴展為包含十個“&lol7;”字串的實體以此類推當所有擴展北執行,原本(<1KB)的XML Block 會包含109 = a billion “lol”s,將近 3 GB的記憶體

  1. 由伺服器的 CPU 得知,結果就是 DoS

A5 Broken Access Control [Merged] 無效的存取控管

此項合併了在 2013 容易被混淆的 A4(Insecure Direct Object References ) 與 A7(Missing Function Level Access Control),將存取控管擴大定義。攻擊者可透過網址或 HTML 頁面,繞過存取控制;或將自己的權限提升自管理者,進而攻破公司系統等。建議的控制措施為:

  1. 避免將物件直接暴露給使用者。
  2. 驗證所有物件是否為正確。
  3. 預設禁止任何存取行為,並先判斷使用者是否有權限。

如果程式未對輸入的參數進行任何的驗證(例如驗證該檔案只限於某個目錄才可顯示該檔案內容),就有可能出現惡意的使用者利用傳入 ../etc/passwd 類似的字串,其中 .. 為回到上一層,此輸入參數的意思指向 /etc/ 目錄下的 passwd 檔案。倘若程式未對輸入參數進行控管與驗證,當輸入此類的檔名時,就可能將該檔案的內容顯示出來。
透過字串比對,檢視參數資料是否有 ../,但我們仍可用其他的方式來跳脫字元檢查,例如:%2e%2e%2f等。

  1. 若網頁內容含有以下html語法:
  1. 程式讀取該html標籤資料的語法為:
  1. 此時若程式寫法沒有限制,允許攻擊者插入特殊字串『../../../../etc/passwd%00』在網址列中:

A6 不安全的組態設定(Security Misconfiguration)

經常使用不安全的預設值,像是作業系統、框架、函式庫及應用程式,避免使用預設值設定並時常必須做到系統更新與升級,確保系統安全與時並進

  1. 系統啟用或安裝了非必要功能,例如:非必要的端口、服務、網頁、帳戶或權限等。
  2. 系統預設帳密未更改。
  3. 偵錯模式(Debug)未關閉,導致錯誤訊息中包含的敏感性個資外流。
  4. 對於更新的系統,禁用或不安全的配置最新安全功能。
  5. Server、Framework(如:Struts、Spring、ASP.NET)、library、DB 等沒有進行安全配置。
  6. 未定期進行安全更新的系統。

1. 未更改預設的帳密,可能會導致敏感訊息外流。以色列研究實驗室SafetyDetective發現蘇格蘭一家提供遠端監控解決方案的公司Resource Data Management,其生產的溫度控制系統存在安全漏洞,駭客能用預設帳密控制冷凍系統,而在第一時間告知Resource Data Management後,最先得到的回應卻是他們不感興趣。SafetyDetective研究團隊發現Resource Data Management的溫度控制系統,使用不安全的HTTP協定,並使用9000、8080、8100以及80等連接埠,而且還預設用戶名稱以及1234作為密碼,更糟的是使用這些系統的管理員,顯然很少更換登入資訊。參考新聞:https://www.ithome.com.tw/news/128707
2. 上傳至 Github 時,未設置 .gitignore 來忽視特定的檔案,例如資料庫的存取密碼等。
3. 使用不安全的HTTP協定

A7跨站攻擊(Cross-Site Scripting, XSS)

  1. XSS 俗稱 JavaScript Injection ,顧名思義就是讓攻擊者執行惡意的 javascript,以達成其目的
  2. 網頁跨站攻擊是利用動態網頁的特性,當網站缺乏適當的驗證時,攻擊者就利用此弱點在瀏覽器中執行惡意程式碼,並挾持使用的Session進行造成攻擊。

1. Stored XSS (儲存型) 遭到被保存在伺服器資料庫中的 JavaScript 代碼引起的攻擊
2. Reflected XSS (反射型) 網站會反應使用者所輸入的 URL(含 JavaScript 代碼)引起的攻擊
3. DOM-Based XSS 網頁javascript在執行過程中,沒有詳細檢查資料使操作DOM的過程中帶入惡意的指令
參考資料:https://ithelp.ithome.com.tw/articles/10218476

A8 不安全的反序列化漏洞(Insecure Deserialization)

  1. 此威脅為不安全的反序列化漏洞可能導致駭客利用遠端執行任意程式碼進行重送攻擊、注入攻擊及權限提升攻擊。
  1. 序列化是將物件狀態轉換為可保存或可傳輸格式的形式。
  2. 反序列化則是序列化的相反,它可以將資料流轉換成物件。

不安全的反序列化漏洞主要是鎖定 Java、PHP 或 Node.js 等常見的平臺。它容易導致以下攻擊發生:1.  遠端程式碼執行(RCE)2.  重播攻擊(Relay Attacks)3.  注入攻擊( Injection Attacks)4.  特權升級攻擊(Privilege Escalation Attacks)

防護建議
針對任何序列化的物件落實完整性的檢查。如:數位簽章,防止惡意物件的建立或資料被篡改。

A9 使用已有漏洞的元件(Using Components with Known Vulnerabilities)

  1. 使用具有已知漏洞的元件產生的脆弱點,駭客可透過此脆弱點破壞應用程式中的防禦措施,並進一步造成更嚴重的傷害。

現行開發模式有 Dev Ops 及 Agile,為達到快速產出,開發人員通常會引用 OSS(Open Source Software),卻沒監控該 OSS 的弱點問題,包括函式庫、框架及其他的軟體模組等,而 OSS 卻會和應用程式以相同的權限執行。
1.  使用有漏洞的 PHP 版本2.  過時的內核版本 Linux3.  未被修補的視窗系統4.  有漏洞的 jQuery 版本
防護建議

  1. •定期修補程序
  2. •訂閱不同有分享最新漏洞的 CVE 號碼和緩解技術/修復程式的論壇。檢查該漏洞是否影響庫存中的設備/軟體並修復它們。

A10 紀錄與監控不足風險(Insufficient Logging & Monitoring)

  1. 當記錄與監控不足或不恰當時,會導致在發生資安事件的情況下無法有足夠的資料進行處理,也使攻擊者有機會進一步進行攻擊系統,進而造成損失。
  1. 來自特定來源的失敗登錄嘗試太多
  2. 來自特定來源的請求太多,而且不論速度異常地快、慢或固定,都可能是攻擊者嘗試發動 DDoS 攻擊。要做檢查和採取行動。
  3. 垃圾流量
  4. 在沒有預期的情況下出現高峰流量
  5. 需快速提供微服務,故沒針對應用程式做登錄檔的監控。

防護建議
確保所有使用者登入、存取控制失敗和伺服器端輸入驗證失敗皆進行記錄,以利識別可疑或惡意的帳戶,並且保留足夠的時間允許延遲進行數位鑑識分析

資安課程推薦

看了這麼多漏洞多多少少一定會想要自己去模擬環境了解其中實作的方法。

除了介紹各種資安的運作原理之外

也透過虛擬機環境來實作駭客的攻擊手法

課程沒有基礎也沒問題

老師是手把手的教學方式

對Python 及資安有興趣的人推推!

推薦Python入門書籍

精通 Python:運用簡單的套件進行現代運算(第二版)

博客來-精通Python:運用簡單的套件進行現代運算(第二版)

之前開始入坑python時就是用這本打底的(有換封面過)

這本書除了前幾張介紹基本的語法之外

後續幾張開始介紹與python相關的延伸性的功能

非常適合程式設計初學者以及剛要開始學習這個語言的讀者

羅列以下幾點關於本書大綱供大家參

  • 學習簡單的資料類型、基本數學運算與文字操作 
  • 以Python的內建資料結構處理資料 
  • 探索Python程式碼結構,包括函式的使用
  • 使用模組與套件編寫大型Python程式
  • 深入討論物件、類別與其他物件導向功能
  • 檢視一般檔案、關聯式資料庫與NoSQL的儲存機制 
  • 使用Python建構web用戶端、伺服器、API與服務 
  • 管理系統工作,例如程式、程序與執行緒
  • 瞭解並行處理與網路程式設計的基礎

流暢的 Python:清晰、簡潔、有效的程式設計

博客來-流暢的Python:清晰、簡潔、有效的程式設計

適合已經有Python程式語言基礎的人

這本書更詳細的介紹有關python的用法

讓我們寫的程式可以更加”Pythonic”

建議可以與英文版同時閱讀

以後在查閱stackoverflow文獻的時候能不因語言而產生隔閡

  • Python 資料模型:瞭解特殊方法是讓物件具備一致行為的關鍵
  • 資料結構:充分使用內建的型態,並瞭解 Unicode 時代中,文字 vs. bytes 之間的關係
  • 函式就是物件:見識 Python 函式是一級物件,並瞭解這個事實如何影響熱門的設計模式
  • 物件導向的習慣用法:學習參考、可變性、介面、運算子多載與多重繼承,並建構類別
  • 控制流程:藉由 concurrent.futures 與 asyncio 套件,來充分活用情境管理器、產生器、協同程序與並行
  • 中繼編程:瞭解特性、屬性描述器、類別修飾器與中繼類別的工作原理

Python 自動化的樂趣:搞定重複瑣碎&單調無聊的工作(第二版)

Python 自動化的樂趣|搞定重複瑣碎& 單調無聊的工作(中文版) (Automate the Boring Stuff with Python:  Practical Programming for Total Beginners) | 天瓏網路書店

如果想使用自動化來增強工作流程效率,大推本書

之前這本書只有英文版

在博客來等了1個月還是沒等到

沒想到在2020/08/28 出了中文版

二話不說馬上看看人家都是怎麼用python來完成例行公事的

除了運用Python寫出程式,在幾分鐘內搞定人工手動處理需要花費數小時的工作。

探索Python豐富的模組程式庫來完成某些特定工作

例如從網站上抓取資料、讀取PDF和Word文件,以及自動化執行滑鼠點按和鍵盤輸入的工作。

 ‧在一個或多個檔案中搜尋文字
  ‧建立、更新、搬移和重新命名檔案和資料夾
  ‧搜尋網頁和下載網路上的圖文內容
  ‧處理PDF檔的分割與合併,加入浮水印和加上密碼等作業
  ‧傳送Email和簡訊
  ‧填寫線上表單

如果對文章內容有任何問題,歡迎在底下留言讓我知道。 
如果你喜歡我的文章,可以分享我的文章,讓更多的人看見我的文章。 
追蹤我的Instagram
如果這篇文章對你有幫助,
可以幫我在下方按 5 個Like 讓我得到一些回饋,
支持我繼續寫出更多好文章

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *