[{"data":1,"prerenderedAt":470},["ShallowReactive",2],{"post-cbjs-musoe-01":3},{"id":4,"title":5,"body":6,"description":455,"extension":456,"meta":457,"navigation":465,"path":466,"seo":467,"stem":468,"__hash__":469,"dateDisplay":463,"image":464,"tags":459,"badge":458,"readingTime":270},"posts\u002Fposts\u002Fcbjs-musoe-01.md","Musoe 01 — Write-up (Cyberjutsu 2025)",{"type":7,"value":8,"toc":446},"minimark",[9,16,31,36,49,56,67,78,85,89,92,103,109,137,143,147,162,168,192,202,206,232,235,325,331,335,338,344,349,355,359,381,387,412,416,436,442],[10,11,12],"p",{},[13,14,15],"strong",{},"Write-up",[17,18,19],"blockquote",{},[10,20,21,22,26,27,30],{},"Một chuyến ghé thăm ",[23,24,25],"em",{},"Musoe"," — nơi mọi thứ có thể được mua bán, kể cả những điều kỳ quặc nhất.",[28,29],"br",{},"\nChủ đề: lỗi logic cửa hàng (client-trust), tampering request, checkout → mua được flag.",[32,33,35],"h2",{"id":34},"_1-câu-chuyện-bắt-đầu","1. Câu chuyện bắt đầu",[10,37,38,39,41,42,45,46],{},"Một đêm lang thang trong thế giới CTF, mình mở bản đồ và thấy một lab tên ",[13,40,25],{}," thuộc hệ thống ",[23,43,44],{},"CyberJutsu Lab",". Có một hint: ",[13,47,48],{},"“flag can be bought in the shop.”",[10,50,51,52,55],{},"Ý nghĩ đầu tiên: ",[23,53,54],{},"Ai lại bán flag công khai?"," Nhưng một hint là hint — mình quyết định đi thử.\nMình truy cập:",[57,58,63],"pre",{"className":59,"code":61,"language":62},[60],"language-text","https:\u002F\u002Fmusoe.cyberjutsu-lab.tech\u002F\n","text",[64,65,61],"code",{"__ignoreMap":66},"",[10,68,69,70,73,74,77],{},"Mình đăng ký và đăng nhập (username ",[64,71,72],{},"dinhvaren",", password ",[64,75,76],{},"test",") để truy cập giao diện shop.",[10,79,80],{},[81,82],"img",{"alt":83,"src":84},"Login form","\u002Fimages\u002FCyberjutsu\u002Fmusoe1\u002FloginPage.png",[32,86,88],{"id":87},"_2-thăm-dò-ngôi-làng-recon","2. Thăm dò ngôi làng (Recon)",[10,90,91],{},"Giao diện hiện ra giống một cửa hàng nhỏ: Home, Shop, Cart — nhìn rất bình thường.",[10,93,94,95,98,99,102],{},"Mình click vào ",[13,96,97],{},"Shop"," và thấy danh sách mặt hàng cùng giá tiền. có item ",[64,100,101],{},"Flag"," với giá lớn (9999). Mình bật Burp Suite để xem các request\u002Fresponse.",[10,104,105],{},[81,106],{"alt":107,"src":108},"Shop UI + Flag card","\u002Fimages\u002FCyberjutsu\u002Fmusoe1\u002Fdashboard.png",[10,110,111,112,115,116,119,120,123,124,123,127,130,131,133,134,136],{},"Trong ",[64,113,114],{},"HTTP history"," ta bắt được ",[64,117,118],{},"GET \u002Fapi\u002Fv2\u002Fproducts"," trả về JSON chứa tất cả sản phẩm (mỗi object có ",[64,121,122],{},"id",", ",[64,125,126],{},"name",[64,128,129],{},"price",", ...). Đây là nguồn để biết ",[64,132,122],{}," của ",[64,135,101],{},".",[10,138,139],{},[81,140],{"alt":141,"src":142},"GET \u002Fapi\u002Fv2\u002Fproducts response","\u002Fimages\u002FCyberjutsu\u002Fmusoe1\u002Fgetproducts.png",[32,144,146],{"id":145},"_3-cửa-hàng-bí-mật-analysis","3. Cửa hàng bí mật (Analysis)",[10,148,149,150,153,154,157,158,161],{},"Mình thử mua 1 sản phẩm bình thường (Whiskers) từ UI, quan sát request POST tạo order. Mỗi order được gửi đến endpoint ",[64,151,152],{},"POST \u002Fapi\u002Fv2\u002Forders\u002Fcreate"," với body JSON chứa ",[64,155,156],{},"note"," và ",[64,159,160],{},"product"," object.",[10,163,164],{},[81,165],{"alt":166,"src":167},"Create order - example request\u002Fresponse","\u002Fimages\u002FCyberjutsu\u002Fmusoe1\u002Fpostorders.png",[10,169,170,171,173,174,123,176,123,178,181,182,185,186,188,189,136],{},"Phát hiện quan trọng: server chấp nhận nguyên ",[64,172,160],{}," object từ client (client gửi ",[64,175,122],{},[64,177,129],{},[64,179,180],{},"description"," trong body). Điều này có nghĩa server ",[13,183,184],{},"dùng dữ liệu client gửi làm nguồn xác thực cho order",", thay vì lookup ",[64,187,129],{}," từ DB theo ",[64,190,191],{},"product.id",[10,193,194,195,198,199],{},"Điều đáng chú ý: ",[13,196,197],{},"giá (price)"," được gửi từ client. Server dường như tin dữ liệu client gửi về giá cả.\nTrong đầu mình lóe lên một ý: ",[23,200,201],{},"nếu server chấp nhận giá do client gửi, liệu mình có thể gửi item tùy ý (ví dụ \"flag\") với giá rẻ không?",[32,203,205],{"id":204},"_4-trò-nghịch-ngợm-tampering","4. Trò nghịch ngợm (Tampering)",[10,207,208,209,211,212,214,215,217,218,220,221,224,225,227,228,231],{},"Ý tưởng tấn công: dùng ",[64,210,118],{}," để lấy ",[64,213,122],{}," của item ",[64,216,101],{}," (id = 1), sau đó gửi ",[64,219,152],{}," với ",[64,222,223],{},"product.id = 1"," nhưng chỉnh ",[64,226,129],{}," = ",[64,229,230],{},"0"," (hoặc bất kỳ giá rẻ), hy vọng server chấp nhận và trả flag trong response.",[10,233,234],{},"Mẫu payload mình gửi bằng Burp Repeater \u002F Intercept:",[57,236,240],{"className":237,"code":238,"language":239,"meta":66,"style":66},"language-json shiki shiki-themes github-light github-dark","{\n  \"note\": \"test\",\n  \"product\": {\n    \"id\": 1,\n    \"price\": 0,\n    \"description\": \"description\"\n  }\n}\n","json",[64,241,242,251,268,277,290,302,313,319],{"__ignoreMap":66},[243,244,247],"span",{"class":245,"line":246},"line",1,[243,248,250],{"class":249},"sVt8B","{\n",[243,252,254,258,261,265],{"class":245,"line":253},2,[243,255,257],{"class":256},"sj4cs","  \"note\"",[243,259,260],{"class":249},": ",[243,262,264],{"class":263},"sZZnC","\"test\"",[243,266,267],{"class":249},",\n",[243,269,271,274],{"class":245,"line":270},3,[243,272,273],{"class":256},"  \"product\"",[243,275,276],{"class":249},": {\n",[243,278,280,283,285,288],{"class":245,"line":279},4,[243,281,282],{"class":256},"    \"id\"",[243,284,260],{"class":249},[243,286,287],{"class":256},"1",[243,289,267],{"class":249},[243,291,293,296,298,300],{"class":245,"line":292},5,[243,294,295],{"class":256},"    \"price\"",[243,297,260],{"class":249},[243,299,230],{"class":256},[243,301,267],{"class":249},[243,303,305,308,310],{"class":245,"line":304},6,[243,306,307],{"class":256},"    \"description\"",[243,309,260],{"class":249},[243,311,312],{"class":263},"\"description\"\n",[243,314,316],{"class":245,"line":315},7,[243,317,318],{"class":249},"  }\n",[243,320,322],{"class":245,"line":321},8,[243,323,324],{"class":249},"}\n",[10,326,327],{},[81,328],{"alt":329,"src":330},"Tampered order request","\u002Fimages\u002FCyberjutsu\u002Fmusoe1\u002Frepeatcher.png",[32,332,334],{"id":333},"_5-thanh-toán-và-nhận-kho-báu-exploitation","5. Thanh toán và nhận kho báu (Exploitation)",[10,336,337],{},"Server trả về response chứa flag khi order được xử lý với payload tampered:",[10,339,340],{},[81,341],{"alt":342,"src":343},"Response with flag","\u002Fimages\u002FCyberjutsu\u002Fmusoe1\u002Fflag.png",[10,345,346],{},[13,347,348],{},"Flag thu được:",[57,350,353],{"className":351,"code":352,"language":62},[60],"CBJS{ab413281962b76090c0db9051c05d2f2}\n",[64,354,352],{"__ignoreMap":66},[32,356,358],{"id":357},"_6-kết-thúc-câu-chuyện-conclusion","6. Kết thúc câu chuyện (Conclusion)",[10,360,361,362,365,366,368,369,371,372,374,375,377,378,380],{},"Mình đã tận dụng được lỗi ",[13,363,364],{},"client-trust \u002F broken business logic",": server chấp nhận ",[64,367,160],{}," object (bao gồm ",[64,370,129],{},") trực tiếp từ client khi tạo order. Bằng cách gửi ",[64,373,191],{}," tương ứng với ",[64,376,101],{}," và chỉnh ",[64,379,129],{}," = 0, server xử lý order và trả flag trong response.",[10,382,383,386],{},[13,384,385],{},"Bài học rút ra",":",[388,389,390,394,409],"ul",{},[391,392,393],"li",{},"Không bao giờ tin thông tin tài chính (price, discounts, product status) từ client.",[391,395,396,397,399,400,402,403,402,405,408],{},"Server phải luôn xác thực ",[64,398,191],{}," và lookup ",[64,401,129],{},"\u002F",[64,404,126],{},[64,406,407],{},"availability"," từ database hoặc nguồn dữ liệu authoritative trước khi tạo order\u002Fcharge.",[391,410,411],{},"Các endpoint tạo order cần kiểm tra tính hợp lệ và quyền (authorization) nghiêm ngặt.",[32,413,415],{"id":414},"appendix-requests-evidence-checklist","Appendix — Requests & Evidence checklist",[388,417,418,421,424,430,433],{},[391,419,420],{},"Register \u002F Login screenshots (Hình 1).",[391,422,423],{},"Shop UI và product list (Hình 2).",[391,425,426,427,429],{},"GET \u002Fapi\u002Fv2\u002Fproducts response (Hình 3) — xác định ",[64,428,122],{}," của Flag.",[391,431,432],{},"POST \u002Fapi\u002Fv2\u002Forders\u002Fcreate (tampered) request (Hình 5).",[391,434,435],{},"Response chứa flag (Hình 6).",[10,437,438,441],{},[13,439,440],{},"Ghi chú về bảo mật & chia sẻ",": khi public write-up, che hoặc loại bỏ cookie\u002Fsession hoặc bất kỳ thông tin cá nhân nào trước khi đăng. Giá trị flag có thể là sensitive trong cuộc thi — đăng có cân nhắc theo luật CTF.",[443,444,445],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":66,"searchDepth":253,"depth":253,"links":447},[448,449,450,451,452,453,454],{"id":34,"depth":253,"text":35},{"id":87,"depth":253,"text":88},{"id":145,"depth":253,"text":146},{"id":204,"depth":253,"text":205},{"id":333,"depth":253,"text":334},{"id":357,"depth":253,"text":358},{"id":414,"depth":253,"text":415},"Khám phá cửa hàng ẩn, tận dụng logic mua hàng để lấy được flag. Bao gồm bước phân tích, thử nghiệm và khai thác thành công.","md",{"badge":458,"tags":459,"date":462,"dateDisplay":463,"image":464},"CTF Write-up",[460,461],"CTF","Web","2025-09-17","Sep 17, 2025","\u002Fthumbnails\u002Fcbjs.png",true,"\u002Fposts\u002Fcbjs-musoe-01",{"title":5,"description":455},"posts\u002Fcbjs-musoe-01","aYmYr2tqAHKyJg8YyGJxnNbdbM4BeADE4wJEl-IWzVM",1787385493753]