การครอบครองบัญชี Epic มูลค่า $57,500
สวัสดีชาว! ฉันกลับมาหลังจากหายไปนานพร้อมกับบั๊กการครอบครองบัญชีที่น่าสนใจ (ก่อนหน้า) และวิธีที่ฉันผูกมัดสิ่งนี้กับ XSS คุณอาจสับสนเนื่องจากเป็นการเขียนที่ยาว แต่ไม่ต้องกังวล เขียนจนจบ ฉันได้ทำให้สิ่งต่าง ๆ ง่ายขึ้นในตอนท้ายเพื่อความเข้าใจที่ดีขึ้น
ในบล็อกนี้ ฉันจะแบ่งปันเรื่องราวก่อนการครอบครองบัญชีที่น่าสนใจของฉันซึ่งเกิดขึ้นเนื่องจากการควบคุมการเข้าถึงที่ใช้งานไม่ได้ และวิธีที่ฉันจัดการเพื่อทำให้สิ่งนี้เป็นปัญหาที่ถูกต้อง
ฉันกำลังตามล่าหาโปรแกรมรางวัลบั๊กส่วนตัวเก่าๆ ฉันรู้อยู่ในใจว่าฉันต้องค้นหาปัญหาที่ไม่ซ้ำใครเพื่อหลีกเลี่ยงปัญหาที่ซ้ำกัน ตามปกติ ทำให้ฉันเรอและเริ่มค้นหาเป้าหมายแบบสุ่ม
ฉันเจอส่วนโปรไฟล์ของไซต์ มีตัวเลือกให้แก้ไขเฉพาะชื่อและรหัสผ่าน ไม่ใช่อีเมล
ไม่มีตัวเลือกในการเปลี่ยนอีเมล
ฉันตัดสินใจเปลี่ยนที่อยู่อีเมล เพื่อสิ่งนั้น ฉันเริ่มตรวจสอบการตั้งค่าอื่นๆ เปลี่ยนชื่อ และบันทึกคำขอใน Burp
ฉันสังเกตเห็นและเริ่มเล่นกับUserAttributes ก่อนอื่น ฉันเปลี่ยนชื่อเป็นupdate_emailและเปลี่ยนค่าเป็นเมลของบัญชีที่มีอยู่
ฉันพบข้อผิดพลาด —
{
“__type”:”InvalidParameterException”,
”message”:”user.update_email: Attribute is not available in the schema.n”
}
ฉันเปลี่ยนชื่อเป็นchange_emailและส่งคำขออีกครั้ง แต่พบข้อผิดพลาดเดียวกัน —
{
“__type”:”InvalidParameterException”,
”message”:”user.change_email: Attribute does not available in the schema.n”
}
จากนั้นฉันกลับไปที่ คำขอ ขั้นตอนการลงชื่อสมัครใช้และสังเกตว่าแอปพลิเคชันกำลังส่งที่อยู่อีเมลใหม่ในแอตทริบิวต์ชื่อผู้ใช้ขณะลงชื่อสมัครใช้ ฉันเปลี่ยนชื่อเป็นUsernameแต่ได้รับข้อผิดพลาดเดิมอีกครั้ง –
{
“__type”:”InvalidParameterException”,
”message”:”user.Username: Attribute does not available in the schema.n”
}
ฉันกำลังจะยอมแพ้ แต่ในความพยายามครั้งสุดท้าย ฉันส่งคำขออีกครั้งโดยมีเพียงอีเมลและฉันได้รับข้อผิดพลาดใหม่!
ฉันเปลี่ยนโฟกัสไปที่ ก่อนหน้า — การครอบครองบัญชี เนื่องจากข้อผิดพลาดนี้ยืนยันว่าฉันไม่สามารถครอบครองบัญชีของผู้ใช้รายอื่นได้ ฉันเปลี่ยนที่อยู่อีเมลเป็นอีเมลที่ไม่ได้ลงทะเบียนและใช้งานได้
ฉันได้รับ OTP ยืนยันในอีเมลใหม่ อย่างไรก็ตาม ฉันสามารถเปลี่ยนที่อยู่อีเมลเป็นที่อยู่อีเมลใหม่ได้สำเร็จโดยไม่ต้องผ่านขั้นตอนการยืนยันและได้รับบัญชีโดยไม่ต้องมีการยืนยันใดๆ
ว้าว! ฉันตื่นเต้นมาก ฉันทำรายงานและส่งมัน
ภายในไม่กี่ชั่วโมง พวกเขาเปลี่ยนเป็น Not Applicable และส่งข้อความตอบกลับมาให้ฉัน:
ฉันกับตัวเอง
หลังจากได้รับการตอบกลับนี้ ฉันกลับไปที่แอปพลิเคชันและพยายามเข้าสู่ระบบด้วยอีเมลของเหยื่อ ( [email protected] ) และรหัสผ่านของผู้โจมตี และได้รับข้อผิดพลาด — “ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง”
จากนั้นฉันลองรีเซ็ตรหัสผ่านเพื่อดูว่ามันส่ง OTP มาให้หรือไม่
แต่ได้รับข้อผิดพลาดใหม่ — “ไม่สามารถรีเซ็ตรหัสผ่านได้ เนื่องจากอีเมลไม่ได้ลงทะเบียนหรือยืนยัน”
ฉันจดบันทึกข้อผิดพลาดทั้งหมดที่ฉันได้รับและเข้านอน วันรุ่งขึ้นฉันเริ่มใหม่ตั้งแต่ต้น แต่ไม่พบอะไรใหม่ เปิดบันทึกของฉันอีกครั้งและอ่าน 2-3 ครั้ง หลังจากอ่านข้อผิดพลาดนี้ — “ไม่สามารถรีเซ็ตรหัสผ่านได้ เนื่องจากอีเมลไม่ได้ลงทะเบียนหรือยืนยัน”
ฉันตัดสินใจลองลงทะเบียนด้วยอีเมลของเหยื่อ เมื่อฉันลงทะเบียน แอปพลิเคชันแสดงข้อผิดพลาดใหม่ — “ บัญชีของคุณไม่สามารถใช้งานได้ชั่วคราว โปรดลองเข้าสู่ระบบในอีก 15 นาที”
หลังจากผ่านไป 15 นาที ฉันพยายามเข้าสู่ระบบด้วยอีเมลและรหัสผ่านของเหยื่อที่ใช้ในการลงทะเบียน แต่ฉันยังคงได้รับข้อผิดพลาดนี้ — “ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง” จากนั้น ฉัน
พยายามเข้าสู่ระบบด้วยอีเมลของเหยื่อ ( [email protected] ) และรหัสผ่านของผู้โจมตี ( [email protected] ) และที่น่าแปลกใจคือฉันสามารถเข้าถึงบัญชีได้!
ตอนนี้ปัญหาหลักคือ—
“เจ้าของอีเมลสามารถตั้งรหัสผ่านได้ตลอดเวลา”
ดังนั้นฉันจึงกลับไปที่ฟีเจอร์รีเซ็ตรหัสผ่าน ฉันพยายามรีเซ็ตรหัสผ่านและได้รับข้อผิดพลาด — “ไม่สามารถรีเซ็ตรหัสผ่านได้ เนื่องจากอีเมลไม่ได้ลงทะเบียนหรือยืนยัน”
จากนั้นฉันพยายามรับ รหัส ยืนยันใหม่ในอีเมลของเหยื่อ และได้รับข้อผิดพลาด — “ ชื่อผู้ใช้ไม่ถูกต้อง ”
ฉันชอบ:
แก้ไขปัญหา! ผู้ใช้ไม่สามารถรีเซ็ตรหัสผ่านผ่านลิงก์รีเซ็ตรหัสผ่านได้
สิ่งนี้อาจยังไม่ชัดเจนจนถึงตอนนี้ แต่ฉันจะสรุปโดยย่อ:
- อีเมลสองฉบับ:
ผู้โจมตี — [email protected]
เหยื่อ (บัญชีที่ไม่ได้ลงทะเบียน) — [email protected] - แอปพลิเคชันไม่มีฟังก์ชันในการเปลี่ยนอีเมล
- จากบัญชีผู้โจมตี ให้เปลี่ยนที่อยู่อีเมลเป็นของเหยื่อโดยระบุค่าUserAttributes
“UserAttributes”:[
{“ชื่อ”:”email”,
”Value”:” [email protected] ”
} - เมื่อผู้โจมตีเปลี่ยนเมล เหยื่อจะได้รับรหัส OTP เพื่อใช้ในการตรวจสอบ
- แต่ไม่จำเป็นต้องยืนยันอีเมล ผู้โจมตีได้เชื่อมโยงอีเมลของเหยื่อกับบัญชีของพวกเขาแล้ว
- ผู้โจมตีออกจากระบบและพยายามเข้าสู่ระบบด้วยอีเมลของเหยื่อและรหัสผ่านของผู้โจมตี แอปพลิเคชันจะไม่อนุญาต เนื่องจาก ยังไม่ได้ลงทะเบียนอีเมลของเหยื่อ
- ผู้โจมตีไปที่การลงทะเบียนและ ลงทะเบียนด้วย อีเมลของเหยื่อ แอปพลิเคชันแสดงข้อผิดพลาด — “บัญชีของคุณไม่สามารถใช้งานได้ชั่วคราว โปรดลองเข้าสู่ระบบในอีก 15 นาที”
- หลังจากผ่านไป 15 นาที ผู้โจมตีจะกลับไปที่แผงการ เข้าสู่ระบบและเข้าสู่ระบบได้สำเร็จด้วยอีเมลของเหยื่อและรหัสผ่านของผู้โจมตี
- เมื่อเหยื่อพยายามรีเซ็ตรหัสผ่านหรือพยายามตรวจสอบแอปพลิเคชันบัญชีจะแสดงข้อผิดพลาด — “ชื่อผู้ใช้ไม่ถูกต้อง” หมายความว่าเหยื่อหมดหนทางที่จะกู้คืนบัญชีของตน
- เนื่องจากการกำหนดค่าผิดพลาด อย่างมาก (Broken Access Control) ผู้โจมตีจึงเชื่อมโยงบัญชีกับอีเมลของเหยื่อ ผู้โจมตีเพียงลงทะเบียนอีเมลและไม่ได้ยืนยันบัญชี นั่นเป็นสาเหตุที่เซิร์ฟเวอร์ส่วนหลังไม่มีบันทึกอีเมลของเหยื่อ (อันนี้เดาเอาเองนะครับ ไม่แน่ใจ)
- เหยื่อไม่สามารถตั้งรหัสผ่านใหม่ได้ด้วย “ฟังก์ชันรีเซ็ตรหัสผ่าน”
- หากเหยื่อพยายามติดต่อทีมสนับสนุนเพื่อรีเซ็ตรหัสผ่าน ส่วนใหญ่แล้ว โอกาสที่ทีมสนับสนุนจะไม่สามารถค้นหาอีเมลของเหยื่อในแบ็กเอนด์ได้เนื่องจากเป็นอีเมลที่ไม่ได้รับการยืนยัน — (ผมคาดเดาจากข้อผิดพลาด I ได้ระหว่างการรีเซ็ตรหัสผ่านและส่งการยืนยันอีกครั้ง)
ฉันพบการแทรก HTML ในช่องชื่อเมื่อฉันเริ่มค้นหาแอปพลิเคชัน ฉันเพิกเฉยเพราะไม่มีผลกระทบ
จากนั้นฉันก็ได้ไอเดียว่าฉันสามารถแปลงสิ่งนี้เป็น XSS ที่เก็บไว้และใส่เพย์โหลด XSS ลงในบัญชีของเหยื่อได้อย่างไร จากนั้นเมื่อใดก็ตามที่เหยื่อสามารถกู้คืนบัญชีของพวกเขาได้ XSS จะถูกเรียกใช้
ฉันใส่เพย์โหลด XSS พื้นฐานในช่องนามสกุล แต่แอปพลิเคชันแสดงช่องว่างสีขาวและไม่มีการแจ้งเตือน
หลังจากลองใช้มาหลายชั่วโมง ฉันพบว่าแอปพลิเคชันมีการป้องกัน XSS ขั้นพื้นฐานเท่านั้น และกรองเฉพาะ <script>, <img>, การแจ้งเตือน ฯลฯ
จากนั้นฉันสร้างเพย์โหลด แทนที่การแจ้งเตือนด้วยข้อความแจ้ง และมันก็ได้ผล!
<a onmouseover=”prompt(document.cookie)”>ที่นี่</a>
ทันทีที่เหยื่อเลื่อนดูนามสกุล XSS จะถูกกระตุ้น
ฉันปิดกั้นทุกวิถีทางที่เหยื่อจะเรียกคืนรหัสผ่าน และแม้ว่าพวกเขาจะทำได้ (ซึ่งแทบเป็นไปไม่ได้เลย) XSS กำลังรออยู่ในส่วนโปรไฟล์
ผลกระทบทางธุรกิจ:
- แอปพลิเคชันมีช่องโหว่ร้ายแรงที่ช่วยให้ผู้โจมตีสามารถข้ามกลไกการพิสูจน์ตัวตนและสร้างบัญชีโดยไม่ต้องมีการตรวจสอบ OTP
- ช่องโหว่นี้ยังทำให้ผู้โจมตีสามารถใช้ฟังก์ชันของแอปพลิเคชันในทางที่ผิด เช่น การเปลี่ยนที่อยู่อีเมลในส่วนโปรไฟล์ ซึ่งแอปพลิเคชันไม่อนุญาตโดยเจตนา
- ในฐานะผู้โจมตี ฉันสามารถตั้งชื่อเหยื่อเป็นเพย์โหลด XSS ที่เก็บไว้ เนื่องจากแอปพลิเคชันมีความเสี่ยงต่อ XSS ที่เก็บไว้ เมื่อเหยื่อรีเซ็ตรหัสผ่าน (ซึ่งแทบจะเป็นไปไม่ได้เลย) พวกเขาจะเข้าสู่ระบบบัญชีของตน ทันทีที่เหยื่อเข้าสู่ระบบ เพย์โหลด XSS จะถูกเรียกใช้ ซึ่งนำไปสู่การเปิดเผยคุกกี้
- การข้ามกลไกการพิสูจน์ตัวตนของแอปพลิเคชันนี้ทำให้ผู้โจมตีสามารถ (ก่อน) ครอบครองบัญชีของเหยื่อได้ ในฐานะผู้โจมตี ฉันสามารถใช้ที่อยู่อีเมลของเหยื่อรายใดก็ได้เพื่อลงทะเบียน/เชื่อมโยงบัญชีและดำเนินการต่างๆ ในนามของเหยื่อ