การค้นพบ XSS บน Chess.com
- ระหว่างเล่นหมากรุกเป็นงานอดิเรกและลองเล่นกับเทคนิคต่าง ๆ ก็พบช่องโหว่ XSS บน Chess.com
- Chess.com เป็นเว็บไซต์หมากรุกออนไลน์ที่ใหญ่ที่สุดบนอินเทอร์เน็ต โดยมีสมาชิกมากกว่า 100 ล้านคน
ภาพรวม
- เริ่มใช้งาน Chess.com อย่างจริงจังมากขึ้นในช่วงต้นปี 2023
- ชวนเพื่อนให้สมัครเว็บไซต์ และเมื่อใช้ฟีเจอร์เพื่อนก็กลายเป็นเพื่อนกันได้ทันที
- จึงสงสัยว่าสามารถทำการเพิ่มเพื่อนอัตโนมัติได้หรือไม่ ในลักษณะคล้ายกับ MySpace worm
- สร้างบัญชีใหม่และเปิดแท็บ Network ในเครื่องมือนักพัฒนา จนพบ URL สำหรับการเพิ่มเพื่อนอัตโนมัติ
ช่วงกลางเกม
- ทดลองทำ XSS โดยใช้ TinyMCE rich text editor
- ใช้ Burp proxy เพื่อแทรกโค้ด HTML ลงไปตรง ๆ ในคำอธิบาย 'About'
- ตรวจสอบการตั้งค่า TinyMCE และสร้าง XSS payload โดยใช้พร็อพเพอร์ตีสไตล์
background-image - ทดสอบสัญลักษณ์หลายแบบเพื่อหาวิธีที่ทำให้ XSS ทำงานได้
- สุดท้ายพัฒนาวิธีที่สามารถดึง cookie และ JavaScript object ออกมาได้
เอนด์เกม
- พยายามทำให้ XSS ทำงานได้อย่างสมบูรณ์
- พบวิธีใหม่ที่ใช้แอตทริบิวต์
srcsetเพื่อให้ใช้ไวยากรณ์ JS ได้กว้างขึ้น - ใช้การเข้ารหัส Base64 เพื่อรัน XSS payload ได้โดยตรง
- TinyMCE editor ถูกใช้งานทั่วทั้งเว็บไซต์ จึงทำให้ผลกระทบมีวงกว้าง
การวิเคราะห์
- สาเหตุรากของช่องโหว่มาจากฟังก์ชันอัปโหลดภาพซ้ำ
- สามารถหลบเลี่ยงการตรวจสอบ image hosting ได้ด้วยการใส่ชื่อโดเมนของ Chess.com
- rich text editor อนุญาตองค์ประกอบ HTML ได้หลากหลาย จึงเหมาะกับการทำ XSS
- TinyMCE เป็นเวอร์ชันล่าสุด แต่ขาดการ sanitize กับ HTML ขั้นสุดท้าย
- Chess.com ควรทำการ sanitize กับ HTML ขั้นสุดท้ายที่จะแสดงให้ผู้ใช้เห็น
ความเห็นของ GN⁺:
- บล็อกโพสต์นี้อธิบายกระบวนการค้นพบและรายงานช่องโหว่ด้านความปลอดภัยที่อาจเกิดขึ้นได้บนแพลตฟอร์มออนไลน์ขนาดใหญ่อย่าง Chess.com ได้น่าสนใจ
- ช่องโหว่ XSS อาจเป็นภัยคุกคามร้ายแรงต่อความปลอดภัยของเว็บไซต์ และการค้นหาและแก้ไขช่องโหว่ลักษณะนี้มีความสำคัญอย่างยิ่งต่อการคุ้มครองข้อมูลส่วนตัวของผู้ใช้เว็บไซต์
- บทความนี้เน้นย้ำกับนักพัฒนาซอฟต์แวร์และผู้เชี่ยวชาญด้านความปลอดภัยถึงความสำคัญของการตระหนักรู้ถึงช่องโหว่ในองค์ประกอบของเว็บแอปพลิเคชัน เช่น rich text editor และการป้องกันช่องโหว่เหล่านี้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ผมคือ OP เอง ขอบคุณมากสำหรับคอมเมนต์เชิงบวกทั้งหมดนะครับ ขอเล่าภูมิหลังสักนิด ผมเป็นนักเรียนอายุ 17 ปีในสหราชอาณาจักร กำลังเตรียมสอบ A-Levels และยังตัดสินใจอยู่ระหว่างว่าจะเข้ามหาวิทยาลัยไหนกับตัวเลือก degree apprenticeship
ดูโปรไฟล์ GitHub ของผมได้ที่นี่ -> https://github.com/Jayy001
ผมเป็นหนึ่งในสมาชิกหลักของ HashPals เป็นผู้สร้าง Search-That-Hash และยังเป็นผู้ดูแลหลักของคลังซอฟต์แวร์โอเพนซอร์สฟรีสำหรับแท็บเล็ต ReMarkable ด้วย
ถ้าอยากคุยต่อก็ติดต่อมาได้ อีเมลอยู่ในคำอธิบายโปรไฟล์ของผม
แล้วถ้าจะไปสาย IT ก็ควรเรียนรู้เรื่อง การต่อรองสัญญาและการเงิน ไว้ด้วย
สมัยที่ประสบการณ์บนอินเทอร์เน็ตของผมมีแค่แพ้ซ้ำ ๆ ในบทบาท “บรรณารักษ์อาสา” บน Chess.com ผมเคยฉีดอักขระที่ escape มาแบบแปลก ๆ, closing tag, control string ทั่วไป ๆ และแม้กระทั่ง OLE object เข้าไปในเกม Chess.com แบบเรียลไทม์
Eric ผู้ก่อตั้งขออย่างสุภาพให้ผมช่วยตรวจสอบแบบเป็นทางการมากขึ้น แต่ผมปฏิเสธเพราะไม่อยากเปิดเผยว่าตัวเองเป็น script kiddie อายุ 11 ขวบ แทนที่จะทำแบบนั้น ผมอธิบาย regex ที่จำเป็นสำหรับการเซ็นเซอร์ห้องแชต และคุยกันต่อถึงปัญหาใหญ่กว่าว่าจะตรวจจับการโกงในสภาพแวดล้อมแบบ asynchronous ได้อย่างไร
หลังจากคิดอยู่พักหนึ่ง ผมบอกว่าวิธีเดียวที่เป็นไปได้คือเอาแต่ละตาที่มีมูลค่าสูงและสำคัญในเกมไปเทียบกับตาที่ดีที่สุดที่ engine รู้จัก แล้วใช้การอนุมานเชิงสถิติเพื่อแยกมนุษย์ที่เล่นเก่งออกจากคนโกง
แน่นอนว่าในตอนนั้นมันเป็นวิธีที่เป็นไปไม่ได้แบบเหลือเชื่อ และสุดท้ายข้อสรุปก็ออกมาแบบนั้นอยู่ดี ถึงอย่างนั้น การที่เด็กเพิ่งพ้นวัยประถมได้มาคุยเรื่องละเอียดอ่อนแบบนี้กับเว็บมาสเตอร์ตัวจริง ก็ยังเป็นความทรงจำทางอินเทอร์เน็ตที่ดีมาก
ตอนอ่านประโยคที่ว่า “ฟีเจอร์นี้ทำให้นึกถึง MySpace worm ราวปี 2005 แต่ตอนนั้นผมยังไม่เกิดเลย!” ก็รู้สึกตัวทันทีว่าแก่ลงทุกวัน
การยืนกรานว่าจะ อนุญาตให้ผู้ใช้ใส่ HTML ลงในเว็บไซต์ กลายเป็นปัญหาใหญ่มาก ทุกวันนี้เราคง parse อินพุต HTML ให้ถูกต้องแล้วลบ attribute กับ tag ที่ห้ามใช้ทิ้ง แต่สมัยนั้นจัดการกันด้วย regex แบบบ้าคลั่ง
ไม่แน่ใจว่าเกี่ยวกันไหม แต่ผมเคยเห็นกับตาและอัดวิดีโอไว้ด้วยว่ามีคน เดินหมากแทนผม ในเกม Chess.com แล้วก็เคยมีเกมที่กำลังเล่นอยู่โผล่มาให้ผม และผมสามารถเดินหมากได้ทั้งที่ตามปกติไม่ควรทำได้
ถ้าลองค้นใน Google ก็มีเธรดเกี่ยวกับเรื่องนี้อยู่พอสมควร ไม่รู้ว่า Chess.com แก้ไปหรือยังในช่วงไม่กี่เดือนที่ผ่านมา แต่ตอนที่ผมพยายามรายงาน พวกเขาไม่ค่อยอยากฟัง
ทั้งหมดนี้เกิดขึ้นตอนที่ผมไม่ได้ล็อกอินเข้าเว็บไซต์ ตอนล็อกอินอยู่ผมไม่เคยเจอ แต่ผมก็ไม่ได้เล่นหมากรุกบ่อยเพราะมันไม่ค่อยดีกับความดัน
แค่อ่านชื่อเรื่อง ผมนึกว่าจะเป็นอะไรพื้นฐานกว่านี้มาก แต่จริง ๆ แล้วมันเป็นการทำ exploit ที่ทะลุ การตรวจสอบอินพุต หลายชั้นด้วยวิธีอ้อมที่ฉลาดมาก เขายังตั้ง subdomain เพื่อให้มันดูเหมือนโดเมนหลักด้วย
ไม่คิดเลยว่าวิธีนี้จะใช้ได้ ซึ่งก็น่าสนใจในตัวมันเอง พอลองคิดว่าการ parse โดเมนด้วย regex มันซับซ้อนแค่ไหน ก็รู้สึกว่าเป็นจุดที่พลาดได้ง่ายเหมือนกัน หรือไม่ก็อาจแค่เช็ก
'...'ภายในตัวแปรแบบง่าย ๆ เท่านั้นผู้เขียนรู้เรื่องในสายนี้ดีมาก ทำให้อดทึ่งไม่ได้ว่าเขาขุดลึกเพื่อไปถึงทักษะระดับนี้มานานแค่ไหน น่าจะเป็นเส้นทางอาชีพที่น่าสนใจทีเดียว
บทความดีมากครับ OP ขอให้เส้นทางสายแฮ็กกิงของคุณไปได้สวยนะ ถ้ายังไม่รู้ เวลาพวก payload อย่าง
alert(1)โดนกรองหรือ encode วงเล็บ คุณอาจลองใช้ backtick เป็นalert\1`` ได้ถ้าอยากยกระดับการฉีด JavaScript ขึ้นอีกขั้น XSS cheat sheet ของ Brute Logic กับ Javascript for Hackers ของ Gareth Heyes เป็นแหล่งข้อมูลที่ดีมาก บางคนมองว่า cross-site scripting เป็นเรื่องเล็กน้อย แต่จริง ๆ มันยังทรงพลังมากและยังพบได้แพร่หลาย โดยเฉพาะอย่างยิ่งถ้า session cookie ไม่มี HttpOnly อย่างที่ plugin-baby ชี้ไว้
เจ๋งมาก ผมชอบอ่านบทวิเคราะห์ bug bounty โดยเฉพาะบทความเกี่ยวกับ XSS มันดูเหมือนหาง่ายอยู่เสมอ แต่คงเป็นแค่ confirmation bias และในความเป็นจริงผมแค่มองไม่เห็นเวลาที่เสียไปกับการทดสอบที่ไม่ได้ผลหรือทางตันต่าง ๆ มากกว่า
พออ่านประโยคที่ว่า “ฟีเจอร์นี้ทำให้นึกถึง MySpace worm ราวปี 2005 แต่ตอนนั้นผมยังไม่เกิดเลย!” ก็รู้สึกแก่ขึ้นมาทันที
สิ่งที่ผมอยากถาม OP เกี่ยวกับเหตุการณ์นี้คือ คุณไปรู้เรื่องนี้ได้ยังไง? จาก Darknet Diaries หรือจากทางอื่น?
ส่วนที่เรียก rich text editor ว่าเป็น “จอกศักดิ์สิทธิ์” นี่ตลกดี Chess.com เป็นเว็บไซต์ใหญ่ก็จริง แต่ทุกครั้งที่เห็น editor แบบนั้นหรือฟีเจอร์ที่แฟนซีเกินจำเป็นในเว็บเก่า ๆ อย่างเว็บบอร์ด ผมก็มักคิดว่าเว็บนั้นอาจจะ มีช่องโหว่เต็มไปหมด ยังไงก็ตาม เป็นบทความที่ยอดเยี่ยมมาก
ส่วนที่ว่า “ระหว่างการรายงาน bug bounty และการตรวจสอบ พอผมพยายามทำซ้ำอีกครั้ง นักพัฒนาก็พยายามใส่การบล็อก แล้วข้อความผิดพลาดต่อไปนี้ก็โผล่ขึ้นมา…” ฟังดู ไม่ค่อยตรงกับเจตนารมณ์ของโปรแกรม bug bounty เท่าไร