---
# System prepended metadata

title: Web Security

---

# Web Security
## CSRF(Cross-Site Request Forgery)
### 概念
當我們登入一個惡意網站時，惡意網站送過來的網站中可能藏有javascript或 img 、iframe tag的執行，可能會讓我們的瀏覽器發送請求到另一個網站中(像銀行網站)，而假設我們已經登入此網站，那麼我們所發出的請求就會帶著cookie，那此網站就以為是我們所做的操作
### 防禦
- Refer header:當送出請求時會附上目前所發出請求的網站，只有當網站是被信任的才能夠通過，但因為這要人為所寫與維護，還是容易產生漏洞，且有些情況為了保護隱私，Proxy會將此東西移出，而不送出。
- Smae-site Cookies:在附上cookies時除了原本的亂數，會再增加一些設定，像只能接受smae site request或不接受cross site subrequest(像img 或 iframe tag)
- Secret Token:在填寫要填的form中除了原本要填的資料，再加上一個由server或前端所生成的亂碼，而當server收到時便會比對是否相同。
## XSS(Cross-Site Scripting)
### 概念
與前面需要受害者點入惡意網站不同，這個主要是把惡意的程式碼安插在正常的網站中，不論是web server送來的或使用者送給server的，而會成功的原因主要是因為瀏覽器無法分辨script的來源，或著沒有過濾使用者上傳的資料，會認為這就是網站的功能，XSS主要分為兩種

- Stored XSS Attack:把惡意的代碼注入web server的資料庫中，當其他用戶提取資料時就會提取道惡意的script
- 攻擊者會做出惡意的URL，像可能某個網站用GET request 所回傳的東西會拼接在url上，並用html顯示在畫面上，但攻擊者把惡意的script接上，網站便以為這是要運作的東西，便直接執行。或著利用\r\n 這個是http在回應時用來分別header 跟body的東西，可以把我們要注入的惡意script用\r\n接在後面，讓瀏覽器以為這個是body，並執行。
- 會需要考慮到同源政策
### 防禦
- filter:把使用者的input來過濾javascript或html
- encoding approach:把html的mark改成html的entities
- WAF:用防火牆來過濾
## SSRF(Server-Side Request Forgery)
對資料庫提出請求，藉此注入惡意的script或獲取資料，可能會因為有些url沒有封鎖權限
### 防禦
- 避免用到危險函數
● file_get_contents()
● fsockopen()
● curl_exec()

● 過濾回應的訊息
● 統一錯誤訊息
● 限制請求的port
● 禁止不常用的協議
● 對DNS Rebinding，考慮使用DNS cache或者Host白名單

## XXE
### 概念
XML是一個用來傳遞資料與儲存資料的語法，其優點主要兩個，不會壓縮資料，故非常通用，且寫法容易讓人看得懂。但這也是它會產生的問題，因為攻擊者也容易看懂，因為攻擊者就容易把惡意的檔案差在XML檔中回傳，藉此得到資料

- Exploiting XXE to retrive files:把傳回伺服器的封包攔截，並在上面修改external entity藉此得到內部的敏感資料
- Exploiting XXE to perform SSRF attacks:因為有時我們的請求沒有權限，故我們透過修改XML讓server自己發請求
- XXE attacks via file upload:有時web會要我們上傳圖片，然後他會存在資料庫中在取出來顯示，所以我們可以將上傳的圖片用寫成xml的svg檔上傳，讓web server把機密的內容寫在圖片後，在展示出來
- Finding hidden attack surface for XXE injection:有時看不出來是用xml寫的，但我們可以應改成xml格式來傳遞，達到取得資料的效果

### 防禦
將XML的external entities and Xinclude功能關掉
## Unsecure Deserialization
### 概念
在傳輸資訊時，我們會把傳輸的東西壓縮成像string 或 byte形式來傳送，後面再將其解壓縮回去，而很多語言都有內建的序列化，故如果我們知道網站是用哪種語言，且序列化是在我們本地端的話，我們便能改變序列化的訊息在傳遞給SERVER

- 可能1是登入，0是沒有登入，則我們便能將0改成1傳回server，來欺騙server
- 一些語言有弱比較:像假設把兩個不同型態的東西比較，那其可能會自動轉化型態像php的0==任意字串都匯回傳true，那假設php的伺服器判斷是字串的話，我們已0輸入，那麼便會視為true
- 還有可以利用網站內部可用的功能，那麼我們就可以透過更改序列話的內容來讓目標改變
- injecting arbitrary objects:如果我們知道source code的話，就能透過了解source code來透過序列化時來呼叫一些function來進行攻擊
### 防禦
不要讓使用者的輸入有序列化與反序列化

## SQL Injection
### 概念
當設計的程式忽略了檢查，那麼就有機會利用輸入的字串中帶有SQL的指令來做攻擊，因為資料庫可能以為這是正常的指令。像用"1' OR '1'='1"
### Union Based
先找到表格的名稱，再找出欄位名稱，最後找到資料，利用union select就有機會找出所有資料
### Error Based SQL injection
透過塞入錯誤的資訊，來看其反應，可以透過網站的回應來猜測裡面的可能表格或資料的名稱
### Command injection
當web server拼接系統命令時而造成的漏洞
可以用DNS傳資料，因為通常防火牆會擋住HTTP但不會擋住DNS的資料傳輸
### Template injection

## Web Cache
因為web為了降低流量，當有人存取某個網頁時，會在中途存放網站讓別人拿取，故攻擊者可能對Cache動手腳，讓其他使用者存取時出問題，像我們能用XSS來注入一些惡意的script來讓拿到這個cache的人會出問題
## 工具
### Burp
在我們與web server中間作為轉寄站，不論是我們送給web server 或web server送給我們的資料都會先被其攔截，我們可以看封包的內容與修改

- Cluter bomb:可以大量傳書送出的請求，而每次請求的內容可以更改，像暴力猜帳號密碼

### DirBuster
可以用來暴力搜尋網站的文件

### TOR(The Onion Router)
多層次的VPN，VPN是用來隱藏自己的IP工具，類似Burp是一個中繼站，但VPN是會賦予其一個新的IP address，讓別人以為你是從VPN的IP發出訊息的。而其可能會有DNS LEAK，主要是因為輸入的網址可能是local的ip 只有local的DNS SERVER認識

### sqlmap
可以用來自動檢測SQL的injection的漏洞
### Password Crackers
- John THE Ripper MPI Patch
- Cain & Abel
- hashcat(推薦因為可以利用顯卡加速)
- RainbowCrack

### 漏洞資料庫(Exploit Database)
可以來看目前使用的框架是否有甚麼漏洞存在
## 協定-robot.txt
一些網站會放robot.txt，因為一些搜尋引擎會去爬各個網站的內容，但有些網站不希望因此增加流量，就會希望他們不要爬，不過有時雖然沒有直接的連結，但只要我們打對網址還是能夠搜尋到網站隱藏的內容(可以利用DirBuster)

- Disallow的目錄常常是對方不希望被爬蟲的地方，可以嘗試從這裡看看有什麼被隱藏的資訊
- sitemap.xml:與robot.txt相似，描述網站的架構
- DS_Store:會洩漏目錄
- .git : 類似



## 學習資源
https://skills.bugbank.cn/ (技能樹)