ช่องโหว่ JWT: alg=none และความสับสนของคีย์
ใช้ประโยชน์และแก้ไขข้อผิดพลาดด้านความปลอดภัยของ JWT ที่พบบ่อยที่สุด
ช่องโหว่ JWT: alg=none และความสับสนของคีย์ เป็นบทเรียน Cryptology Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cryptology Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน
พื้นที่การโจมตีของ JWT
JWT ลงลายเซ็นด้วยวิทยาการเข้ารหัส แต่ไลบรารีจำนวนมากเคยมีช่องโหว่ร้ายแรง ช่องโหว่ที่ถูกใช้โจมตีมากที่สุด ได้แก่ การโจมตี alg=none การโจมตีแบบสับสนระหว่าง RS256→HS256 และการเดาคีย์ลับที่อ่อนแอ ทั้งหมดเกิดจากการเชื่อถือฟิลด์ในส่วนหัวที่ผู้โจมตีควบคุมได้
การโจมตี alg=none
ข้อกำหนด JWT อนุญาตให้ใช้ alg:"none" สำหรับโทเค็นที่ไม่มีการรักษาความปลอดภัย ไลบรารีที่มีข้อบกพร่องยอมรับค่านี้และข้ามการตรวจสอบลายเซ็นทั้งหมด ผู้โจมตีแก้ไขเพย์โหลด (เช่น "role":"admin") ตั้งค่า alg:"none" ลบลายเซ็นออก แล้วเซิร์ฟเวอร์ยอมรับโทเค็นดังกล่าว
ตัวอย่างการใช้ประโยชน์จากช่องโหว่ alg=none
ต้นฉบับ: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIn0.SIG การโจมตี: eyJhbGciOiJub25lIn0.eyJzdWIiOiJhZG1pbiJ9. (ลายเซ็นว่าง มีจุดปิดท้าย) เซิร์ฟเวอร์ที่มีช่องโหว่ตรวจสอบผ่านสำเร็จและมอบสิทธิ์เข้าถึงระดับผู้ดูแลระบบ
การแก้ไข alg=none
อย่ายอมรับ alg:"none" ในระบบจริง กำหนดรายการอัลกอริทึมที่อนุญาตไว้อย่างชัดเจน: jwt.decode(token, key, algorithms=["HS256"]) ไลบรารีสมัยใหม่ส่วนใหญ่ (PyJWT 2+, jsonwebtoken 9+) ปฏิเสธ alg=none เป็นค่าเริ่มต้น
ความสับสนของกุญแจ RS256 → HS256
หากเซิร์ฟเวอร์ใช้ RS256 แล้วไคลเอนต์เปลี่ยน alg เป็น HS256 เซิร์ฟเวอร์อาจใช้กุญแจสาธารณะ RSA ของตนเป็นคีย์ลับ HMAC เนื่องจากกุญแจสาธารณะนั้น... เป็นกุญแจสาธารณะ ผู้โจมตีจึงลงลายเซ็นเพย์โหลดใด ๆ ด้วยกุญแจดังกล่าว แล้วเซิร์ฟเวอร์ก็ตรวจสอบผ่าน
การใช้ประโยชน์จากความสับสนของกุญแจ
ขั้นตอน: 1) ดึงกุญแจสาธารณะจากปลายทาง JWKS 2) สร้างเพย์โหลดที่เป็นอันตราย 3) ลงลายเซ็นด้วย HMAC-SHA256 โดยใช้ไบต์ PEM ดิบของกุญแจสาธารณะเป็นคีย์ลับ HMAC 4) ตั้งค่า alg:"HS256" ในส่วนหัว 5) เส้นทาง HS256 ของเซิร์ฟเวอร์ตรวจสอบผ่านสำเร็จ
การแก้ไขความสับสนของกุญแจ
ระบุอัลกอริทึมที่คาดหวังไว้อย่างชัดเจนเสมอในการเรียกใช้การตรวจสอบ อย่าอนุมานอัลกอริทึมจากส่วนหัวโทเค็น ใช้เส้นทางโค้ดแยกกันสำหรับ RS256 และ HS256 ซึ่งผู้เรียกใช้ไม่สามารถสลับเปลี่ยนได้
การเดาแบบไล่ครบทุกแบบของคีย์ลับที่อ่อนแอ
HS256 ที่ใช้คีย์ลับอ่อนแอ (มีเอนโทรปีน้อยกว่า 256 บิต) สามารถถูกเดาแบบออฟไลน์ได้ เครื่องมืออย่าง hashcat รองรับการเจาะ JWT: hashcat -a 0 -m 16500 token.txt wordlist.txt ใช้คีย์ลับที่สุ่มด้วยวิทยาการเข้ารหัสและมีขนาดอย่างน้อย 32 ไบต์
การแทรกส่วนหัวผ่าน kid
ส่วนหัว kid (รหัสกุญแจ) ใช้เลือกกุญแจที่จะนำมาใช้ หากเซิร์ฟเวอร์ใช้ kid เป็นพารามิเตอร์คำสั่ง SQL หรือเส้นทางระบบไฟล์โดยไม่ทำความสะอาดข้อมูล: kid="../../dev/null" → HMAC ที่ใช้คีย์ว่าง → ยอมรับโทเค็นปลอมแปลง ให้ตรวจสอบและทำความสะอาด kid เสมอ
การแทรกส่วนหัว jwk
ส่วนหัว jwk ฝังกุญแจสาธารณะสำหรับการตรวจสอบ เซิร์ฟเวอร์ที่มีช่องโหว่อาจใช้กุญแจที่ฝังมาโดยตรง ทำให้ผู้โจมตีส่งคู่กุญแจของตนเอง ลงลายเซ็นโทเค็นด้วยกุญแจส่วนตัว แล้วฝังกุญแจสาธารณะไว้ ให้ตรวจสอบกับกุญแจที่ลงทะเบียนไว้เท่านั้น
การหลบเลี่ยงด้วยโทเค็นหมดอายุ
การนำไปใช้งานบางแบบลืมตรวจสอบข้ออ้างสิทธิ์ exp หรือใช้เวลาของเซิร์ฟเวอร์ไม่สอดคล้องกัน ให้ตรวจสอบ exp, nbf และ iat อย่างชัดเจนเสมอ ใช้ไลบรารีที่ตรวจสอบค่าเหล่านี้เป็นค่าเริ่มต้น และอย่าปิดการตรวจสอบข้ออ้างสิทธิ์ในระบบจริง
ตรวจสอบความเข้าใจ
ในการโจมตีแบบสับสนระหว่างกุญแจ RS256→HS256 ผู้โจมตีใช้สิ่งใดเป็นคีย์ลับ HMAC
สรุปทบทวน
ช่องโหว่ JWT เกิดจากการเชื่อถือส่วนหัว alg การยอมรับ alg=none และการใช้คีย์ลับที่อ่อนแอ วิธีแก้: กำหนดอัลกอริทึมตายตัวที่ผู้ตรวจสอบ ใช้คีย์ลับที่รัดกุม และทำความสะอาด kid ต่อไป: แนวทางการนำ JWT ไปใช้งานอย่างปลอดภัย
เรียนรู้ Cryptology Academy ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 67
- บทเรียน
- 261
คำถามที่พบบ่อย
บทเรียน “ช่องโหว่ JWT: alg=none และความสับสนของคีย์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ช่องโหว่ JWT: alg=none และความสับสนของคีย์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cryptology Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ช่องโหว่ JWT: alg=none และความสับสนของคีย์”
ใช้ประโยชน์และแก้ไขข้อผิดพลาดด้านความปลอดภัยของ JWT ที่พบบ่อยที่สุด คุณปฏิบัติ Cryptology Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cryptology Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cryptology Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ช่องโหว่ JWT: alg=none และความสับสนของคีย์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Cryptology Academy นี้ได้ไหม
ได้ บทเรียน Cryptology Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โครงสร้าง JWT: ส่วนหัว ข้อมูลบรรจุ และลายมือชื่อ
- HS256 กับ RS256: JWT แบบสมมาตรกับแบบอสมมาตร
- ช่องโหว่ JWT: alg=none และความสับสนของคีย์
- แนวทางปฏิบัติที่ดีที่สุดในการใช้งาน JWT อย่างปลอดภัย