Page cover

πŸ”°[Dice CTF 2023] Writeup Web

web/recursive-csp

Mở Δ‘αΊ§u bΓ i nΓ y chΓΊng ta được cho biαΊΏt flag nαΊ±m ở cookie admin, lα»— hα»•ng mΓ¬nh biαΊΏt chαΊ―c chαΊ―n lΓ  XSS

Quan trọng lΓ m sao để inject được js chαΊ‘y ở Δ‘Γ’y mα»›i quan trọng, ở Δ‘Γ’y mΓ¬nh nhαΊ­n ra source cΓ³ Δ‘oαΊ‘n /?source

Chúng ta sẽ truy cập vào source xem có gì:

MΓ¬nh Δ‘Γ£ phΓ’n tΓ­ch Δ‘oαΊ‘n code trΓͺn bαΊ±ng nhα»―ng dΓ²ng comment, ở Δ‘Γ’y chΓΊng ta sαΊ½ lΖ°u Γ½ tα»›i CSP

CSP lΓ  mα»™t lα»›p bαΊ£o mαΊ­t được thΓͺm vΓ o mα»₯c Δ‘Γ­ch để phΓ‘t hiện vΓ  ngΔƒn chαΊ·n mα»™t sα»‘ loαΊ‘i tαΊ₯n cΓ΄ng thường gαΊ·p, bao gα»“m cαΊ£ cuα»™c tαΊ₯n cΓ΄ng XSS (Cross Site Scripting) vΓ  tαΊ₯n cΓ΄ng data injection.

Ở Δ‘Γ’y cΓ³ mα»™t dΓ²ng ở CSP script-src 'nonce-$nonce' 'unsafe-inline';

MΓ¬nh cΓ³ search thΓ¬ chα»— unsafe-inline thΓ¬ nαΊΏu inject xss vΓ o nΓ³ vαΊ«n hoαΊ‘t Δ‘α»™ng nhΖ°ng mαΊ₯u chα»‘t lΓ  crc32b nΓ³ được mΓ£ hΓ³a vα»›i $name mΓ¬nh Δ‘Ζ°a vΓ o Γ½ lΓ  payload sαΊ½ kiểu nhΖ° nΓ y:

Khi Δ‘Γ³ crc32b nΓ³ sαΊ½ mΓ£ hΓ³a payload trΓͺn thΓ nh mα»™t none khΓ‘c vΓ  check xem nΓ³ cΓ³ khα»›p nhau hay khΓ΄ng? NαΊΏu khΓ΄ng khα»›p nhau thΓ¬ Δ‘oαΊ‘n payload trΓͺn khΓ΄ng thể hoαΊ‘t Δ‘α»™ng vΓ  ngược lαΊ‘i.

Sau mα»™t lΓΊc suy nghΔ©a mΓ¬nh thΓ¬ lΓ m cΓ‘ch nΓ o Δ‘Γ³ để Δ‘oαΊ‘n payload cΓ³ nonce = hash("crc32b", "payload")

Tool brute force sαΊ½ nhΖ° nΓ y:

Flag=diceCTF{h0pe_that_d1dnt_take_too_l0ng}

web/scorescope

ĐÒy lΓ  mα»™t bΓ i mΓ¬nh thαΊ₯y khΓ‘ dα»‹, khi vΓ o trang web chΓΊng ta sαΊ½ cΓ³ mα»™t giao diện nhΖ° nΓ y:

ĐÒy lΓ  trang web giα»‘ng vα»›i cΓ‘c trang web yΓͺu cαΊ§u chΓΊng ta submit bΓ i lΓͺn để check, nhiệm vα»₯ chΓΊng ta sαΊ½ phαΊ£i vượt qua hαΊΏt tαΊ₯t cαΊ£ cΓ‘c test case

Code cα»§a template.py sαΊ½ nhΖ° sau:

Oke khΓ‘ nhiều yΓͺu cαΊ§u để chΓΊng ta giαΊ£i ra, file trΓͺn cΓ³ mα»™t vΓ i case gαΊ§n nhΖ° khΓ΄ng thể solve.

ChΓΊng ta sαΊ½ upload file xem thα»­ nhΖ° nΓ o:

Upload template.py lΓͺn khΓ΄ng sα»­a thΓ¬ bΓ‘o 22 cases đều khΓ΄ng thể pass.

MΓ¬nh sαΊ½ chỉnh lαΊ‘i case Δ‘αΊ§u tiΓͺn vα»›i sum cα»§a a+b:

NαΊΏu chΓΊng ta thα»­ inject mα»™t Δ‘oαΊ‘n python (Kα»Ή thuαΊ­t PyJail)

NhΖ°ng mΓ  khΓ΄ng được, nΓ³ cαΊ₯m

Ở Δ‘Γ’y nαΊΏu thαΊΏ chΓΊng ta sαΊ½ xem trong __main__ cΓ³ gΓ¬ bαΊ±ng cΓ‘ch raise ra Exception cα»§a vars(__main__)

VΓ¬ chΓΊng ta khΓ΄ng thể print ra được nΓͺn chỉ cΓ³ cΓ‘ch vα»©t exception ra ngoΓ i bαΊ±ng kiểu nΓ y để xem nΓ³ cΓ³ thΓ΄ng tin gΓ¬ cΓ³ thể khai thΓ‘c.

Ở Δ‘Γ’y chΓΊng ta chΓΊ Γ½ tα»›i mαΊ£ng test nΓ³ cΓ³ 22 trường hợp giα»‘ng nhΖ° trΓͺn web vαΊ­y chΓΊng ta sαΊ½ lΓ m cΓ‘ch nΓ o Δ‘Γ³ overwrite nΓ³ Δ‘i thΓ¬ chΓΊng ta cΓ³ thể pass tαΊ₯t cαΊ£ mọi case:

Mα»™t lΓΊc suy nghΔ© nαΊΏu cho tαΊ₯t cαΊ£ bαΊ±ng true thΓ¬ sao, mΓ¬nh nghΔ© nΓ³ sαΊ½ được nhΖ°ng mΓ¬nh nhαΊ­n ra test cases lΓΊc nΓ y nΓ³ khΓ΄ng hiện cΓ‘c cases sai nα»―a mΓ  chỉ hiển thα»‹ 1/22 cases Δ‘Γ£ passed vαΊ­y *22 lΓͺn thα»­ xem sao:

VαΊ­y lΓ  exploit thΓ nh cΓ΄ng// Flag: dice{still_more_secure_than_gradescope}

Last updated