---
title: 'Computer Security 2023 Fall Course'
disqus: hackmd
---
[Web] Computer Security 2023 Fall Course
===
## Table of Contents
[TOC]
# Web (Ref:Splitline)
```
aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1MSXdnR1Bpd1NUNCZhYl9jaGFubmVsPWVkdS1jdGY=
aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1rcDM5NkZPT2RySSZhYl9jaGFubmVsPWVkdS1jdGY=
aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj0ydTNpSXdKUjhhWSZhYl9jaGFubmVsPWVkdS1jdGY=
```
**● [[Web-lab] Computer Security 2023 Fall Course Writeup](https://hackmd.io/@CHW/SkYei2sPp)**




## Google Hacking (by.NISRA)

//site:.cn filetype:xlsx 帳號 密碼 (google) \
//site:.system8.(org).edu.tw intext:"管理" (google)



## 隱寫術 (by.NISRA)

### Tools: Winhex & 010 Editor
### ● JPG: FF D8 ~ FF D9

**BTW. JPG圖形大小編碼:FF CO**
### ● PNG: IHDR Image header

> png File signature開頭 89 50 4E 47 0D 0A 1A 0A \
> 010 Editor: Edit >> Insert/Overwrite >> Insert Bytes 可寫入

## HTTP Protocol

(\r\n: HTTP 使用CR(\r) LF(\n) 換行)
```console
──(frankchang㉿DESKTOP-CHW)-[~]
└─$ nc example.com 80
GET / HTTP/1.1
HTTP/1.1 400 Bad Request
Content-Type: text/html
Content-Length: 349
Connection: close
Date: Wed, 06 Dec 2023 15:10:32 GMT
Server: ECSF (laa/7B10)
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>400 - Bad Request</title>
</head>
<body>
<h1>400 - Bad Request</h1>
</body>
</html>
┌──(frankchang㉿DESKTOP-CHW)-[~]
└─$ echo 'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n' | nc example.com 80
HTTP/1.1 505 HTTP Version Not Supported
Content-Type: text/html
Content-Length: 379
Connection: close
Date: Wed, 06 Dec 2023 15:14:14 GMT
Server: ECSF (laa/7B93)
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>505 - HTTP Version Not Supported</title>
</head>
<body>
<h1>505 - HTTP Version Not Supported</h1>
</body>
</html>
```

### curl https://www.bbc.com -H "Host:pypi.org"


▲curl 的目的地與Host Header不同

▼Reverse 功用

▼ HTTP Response Code

## HTTP Cookie & Session


### ● Signed Cookie (明文存在Cookie,但要做簽章)

### ● ey 開頭Base64 幾乎就是 Cookie
> ' **{"** ' >(base64 encode)> ' eyI= '
## .htaccess

# Path Traversal



▼ /static alias 到 /home/app/static

▼ 收集資訊



# LFI: Local File Inclusion
任意讀檔+執行

## phpinfo decode


> php:// -Manual
> read/write
> 
# PHP 最新技巧

# [CRLF Injection](https://owasp.org/www-community/vulnerabilities/CRLF_Injection)
不只控制Header,還控制瀏覽器 & Response Body

# Command Injection

### 在linux shell command裡面," " 裡面是可以執行Command

> ping "$(id)" 會被展開
> ping 'uid=0(root) gid=0(root) group=0(root)'


# SQL Injection
Structured Query Language 結構式查詢語言
e.q MySQL, MSSQL, Oracle, PostgreSQL

### 大部分Injection出現在字串拼接
▼所有使用者

### " \ " 不一定能Escape ex.SQLite

## Data Exfiltration

### UNION
聯集column

▼ UNION SELECT 新增資料

id 改成不存在的東西,前端顯示SELECT進去的資料

▼ 注入撈的資料 ex. MySQL function

**MySQL function**

▼ 從Users取出Password


### Information_schema

▼ 利用Information_schema.table/columns取得已存在的table/columns name


▼ group_concat 把所有資料輸出列成一個字串


### Blind
#### Boolean Based
檢查帳號密碼、Username有沒有被註冊過

▼ 用and強迫吃我們給的條件

▼ 假設user()值是mysql
* 確定id=1是有資料的
* 控制T/F的資料: 確定function return值長度
* return值長度二分搜: >0 >16 >8 >4 >6 =5


▲ ASCII 二分搜
#### Time Based
不知道是不是有資料

▼ 伺服器response花很久時間,代表符合條件

#### Out-of-Band
▼ windows網路芳鄰: windows讀\\開頭的檔案,會當網路芳鄰底下的檔案存取

## 用MySQL讀寫檔
\
前提: 配置要開\

## Sqlmap

# Template Injection

### Jinja2 (Flask模板)


▼ 測試模板引擎

▼ 單config可dump出設定值。SECRET_KEY管理簽章Cookie,可偽造成別的使用者,自己簽Cookie。

▼ RCE
環境類似Sandbox,普通Python做不了


▲ Python中所有function都會有__globals__來儲存全域變數。import os 拿到system。

**全部的python物件都是一個Object。**

> Object底下的subclasses[132]:os._wrap_close
> class底下的method:__ init __ (建構值constructor)
▼ 可知道12345是在class 'list' (物件的類別),源頭是object


### Other Template Engines

# SSRF
提供網址存的到內網:
原功能

預覽localhost




### SSRF攻擊面: Protocol

▼不可curl directory ex.file:///



● [SSRF Bible Cheatsheet](https://cheatsheetseries.owasp.org/assets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet_SSRF_Bible.pdf)
#### https


▼ 以下都需要Request Header: Metadata-Flavor (Google)

▼ 可使用CRLF 注入Request Header: Metadata-Flavor (Google)




#### gopher



▼ Gopher x MySQL

[Gopher 相關payload](https://github.com/tarunkant/Gopherus)
▼ Gopher x Redis

▼ CRLF Injection x Redis

▼ Gopher x PHP-FPM



## Bypass Rule_ IP

## Bypass Rule_ Domain Name

▼ Ref: https://www.unicode.org/reports/tr46/

Domain Obfuscator: https://splitline.github.io/domain-obfuscator/
## URL Parser

urllib
## DNS Rebinding
檢查網址SSRF風險: Domain > Localhost



# Insecure Deserialization

> Javascript
> 一個object 存在array, boolean,string (存在記憶體的物件)
> 透過stringify轉成jason字串結果 (序列化)

不安全: eval 做反序列化,Code Injection


## Python Pickle

> key:cat 值:meow dump成Binary字串

> 把Arguments 丟給Function吃


使用pickle tools 看 Binary 在做什麼
### ▼ **pickletools: disassembly**

dis=disassembly
### ▼ **pickletools: optimize**

### ▼ **pickletools: Memo & Stack**
反序列化Pickler時,稱幫忙反序列化的東西: Unpickler
```Plain Text
> python gen-pkl.py
0: \x80 PROTO 4 #定義一個protocol:4
2: \x95 FRAME 27 #不會影響執行
11: \x8c SHORT_BINUNICODE 'posix' #PUSH BinaryUnicode
18: \x8c SHORT_BINUNICODE 'system'
26: \x93 STACK_GLOBAL #from a import b "__import__(stack.pop())[stack.pop()]"
27: \x8c SHORT_BINUNICODE 'whoami' #PUSH BinaryUnicode
35: \x85 TUPLE1 #將Stack頂端變成一個TACO
36: R REDUCE #__reduce__ function
37: . STOP #指令頂端回傳回去,得反序列化結果
highest protocol among opcodes = 4
```
> **Stack:**\
> **['posix']** #SHORT_BINUNICODE\
> **['posix','system']** #SHORT_BINUNICODE\
> **(POP) 'system','posix'** #STACK_GLOBAL\
> **[]** #from 'posix' import 'system' #STACK_GLOBAL\
> **[<fn system>]** #STACK_GLOBAL\
> **[<fn system>, 'whoami']** #SHORT_BINUNICODE
> **[<fn system>, ('whoami', )]** #TUPLE1 \
>
> #REDUCE
>
> **arg=stack.pop()**\
> **fn=stack.pop()**\
> **stack.push(fn(arg))**
>
> **['CHW']**\
>**return stack.pop()** #STOP
功能:
1. 創造字串TACO ex.'str', 123 , (1,2,3)
2. 可以import
3. call function
4. set attribute 設定屬性值 #obj.attr=value
5. set index #obj[index]=value

> 先call function __ import__('os')\
> 拿到回傳值後,get attribute拿到 'system'這個function\
> 直接呼叫拿到的system
[pickle — Python object serialization 官方](https://docs.python.org/3/library/pickle.html)
### __ reduce__ Magic Method



> 達到RCE
▼ pickletools

## PHP (De)Serialization


物件序列化格式表

## 在PHP裡面,所有變數都是以$開頭
### PHP Magic method

#### ● __destruct()

> 物件被銷毀,自動做destruct的行為
#### ● __toString()


#### ● __wakeup()
▼ 序列化 (正常印出序列化物件)

> $ser = 序列化後的字串
▼ 在反序列化時,會自動call __wakeup()

#### ● __get()

> 物件序列化之後,做反序列化(取名為meow的屬性值)。
> 自動call了 __get()

#### ● __call()
呼叫一個不存在的method自動乎叫 __call()

> 呼叫一個不存在的method meow(),
#### 例子

> Command Injextion 注入 __wake():sound

**現實世界可能會需要經過好幾層的串聯,才可以串到一個真正想要利用的method 攻擊點**
## POP Chain
堆疊Web世界觀ROP的應用鏈。\
把很多很小的Code片段串起來達到想做的結果。

[PHPGGC: PHP Generic Gadget Chains:](https://github.com/ambionics/phpggc) 收集現實世界裡各種反序列化的利用鏈


> 55:00\
> 假設有三個Class:Cat, Magic, Caster
> > Cat:\
> > 有兩個屬性值(Magic & Spell)\
> > Magic物件,在__wakeup()會對magic使用cast這個method,echo東西出來
>
> 可亂改屬性質(ex. magic),可將magic指向別人(ex. Caster)
> > Caster:\
> > Cast method裡面有個public的屬性值: Cast_func,所以可改\
> > 他把cast_func當作Function Name接上我可以控制的 $val\
> > (回推)cast 來自magic,Magic我們可控,所以可把Magic改成Caster 代表Function 可控。
> > 參數可控嗎? $val 來自Cat的屬性值: spell,所以也可控。
> > 
> > 
## Java (De)Serialization
ysoserial: https://github.com/frohoff/ysoserial
> 類似 PHPGGC,產出 Java gadget chains

## .Net (De)Serialization

### PHP小知識
1. **PHP 可直接呼叫一個String,這個String 可以是Function Name**

> 值是system 的string
2. call_user_func & call_user_func_array


3. String 也可以是一個Array

> 陣列需要包含[class,method] //new Cat()→ meow\
> 形式: Object & String 被Array包住,Object可序列化、String也可序列化\
> 所以 **[new Cat(), 'meow'] 可被序列化**
# Frontend Security
## **同源政策: 同protocol、同host、同port**

> 訪問google.com,可以幫我管理google上的文件(ex. gmail)\
> 但不會在FB發一篇文 (不能在A網站傳送B網站的資料)


> Cross-origin writes
>> - Link
>> - Redirect
>> - Submit form
>>
>Cross-origin embedding
>> 
# CSRF: Cross-site Request Forgery
濫用同源政策


> 偽造刪文連結

POST method

### Superlogout

## CSRF Token


(比對前面POST Request案例)



### SameSite Cookie


Browser compatibility: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie
# XSS


XSS GAME: http://www.xssgame.com/
## HTML Entity Encode

## Self-XSS



## Reflected XSS

> 利用性弱,需要發連結給受害者→可轉成短網址
## Stored XSS

> Payload 儲存到Server/Database裡面 (ex. 留言板)
## DOM-based XSS

> Reflected/Stored DOM-based XSS
## Event Handler
Handle 每個元素,發生某件事的event

## javascript: Scheme

> 瀏覽器中,javascript開頭後面接要跑的js (也是一個超連結)
## 防止XSS
### 1. BlackList

```
[space]on ...=
<svg <TAB> onload=alert(1)> #<TAB>
<svg \n onload=alert(1)> #\n
<svg / onload=alert(1)> #/
javascript:
<a herf="\x01javascript:alert(1)">X</a> #塞亂七八糟字元
<a herf="java\tscript:alert(1)">X</a> #\t
<a herf="java&TAB;script:alert(1)">X</a> #&TAB; HTML encoded的模式
<script
ex. JSFuck
```
**XSS Payload cheatsheet**: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
### JSFuck (合法JS)

> 丟console是可以執行的

### 2. Escape HTML/JavaScript syntax


> javascript:alert 經過entity encode 不會改變 → 必須過濾連結
### 3. Filter HTML syntax


[DOMPurify](https://github.com/cure53/DOMPurify): 過濾sytax工具 → https://cure53.de/purify
## CSP: Content Security Policy


> 有效防禦XSS的Policy

CSP Evaluator: https://csp-evaluator.withgoogle.com/

> object-src: 載入非影音標籤物件套用的規則。如:<object>、<embed>及<applet>\
> base-uri: 可以強制更改所有網站的base
> 
> script-src:\
>> (特例允許) unsafe-eval: 不可出現eval(...),把字串當成JS執行的東西。\
> (特例允許) unsafe-inline: <script>alert()</script>, < svg onload=alert()>
>
><script src="/app.js"></script> 就不是inline (沒有把HTML和JS混在一起)
>> 特例允許eval & inline ?! 危險?!\
>> nonce: 
>> 'nonce-l9GaccLDqZYYryQvKJoS5Q'\
>> 確保response有script nonce\
>> 
>> <script nonce="l9GaccLDqZYYryQvKJoS5Q"> 與Header nonce相同則可以載入。導致攻擊者無法預測每次的Header nonce value
## XS-Leaks
XS-Leaks Wiki: https://xsleaks.dev/
### Time-based


> 找到 有資料會有的行為 & 沒資料會有的行為 之間差異性。\
> 就可以做到side channel
### Frame Count

> 可讀到頁面上有多少iframe
## DOM Clobbering


> \
> WHY? 在HTML中所有id都會變成一個變數
> 

> id會被綁到windows上\
> name屬性會被擋到document上,但只限embed, form, img & object。

meow=123 不會被蓋過去


> \
> `<a href="" id="meow">owo</p> #加入超連結`
> \
> `<a href="a:alert(1)" id="meow">owo</p> `
> \
>若沒有加a: → 變成相對路徑
> `<a href="alert(1)" id="meow">owo</p> `
> 
# Prototype Pollution


> a 設定巢狀屬性,新物件b也會出現
> 
> 所有物件的proto都會指向 Object.prototype
> // 竄改到原形鏈的始祖
> 
# 基礎思路

## Recon


## Webshell


# Dangerous function
