Cryptology Academy · บทเรียน

ช่องโหว่ JWT: alg=none และความสับสนของคีย์

ใช้ประโยชน์และแก้ไขข้อผิดพลาดด้านความปลอดภัยของ JWT ที่พบบ่อยที่สุด

บทเรียน 3 จาก 413 ขั้นตอน

ช่องโหว่ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. โครงสร้าง JWT: ส่วนหัว ข้อมูลบรรจุ และลายมือชื่อ
  2. HS256 กับ RS256: JWT แบบสมมาตรกับแบบอสมมาตร
  3. ช่องโหว่ JWT: alg=none และความสับสนของคีย์
  4. แนวทางปฏิบัติที่ดีที่สุดในการใช้งาน JWT อย่างปลอดภัย
← กลับไปที่ Cryptology Academy