CTF[1]

Web.

 Claire

  • 北資一六社長 x 網管
  • 競程是舊愛 而且我很爛
  • 新歡大概是資安
  • 但我都只打水題
  • 樹枝爆肝仔

Who am I

1

Intro

3

Tools

5

Practice

2

 

 

 

Web

4

 

 

 

Vulnerabilities

Index

Intro

Intro

  • Web:網站

    • 尋找+利用網頁有的漏洞(vulnerablility)

  • 常用技術

    • command/code injection(指令注入)

    • SQL injection

    • XSS (Cross-site scripting)

Basic Concepts

Frontend & Backend

  • 點餐出餐
  • 使用者理所當然只能接觸到點餐的部分
  • 後端負責處理各種要求

Frontend

  • 所有東⻄都會直接顯⽰給使⽤者
  • HTML、CSS、JS
  • ctf 很常可以從 js 裡看或通靈出你需要找的東西

Backend

  • 顧客(Client)去找提供服務端(Server)的餐廳服務生
  • 提出需求要喝水(Request),服務生拿水回應需求(Response)

Frontend & Backend

Database

  • 儲存與管理網站的各種資料
  • 管理資料、管理權限、控制效能與備份資料
  • 後端透過 SQL 指令向資料庫查詢、寫入、更新、刪除資料

HTTP/HTTPS

  • Hypertext Transfer Protocal
  • 向伺服器請求資料
  • 用戶端-伺服器通訊的協定

  HTTP

  • OSI 網路通訊模型中的應用層通訊協定
  • HTTP request:
    • GET:取得資料,例如打開網頁、查資料
    • POST:送出資料,例如表單提交、登入操作
    • HEAD、PUT、DELETE...
GET / HTTP/1.1
Host: www.google.com

   HTTPS

  • 從獨立的憑證認證機構取得 SSL/TLS 憑證
    • 數位物件
    • 驗證身分後使用 SSL/TLS 協定
      • 加密連線後 只有用戶端和 Web 伺服器才能看到
  • 資訊回應(100~199)
  • 成功回應(200~299)
  • 重新導向訊息(300~399)
  • 用戶端錯誤回應(400~499)
  • 伺服器錯誤回應(500~599)

Web

Server Conf. Settings

   robots.txt

  • 指示搜尋引擎爬蟲
  • 網站根目錄/robots.txt
  • 不想被外界看到的隱藏路徑或檔案
  • 來看看IKEA

   .htaccess

  • Apache目錄級設定檔
  • 控制權限 重寫網址 密碼保護
  • 設定規則若被公開 可能洩露進攻方向或特殊目錄資訊

   .htpasswd

  • 與.htaccess配合的密碼檔
  • 存放帳號與加密密碼
  • 嘗試破解?

   .git

  • Git版本控制目錄
  • 版本紀錄、原始碼
  • 下載完整程式碼

   .DS_Store

  • MacOS資料夾設定檔
  • 目錄結構、隱藏資訊

Internet

  • Interconnected networks 網際網路
    • Internet:網路組成的網路
  • network:連接多個計算機、設備或系統使其能彼此通信
  • Protocols:裝置間互相溝通的規則
    • ex. HTTP、DNS、IP、TCP、UDP

Internet Standards

  • RFC:各種 protocols 的書面標準
  • IETF:網際網路工程工作小組
    • 修訂 protocols 的協會

IP

  • IP 位址(Internet Protocol Address)
  • 分類:
    • 公網 IP(Internet)
    • 私網 IP(區域網路)

LAN

  • 區域網路,Local Area Network
  • 在同一個 network 裡
  • 連到同一個 router
  • 私有 IP 位址:
    • 192.168.0.0–192.168.255.255
    • 172.16.0.0–172.31.255.255
    • 10.0.0.0–10.255.255.255

