[{"data":1,"prerenderedAt":435},["ShallowReactive",2],{"post-super-cookie":3},{"id":4,"title":5,"body":6,"description":419,"extension":420,"meta":421,"navigation":429,"path":430,"seo":431,"stem":432,"__hash__":433,"dateDisplay":427,"image":428,"tags":423,"badge":422,"readingTime":434},"posts\u002Fposts\u002Fsuper-cookie.md","Super Cookie — Write-up (ISP MiniCTF 2025)",{"type":7,"value":8,"toc":409},"minimark",[9,20,25,36,46,56,60,70,77,99,105,112,118,125,135,146,150,166,172,175,181,193,197,210,213,219,225,240,246,253,259,270,276,289,293,296,302,308,312,318,325,330,355,365,371,375],[10,11,12],"blockquote",{},[13,14,15,16,19],"p",{},"Một write-up cho challenge Web tại miniCTF, kể lại hành trình tìm “bánh quy” bị thất lạc.",[17,18],"br",{},"\nChủ đề: Cookie tampering, privilege escalation.",[21,22,24],"h2",{"id":23},"_1-câu-chuyện-bắt-đầu","1. Câu chuyện bắt đầu",[13,26,27,28,32,33,35],{},"Một buổi chiều mưa, tôi mở đề CTF: ",[29,30,31],"strong",{},"Super Cookie",".",[17,34],{},"\nĐiểm số 500 — khá cao, chắc hẳn không dễ dàng.",[10,37,38],{},[13,39,40,43,45],{},[29,41,42],{},"Đề bài:",[17,44],{},"\n\"Oguri Cap đang đi tập luyện trên đường nhưng vô tình rơi vào thế giới VulnderLand.Do liên tục chạy trong nhiều giây, dần dần cô ấy cảm thấy đói và thèm bánh quy. Bạn hãy giúp cô ấy tìm được bánh quy để tiếp tục chạy nhé!\"",[13,47,48,49,52,53,55],{},"Bánh quy? 🤔 Ở thế giới web thì chỉ có ",[29,50,51],{},"cookie"," là chiếc bánh quy quan trọng nhất.",[17,54],{},"\nVậy flag rất có khả năng liên quan đến cookie hoặc session.",[21,57,59],{"id":58},"_2-bước-vào-mê-cung-recon","2. Bước vào mê cung (Recon)",[13,61,62,63,32,67,69],{},"Tôi mở trình duyệt, truy cập vào ",[64,65,66],"code",{},"http:\u002F\u002F103.249.117.57:4999\u002Flogin.php",[17,68],{},"\nMột trang đăng ký \u002F đăng nhập hiện ra, khá đơn giản. Không có gì đặc biệt ở giao diện.",[13,71,72],{},[73,74],"img",{"alt":75,"src":76},"Login page","\u002Fimages\u002FminiCTF\u002FSuperCookie\u002Flogin.png",[13,78,79,80,84,86,87,90,91,94,95,98],{},"Trong đầu vang lên suy nghĩ: ",[81,82,83],"em",{},"“Đã là CTF thì form login hiếm khi để brute-force. Chắc chắn có trick ở cookie\u002Fsession.”",[17,85],{},"\nBắt đầu tôi thử ",[29,88,89],{},"đăng ký"," tài khoản: ",[64,92,93],{},"username = dinhvaren",", ",[64,96,97],{},"password = 1234",". Sau khi đăng ký xong, tôi đăng nhập bằng tài khoản đó.",[13,100,101],{},[73,102],{"alt":103,"src":104},"Signup page","\u002Fimages\u002FminiCTF\u002FSuperCookie\u002Fsignup.png",[13,106,107,108,111],{},"Tiếp theo tôi bật ",[29,109,110],{},"Burp Suite"," và bắt gói tin khi submit request đăng nhập. Server trả về một số cookie trong response — điều này khiến tôi chú ý.",[13,113,114],{},[73,115],{"alt":116,"src":117},"Burp Intercept","\u002Fimages\u002FminiCTF\u002FSuperCookie\u002FpostLogin.png",[13,119,120,121,124],{},"Trong phần ",[64,122,123],{},"Set-Cookie"," tôi thấy:",[126,127,132],"pre",{"className":128,"code":130,"language":131},[129],"language-text","Set-Cookie: PHPSESSID=9c0b94ce3efef5f2ce62ef39b15ecd0c;\nSet-Cookie: user=dinhvaren;\nSet-Cookie: role=user;\n","text",[64,133,130],{"__ignoreMap":134},"",[13,136,137,138,141,142,145],{},"Cú nhìn đầu tiên đã gợi ý: đây có thể là ",[29,139,140],{},"cookie tampering"," — server tin vào giá trị ",[64,143,144],{},"role"," do client cung cấp.",[21,147,149],{"id":148},"_3-giải-mã-bánh-quy-cookie-decoding","3. Giải mã bánh quy (cookie decoding)",[13,151,152,153,156,157,94,160,163,164,32],{},"Tôi mở ",[29,154,155],{},"Burp → Proxy → HTTP history"," để quan sát rõ hơn. Ba mục cookie hiện ra: ",[64,158,159],{},"PHPSESSID",[64,161,162],{},"user",", và ",[64,165,144],{},[13,167,168],{},[73,169],{"alt":170,"src":171},"Burp Suite Cookies","\u002Fimages\u002FminiCTF\u002FSuperCookie\u002Fcookie.png",[13,173,174],{},"Các giá trị hiện như sau:",[126,176,179],{"className":177,"code":178,"language":131},[129],"PHPSESSID = 9c0b94ce3efef5f2ce62ef39b15ecd0c;\nuser = dinhvaren;  \nrole: = user;  \n",[64,180,178],{"__ignoreMap":134},[13,182,183,184,186,187,189,190],{},"Có một khoảnh khắc im lặng — ",[64,185,144],{}," là ",[64,188,162],{},". Tôi mỉm cười nhẹ: ",[81,191,192],{},"\"Nếu bánh quy ở trong kho nhà admin, thì ta phải trở thành admin.\"",[21,194,196],{"id":195},"_4-trò-nghịch-cookie-tampering","4. Trò nghịch cookie (Tampering)",[13,198,199,200,202,203,205,206,209],{},"Ý nghĩ đơn giản hiện lên: sửa cookie ",[64,201,144],{}," từ ",[64,204,162],{}," thành ",[64,207,208],{},"admin"," để xem server phản ứng thế nào.",[13,211,212],{},"Trong Burp Repeater, tôi chỉnh cookie thành:",[126,214,217],{"className":215,"code":216,"language":131},[129],"Cookie: PHPSESSID=9c0b94ce3efef5f2ce62ef39b15ecd0c;\nuser=dinhvaren;\nrole=admin\n",[64,218,216],{"__ignoreMap":134},[13,220,221],{},[73,222],{"alt":223,"src":224},"Repeater Request","\u002Fimages\u002FminiCTF\u002FSuperCookie\u002FsetAdmin.png",[13,226,227,228,231,232,205,234,236,237,32],{},"Tim tôi đập nhanh khi nhấn ",[29,229,230],{},"Go"," gửi request mới.\nỒ có vẻ như không thấy gì sau khi tôi đã sửa ",[64,233,144],{},[64,235,208],{}," cả, ngay lúc này trong đầu tôi suy nghĩ rằng có thể có 1 đường dẫn nào đó trong source code, tôi liền kiểm tra ",[64,238,239],{},"index.php",[13,241,242],{},[73,243],{"alt":244,"src":245},"Response index.php","\u002Fimages\u002FminiCTF\u002FSuperCookie\u002FcheckIndex.png",[13,247,248,249,252],{},"Sau khi gửi request, ban đầu không thấy gì thay đổi trên trang index. Tôi nghi ngờ có thể flag nằm ở một endpoint ẩn, nên quyết định dò thêm các đường dẫn tiềm năng.\nTôi dùng ",[64,250,251],{},"ffuf"," nhẹ để fuzz các file\u002Fendpoint phổ biến — không quét mạnh, chỉ vài từ khóa ngắn:",[13,254,255],{},[73,256],{"alt":257,"src":258},"Ffuf admin.php","\u002Fimages\u002FminiCTF\u002FSuperCookie\u002FFuzz.png",[13,260,261,262,265,266,269],{},"Kết quả cho thấy tồn tại ",[64,263,264],{},"admin.php",". Tôi truy cập ",[64,267,268],{},"\u002Fadmin.php"," bằng Burp để xem response.",[13,271,272],{},[73,273],{"alt":274,"src":275},"Response admin.php","\u002Fimages\u002FminiCTF\u002FSuperCookie\u002FrequestAdmin.png",[13,277,278,279,281,282,285,286,32],{},"Trang ",[64,280,268],{}," không hiển thị flag trực tiếp nhưng trong nội dung trả về có gợi ý về một endpoint khác: ",[64,283,284],{},"flag.php",". Tôi truy cập ngay ",[64,287,288],{},"\u002Fflag.php",[21,290,292],{"id":291},"_5-khám-phá-kho-báu-flag","5. Khám phá kho báu (Flag)",[13,294,295],{},"Server trả về trang chứa flag — đúng như mong đợi, chiếc bánh quy đã lộ ra:",[13,297,298],{},[73,299],{"alt":300,"src":301},"Flag page","\u002Fimages\u002FminiCTF\u002FSuperCookie\u002FCTF.png",[13,303,304,305,307],{},"Chiếc bánh quy ngọt ngào đã thuộc về Oguri Cap.",[17,306],{},"\nTôi lưu lại ảnh chụp màn hình (Burp request\u002Fresponse, DevTools cookie, trang flag) làm bằng chứng cho hành trình này.",[21,309,311],{"id":310},"_6-kết-thúc-câu-chuyện","6. Kết thúc câu chuyện",[13,313,314,315,317],{},"Chiếc bánh quy cuối cùng cũng xuất hiện dưới dạng flag.",[17,316],{},"\nTôi dựa lưng vào ghế, thở phào: một thử thách 500 điểm đã hạ gục.",[13,319,320,321,324],{},"Từ một trang login tưởng chừng vô hại, tôi lần theo dấu vết cookie, phát hiện server ",[29,322,323],{},"tin tưởng role do client gửi lên",", và chỉ bằng cách sửa một giá trị nhỏ, tôi đã leo quyền thành admin để tìm ra bí mật ẩn sau.",[13,326,327],{},[29,328,329],{},"Bài học rút ra từ câu chuyện này:",[331,332,333,337,340,343],"ul",{},[334,335,336],"li",{},"Đừng bao giờ tin dữ liệu do client gửi lên.",[334,338,339],{},"Không nên lưu trực tiếp role\u002Fpermission trong cookie.",[334,341,342],{},"Nếu cần, hãy lưu role ở server-side session, không để client chỉnh được.",[334,344,345,346,94,349,94,352,32],{},"Cookie nên có thêm flag ",[64,347,348],{},"HttpOnly",[64,350,351],{},"Secure",[64,353,354],{},"SameSite",[13,356,357,358,360,361,364],{},"Trong đời thực, một lỗi nhỏ thế này có thể khiến toàn bộ hệ thống bị chiếm quyền.",[17,359],{},"\nNhưng trong cuộc chơi CTF, nó chỉ đem lại cho tôi một ",[29,362,363],{},"chiếc bánh quy ngọt ngào mang tên flag",":",[126,366,369],{"className":367,"code":368,"language":131},[129],"miniCTF{Sup3r_4ssm1n}\n",[64,370,368],{"__ignoreMap":134},[21,372,374],{"id":373},"appendix-quick-steps","Appendix — Quick Steps",[376,377,378,386,392,398,406],"ol",{},[334,379,380,381,94,383,385],{},"Đăng ký \u002F Login → Burp Intercept → xem các cookie được set (",[64,382,162],{},[64,384,144],{},").",[334,387,388,389,32],{},"Phát hiện ",[64,390,391],{},"role=user",[334,393,394,395,32],{},"Sửa cookie thành ",[64,396,397],{},"role=admin",[334,399,400,401,403,404,32],{},"Dò endpoint (ví dụ dùng ffuf nhẹ) → tìm ",[64,402,264],{}," → từ đó truy cập ",[64,405,284],{},[334,407,408],{},"Copy flag và lưu bằng chứng (screenshots, request\u002Fresponse).",{"title":134,"searchDepth":410,"depth":410,"links":411},2,[412,413,414,415,416,417,418],{"id":23,"depth":410,"text":24},{"id":58,"depth":410,"text":59},{"id":148,"depth":410,"text":149},{"id":195,"depth":410,"text":196},{"id":291,"depth":410,"text":292},{"id":310,"depth":410,"text":311},{"id":373,"depth":410,"text":374},"Bài write-up chi tiết cho thử thách Web \"Super Cookie\" (chỉnh sửa cookie & leo thang đặc quyền) — ISP MiniCTF 2025. (500 điểm)","md",{"badge":422,"tags":423,"date":426,"dateDisplay":427,"image":428},"CTF Write-up",[424,425],"CTF","Web","2025-08-08","August 8, 2025","\u002Fthumbnails\u002Fispminictf.png",true,"\u002Fposts\u002Fsuper-cookie",{"title":5,"description":419},"posts\u002Fsuper-cookie","Y4JqaDCDB7lDFjF56KcvxRShOw4evLdro8EK-g8TwoI",4,1787385493756]