กลับมาแล้วนะครับทุกคน ต้องขออภัยที่เพิ่งได้มาเขียน Writeup โจทย์ weekly challenge ของ bugforge.io สำหรับโจทย์นี้ทีมใช้เวลาแก้อยู่นานพอสมควร จนมีคนปาดหน้าเค้กได้ first blood ไปก่อน🤣 เราก็เลยลองไปอ่าน Hint จนได้รู้ว่าต้องแก้โจทย์ยังไง ถ้าพร้อมแล้วเรามาเริ่มกันเลยครับ

None

สำหรับ Hint ของโจทย์นี้คือ The reporting endpoint might have some interesting insights. แสดงว่ามันต้องมี flag เก็บไว้ใน endpoint reporting แน่ ๆ ครับ

None

ทีนี้โจทย์ของเว็บนี้จะเป็นโจทย์ FurHire เว็บจ้างงานและหางานที่เราคุ้นเคยกันดี อันดับแรกให้เราไปสมัครบัญชีก่อน โดยบัญชีมันจะมีสองแบบคือ บัญชีคนจ้างงาน (Recruiter) ต้องคลิกที่ Need to Hire นะครับ ห้ามคลิกที่ปุ่ม Sign Up ไม่อย่างนั้นมันจะเป็นการสมัครบัญชีคนหางานอย่างเดียว (Job Seeker)

None
None
None

หลังจากกรอกข้อมูลการสมัครบัญชีทั้งหมดเรียบร้อยแล้วนะครับ มันจะเข้ามาสู่หน้าแรก ซึ่งบัญชีคนจ้างงานจะมีให้เราสร้าง Job post เพื่อประกาศหาคนงาน เราก็ไปจัดการสร้างให้เรียบร้อย

None

และนี่จะเป็นลักษณะของโพสต์รับสมัครคนงานครับ จำไว้ให้ดีนะ

None

ทีนี้ ในหน้าหลักเราจะสังเกตเห็นแท็บเมนู Company ใช่ไหมครับ มันคือจุดที่ใช้ตั้งค่าข้อมูลของบริษัทของเรา ลองคลิกดูกันเลย

None

ปรากฏว่าในส่วน Company Profile จะมีฟิลด์ Company Logo URL โผล่ขึ้นมา เอ๊ะ!!! เห็น URL เพื่อการเรียกรูปภาพแบบนี้ คิดไว้เลยนะครับว่าถ้าไม่ใช่ SSRF ก็เป็นพวก Path Traversal หรือ LFI แน่ ๆ

None

เอาล่ะ งั้นเราจะลองใช้เว็บอะไรง่าย ๆ ไปก่อน โดยทีมใส่เป็น http://google.com ครับ

None

หลังจากนั้นกลับมาเช็กดูที่หน้า Job Detail หน้าที่แสดงข้อมูลงานที่เราโพสต์หาคนไว้นั่นแหละ ปรากฏว่ามันมีการไปดึง URL ตามที่เราใส่ไว้จริง (มุมขวาบน) แต่เนื่องจาก http://google.com ของเราไม่ใช่พาธรูปภาพ มันก็เลยขึ้นเป็นรูปเสียอย่างที่เห็นในภาพประกอบครับ

None

โอเคทีนี้เรามาดูใน Burp กันบ้าง ข้อมูลจาก Burp พบว่าตัวเว็บมีการเรียก /api/company/3/logo มาจริง ซึ่งเป็นเส้นที่ใช้ในการเรียกรูปภาพมาแสดงผล โดยจะเรียกตาม URL ที่เรากำหนดไว้ใน company profile ส่วน Response จากภาพมันมีการ redirect ของ google เกิดขึ้นจริง (Redirect จาก http ไป https)

None

ดังนั้น เราจะโยน api สองอย่างนี้เข้าไปใน repeater ครับ ได้แก่ /api/company เพื่อส่ง PUT Request แก้ไขค่า logo_url และเส้น /api/company/3/logo เพื่อคอยดูว่ามัน fetch ข้อมูลอะไรมาบ้าง

None
None

ในส่วนของ logo_url ถ้าเราจะดึงข้อมูลจากภายใน เราจะต้อง fetch URL ที่เป็น internal ออกมา ซึ่งปกติในโจทย์ง่าย ๆ จะชอบใช้เป็น http://localhost หรือ http://127.0.0.1 และจาก Hint บอกว่า ให้ดูที่ endpoint reporting ทีมก็เลยใส่เป็น http://127.0.0.1/reporting จากนั้นก็ส่ง request ไปครับ

None

เมื่อลอง GET เส้น /api/company/3/logo ปรากฏว่าขึ้นเป็น Failed to fetch logo แสดงว่า logo_url ที่เราใส่อาจจะยังไม่ใช่ URL ที่ถูกต้องครับ

None

แต่!! ไม่ได้แปลว่า http://127.0.0.1/reporting จะผิดนะครับ เพราะการที่เราใส่ http://127.0.0.1/reporting แบบนี้ จะหมายถึงการเรียก URL จากพอร์ต 80 ซึ่งบางครั้ง (และบ่อยครั้ง) เว็บเซิร์ฟเวอร์อาจจะไม่ได้รันที่พอร์ต 80 ซึ่งพอร์ตที่เราอาจจะเจอได้บ่อยในการทำโจทย์แนว ๆ นี้ จะได้แก่ 8000,8080,8089,9000,9090,5000 และ 3000 ซึ่งโจทย์นี้เราจบที่พอร์ต 3000 ดังนั้น URL ที่เราใช้ในโจทย์ คือ http://127.0.0.1:3000/reporting

None

เมื่อลอง GET เส้น /api/company/3/logo เราก็จะเจอ Flag ใน Response ครับ

None

ในโจทย์นี้ Flag คือ bug{BODkB2npdQ28FfmGxaDTPyMhJSI4YwXn}

สนใจแนวนี้ฝากกดติดตามด้วยนะครับ หรือติดตามได้ในช่องทางเหล่านี้