Port

  • 通訊埠
  • 格式:IP:Port(ex. 192.168.1.12:8080)
  • 常見 Port:
    • 0~1023:特定的網路服務
      • 80:HTTP
      • 443:HTTPS
      • 22:SSH
      • 53:DNS
    • 1024~49151:特定的應用程式或專有軟體
      • 3306:MySQL 資料庫
    • 49152~65535:Public Ports
      • 當用戶端連接到伺服器時,系統會自動分配一個動態端口來處理回應

DNS

  • 網域名稱系統 Domain Name System
  • 將人們可讀取的網域名稱轉換為機器可讀取的 IP 地址
  • 查詢 DNS
$ nslookup google.com

Packet

  • Internet 傳資料切成很多小塊:封包
  • 網路傳輸的最小單位
  • 封包包含:來源 IP、目的 IP、協定、內容
  • 資料傳輸:送出封包,對方收到後再組合回完整內容

Tools

F12

   Elements

  • 查看、編輯HTML
  • 隱藏文字、註解、元素屬性
  • 修改對當前的頁面渲染生效
  • ctrl(cmd)+f找flag

   Console

  • js錯誤、輸出
  • js指令試驗
  • 控制台日誌:console.log()

   Sources

  • 當前網頁的所有源文件
  • ctrl(cmd)+f

F12

   Network

  • 監控網頁載入請求、回放
  • 查看各個資源內容、回應數據,另存為文件進行分析
  • preserve log:重整不會清除

   Application

  • 管理網站資料
  • Cookie:
    • 儲存網站資料的小型文字檔
    • 記錄狀態、設定
    • 造訪網站 伺服器HTTP回應Set-Cookie
    • 同一網站請求自動附帶Cookie
    • 修改Cookie內容嘗試權限提升
      • 修改後刷新頁面

curl

curl [options...] <url>
 -d, --data <data>           # HTTP POST data
 -f, --fail                  # HTTP 回傳錯誤(4xx / 5xx)時不輸出內容
 -i, --include               # 在輸出中包含 HTTP Response Headers
 -o, --output <file>         # 將回應內容輸出到 <file>
 -s, --silent                # 不要進度/錯誤訊息(for 大量測試)
 -T, --upload-file <file>    # 上傳檔案
   -u, --user <user:password>  # HTTP Basic Auth
 -v, --verbose               # 顯示完整請求和回應過程
  • 透過 HTTP Protocol上傳/下載的指令

  • Web 安全測試工具

  • kali 有預設裝好 community 版的 burp

commands

  • 確認能否到達目標
  • 看延遲、有沒有封包遺失
  • timeout:無法到達
  • ICMP 網際網路控制訊息協定
$ ping google.com
  • Netcat
  • TCP/UDP 網路程式
  • 可以做網路連線和其他客戶端或伺服器端連線
$ nc <ip> <port>
  • 用來看封包長什麼樣子
  • 可以用 Filter 過濾協定、內容...

  • 點封包會有 Packet List、Packet Details、Packet Bytes

Vulnerabilities

XSS

  • 輸入欄位沒被驗證的參數被嵌入在網頁的程式碼
  • 使用者瀏覽頁面時觸發輸入中的惡意程式

Reflected XSS

  • 將惡意程式會藏在網址列裡
  • User 點擊 URL 攻擊才會生效
    • ​短網址、HTML Encoder
http://www.example.com/upload.asp?id=<script>alert(1);</script>

XSS

Stored XSS

  • 將 Javascript 儲存在伺服器的資料庫中
  • 注入留言板,網頁會載入留言板使 User 受到攻擊

DOM XSS

  • 將惡意程式會藏在網址列裡
  • User 點擊 URL 攻擊才會生效
<img src=# onerror=”alert(1)”>
我是壞人! <script>alert(1);</script>

SQLi

  • \SQL 的註解:
    • 單行 --
    • /* 包住 */
