這篇是我web攻擊的隨筆,很亂,酌情參考。
Web入門
靶機介紹
- demo .testfire .com
- Acunetix
- OverTheWire
- TryHackMe
- Heck The Box
- PortSwigger - Web Security Academy
OSI與DoD模型
- 依據網路運作方式,OSI模型共切分成7個不同的層級,每級按照網路傳輸的模式,定義所屬的規範及標準。
DoD 模型與網路互連的關聯
首先,使用者端會發出 HTTP 請求(裡面包含了使用者資料);然後到了傳輸層再加上 TCP 表頭;到了網路層,再加上 IP 表頭;到了網路連結層,再加上乙太表頭,整體會變成一個網路封包,再整包傳給伺服器端,一層層往上處理至 Server。
- 那如果傳送的是含 TCP 表頭的網路封包(因為也有可能傳送的是含 UDP 表頭的封包),必須要經過「三向交握」來建立連線。三向交握簡單來說就是使用者端會發出 SYN 封包給伺服器,伺服器再回傳 SYN/ACK 封包給使用者,使用者端再傳送 ACK 封包。如此三次來回,即可開始傳輸封包
- 完成三向交握後,就可以開始傳送 TCP 封包。而直到封包傳送完,回傳 200 OK 狀態碼,才表示資料傳送完成。傳送完封包,瀏覽器便開始渲染網頁。
這時如果還欲傳送其他資料,就從下圖中的第 2 點至第 4 點再重複一次,直到所以資料都傳送完,進行 TCP 四次揮手,終止連線。
(補充: 若請求的網站為 HTTPS,則表示其為加密網站,在傳輸層及應用層多了一道 SSL / TLS 憑證。此網站使用 WireShark 去監測封包,會看不到封包內容,比較安全;若為 HTTP 網站,則表示沒有加上 SSL / TLS 憑證。HTTP 是走 80 port;HTTPS 則走 443 port)
瀏覽器的渲染過程
總結
參考資料
https://medium.com/yu19941994/%E7%B6%B2%E8%B7%AF%E8%AB%8B%E6%B1%82%E8%88%87%E7%80%8F%E8%A6%BD%E5%99%A8%E6%B8%B2%E6%9F%93-2c1232c23fbf
XSS攻擊
漏洞成因
- avascript這個在前端上不可或缺的語言,不過就是因為他的方便性,也常常變成駭客拿來利用的工具
- 駭客可能會在你瀏覽的網頁中,允許惡意的使用插入惡意的javascript,達到某種目的,簡單的可能只會瘋狂地跳alert視窗,嚴重的可能竊取別人的帳戶資訊,接下來就一一介紹XSS的各種型態
- :::spoiler 反射型(Reflected)
- 讓使用者發出惡意的requests(可以是網址, 奇怪的按鈕, 表單form…),後端如果沒有過濾,將結果傳給給前端,瀏覽器就有可能執行這段惡意的程式碼
- 需要社交工程,不能做主動攻擊
:::
- :::spoiler DOM型(Dom-based)
- DOM 全名為Document Object Model,能將HTML中的各個標籤形成一個樹狀結構
- 詳細資料:DOM
- 發生原因
- 使用DOM的API的時候,使用innerHTML,就可能將script插入到網頁當中
- 觸發跟反射型類似,只差在反射型把資料傳給後端,但DOM不會
:::
- :::spoiler 儲存型(Stored)
- 會將惡意語法儲存到伺服器或資料庫當中
- 通常會發生在論壇文章、留言板…等
- 當使用者瀏覽時,就可能讀取到資料庫中的惡意語法,瀏覽器進而去執行
:::
XSS攻擊偵測
- 通常會嘗試看source code,看看有沒有濾掉甚麼特定的標籤
- 目前看下來最常使用的方式就是**alert(1)**,因為最快最方便,一但有跳出alert視窗就代表有機會做XSS攻擊
- 網路上也有許多各種花式組成的XSS payload,以下就提供兩個連結
偷取cookie
- Cookie是甚麼
:::spoiler為了能保持server端與client端保持長久的互動與活動狀態,server會給瀏覽器一組或多組的key/value,儲存在瀏覽器當中
一般來說cookie會用來紀錄用戶的資訊,常見狀況是用在購物網站的購物車、會員登入或瀏覽紀錄也就是為甚麼在瀏覽器登入fb, twitter…過後,下次打開不需再次登入,因為cookie已經記住你的帳戶資訊
換句話說,當駭客想要竊取帳戶資訊,可以透過竊取別人瀏覽器留下的cookie,來偽造登入
::: - 架設環境
- 利用docker-compose, 將東西container化也方便跨平台架設
- php
- selenium(模擬admin瀏覽管理介面與留言)
- mysql(儲存留言)
想了解docker-compose怎麼用的可以參考此篇鐵人賽文章
https://ithelp.ithome.com.tw/articles/10194183
- 利用docker-compose, 將東西container化也方便跨平台架設
- 工具 - Pipedream
- 為了要將cookie彈回server,可以使用線上工具,就不需要自架server或租VPS
- 新增一組新的workflow,接收HTTP requests
- https://pipedream.com/workflows
- 工具 - EditThisCookie
- cookie的管理器。您可以增加、刪除、修改、搜尋、保護和封鎖cookies
- https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg/related?hl=zh-TW
- Cookie是甚麼
SQL injection
介紹
- 發生在後端與資料庫之間的安全漏洞。駭客在輸入的字串中能夠夾帶SQL指令,並沒有過濾字串
- 通常是使用字串串聯方式來構成SQL的指令,若又在連線的時候使用權限過大的帳戶(工程師偷懶使用root或sa連接資料庫XD),甚至可以Get Shell
- SQL-injection最經典的一部漫畫
- 媽媽接到電話,你好,我這邊是你兒子的學校,我們電腦出了點狀況oh, 他用壞了甚麼東西嗎,媽媽問。 校方說: 可以這麼說
- 校方說: 你真的把你兒子取名為 Robert’); DROP TABLE Students; – 嗎?媽媽說: 是的,我們都叫他寶貝table
- 校方回說: 我們今年的學生資料都不見了,希望你覺得滿意。媽媽說: 希望你以後會記得把寫進Table的資料清掉
例子
- 網站的登入驗證
sql = "SELECT * FROM users WHERE (name = '" + username+ "') and (pw = '"+ password +"');";
db->execute(sql);
- 網站的登入驗證
- 這時駭客輸入在登入介面分別輸入
- username: ‘ OR 1=1 –
- password: ‘ OR 1=1 –
- 組合完會像這樣
- name = ‘1’ OR 1=1
- 前面的語句就算邏輯錯誤,後面的1=1條件恆為True,False or True = True
- 因此,後面兩個OR條件後的句子,都恆為True,進而達到沒有帳號密碼就能登入網站的尷尬情況
- –為註解,目的是將無用的語句去掉
- MySQL還有其他註解像是 #, /*
sql = "SELECT * FROM users WHERE (name = '' OR 1=1--') and (pw = '' OR 1=1 --');";
db->execute(sql);
- MySQL還有其他註解像是 #, /*
- name = ‘1’ OR 1=1
- 搭配漫畫的例子
- 將password改成: ‘ OR 1=1; DROP TABLE Students; –
- 很恭喜,你的整張表就直接不見囉
sql = "SELECT * FROM users WHERE (name = '' OR 1=1 --') and (pw = '' OR 1=1; DROP TABLE users --');";
db->execute(sql);
- 如何避免?
- 單純的過濾輸入,但駭客的手法百百種,他們能在有限的狀況下,又找出新的方法可以繞過恩,後面講的靶場就是模擬駭客在受限的各種字元過濾下,盡情的絞盡腦汁繞過
- 比較安全的作法:
- 使用prepared statements(預先準備SQL語句)搭配parameterized queries(參數化的查詢)
- 透過預先準備SQL語句與參數化查詢,能讓資料庫知道說要插入甚麼值作為甚麼功用,就不會對甚麼OR 1=1 –和空的密碼做query,或是用;截斷語句做其他事情
1.資料收集的分類
敏感目錄洩露
- git洩露
- 正常git洩漏
工具: https://github.com/denny0223/scrabble
./scrabble http://example.coom/
執行工具即可取得原始程式碼 -> flag - git回覆
git 是一個版本控制工具,會記錄每次提交(commit)的修改,所以當題目存在git洩漏之時,flag檔案可能在修改中被刪除或被覆蓋了。
- 使用git的git reset來回覆到之前的版本,回到上一個檔案 “git reset –hard HEAD^”
- 或是使用 “git log -stat” 來檢視每一個commit修改了甚麼檔案,再用 “git diff HEAD commit-id” 比較在目前版本與想檢視的commit之間的變化
- git分支
在每次提交時,git都會自動把他們串成一條時間線,就是分支。git允許使用多條分支,讓使用者從開發主線中抽離。因此,我們要找的flag可能不在目前的分支中,這時使用
$ git log
GitHacker(https://github.com/WangYihang/GitHacker)
$ python GitHacker.py http://127.0.0.1:800/.git/
//執行指令 進入資料夾
$ git log --all or $ git branch -v //只能看到master分支資訊
$ git reflog //checkout的紀錄 除了master還有一個secret分支但自動化工具只還原了master的資訊,secrat的head資訊需手動下載。
$ wger http://127.0.0.1:8000/.git/refs/head/secret
//恢復head資訊
- SVN洩漏
敏感備份檔案
Banner識別