<?php
    $username = $_GET['username']; // 輸入 ' OR 1=1" --
    $result = mysql_query("SELECT * FROM users WHERE username='' OR 1=1" -- '");
?>
<?php
    $student = $_GET['student']; // claire
    $result = mysql_query("SELECT * FROM users WHERE student='claire'");
?>

CRLF

  • 空行 CR+LF:\r+\n

  • 在可以插入字串的地方插入 CRLF

  • 欺騙伺服器告訴這裡我們這邊提早換行

  • 在後面插入惡意的 payload

  • 如果 Hacker 能操縱 Server Client 傳輸的 header

    • 302 Found => redirect

      • 把 reflected XSS url 塞在"\r\n"後面

        • 得到 cookie & session

      • 把釣魚連結塞在"\r\n"後面

  • ​​預防方法

    • 對要 redirect 的內容 urlEncode

    • 檢查 respond header 的內容 過濾掉多的"\r\n"

CSRF

  • 跨站請求偽造 Cross Site Request Forgery
  • 強迫使用者在已驗證身份的網站中執行惡意的偽造操作
  • 範例流程:
    • ​使用者成功登入銀行,代表使用者身份的 cookie 在本地保存
    • 惡意網站有程式碼
<img
  src="http://bank.com/transfer.do?acct=BadGuy&amount=100000 HTTP/1.1"
  width="0"
  height="0"
/>

CSRF

  • 預防方式
    • 比較危險的操作增加一些驗證
    • 不要用 GET 來做關鍵操作
      • POST 請求需要使用者的提交動作才能觸發
    • 辨識請求來自哪個網站
    • CSRF token
      • 伺服器端​為每個請求或每個 session 生成一次
      • 客戶端可以在表單中用隱藏字段儲存
    • SameSite cookies
      • HTTP 回應標頭中的 Set-Cookie 的屬性
      • Strict 限制其他 Domain 來的任何請求都不帶上 Cookie
      • Lax 限制 POSTDELETEPUT 都不帶上 Cookie,GET 會帶上 Cookie

Command Injection

  • 可以透過這個漏洞去執行伺服器的命令

  • 可以做到遠端程式碼執行

  • ex :

    • php

    • python :

      • os.system()

      • ​subprocess.call()

      • os.popen()​​

  • ​​常發生於 ping 測試

    • ​IOT 設備常用

Command Injection

命令連接

  • 作業系統中執行命令可以連續執行多個命令
  • ;:命令終止符號
  • &:讓指令在後台運行
  • |:pipe,將前項命令的輸出當成後項命令的輸入
  • ||:第一個命令失敗才執行下一個
  • &&:第一個命令失敗不再執行下一個
  • `:讓 ping 失敗
  • 常用的 Payload

Command Injection

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv) {
 char cat[] = "cat ";
 char *command;
 size_t commandLength;

 commandLength = strlen(cat) + strlen(argv[1]) + 1;
 command = (char *) malloc(commandLength);
 strncpy(command, cat, commandLength);
 strncat(command, argv[1], (commandLength - strlen(cat)) );

 system(command);
 return (0);
}
$ ./catWrapper Story.txt
When last we left our heroes...
  • 正常使用

Command Injection

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv) {
 char cat[] = "cat ";
 char *command;
 size_t commandLength;

 commandLength = strlen(cat) + strlen(argv[1]) + 1;
 command = (char *) malloc(commandLength);
 strncpy(command, cat, commandLength);
 strncat(command, argv[1], (commandLength - strlen(cat)) );

 system(command);
 return (0);
}
$ ./catWrapper "Story.txt; ls"
When last we left our heroes...
Story.txt               doubFree.c              nullpointer.c
unstosig.c              www*                    a.out*
format.c                strlen.c                useFree*
catWrapper*             misnull.c               strlength.c             useFree.c
commandinjection.c      nodefault.c             trunc.c                 writeWhatWhere.c
  • 加分號後放另一個 command

Practice

Thank You!

CTF[1]

By Claire Pan

CTF[1]

  • 21