27 พ.ย. 2022 เวลา 16:32 • ไอที & แก็ดเจ็ต
JWT : JSON Web Token
JWT หรือชื่อเต็มๆ JSON Web Token ก็เป็นตามชื่อบอก คือเป็น Web Token ที่อยู่ในรูปแบบของ JSON
Web Token หมายถึงเป็น Token ที่ควบคุมสิทธิในการเข้าถึงเว็บ ตัวอย่างเช่น login สำเร็จแล้วได้ token ตัวนี้กลับมา แล้วเอาอันนั้นมาใช้งานเป็น cookie หรือ authorization header ในการเข้าถึงระบบต่อไป JWT ตัวนี้เห็นได้บ่อยในการใช้ควบคุมสิทธิ ทั้งตรวจสอบความถูกต้องของ Session และข้อมูล
JWT ประกอบด้วยข้อมูล 3 ส่วน
1. ส่วน Header บอก algorithm ที่ใช้ในการ Sign
2. ส่วน Payload Data ตัวข้อมูลที่ส่งผ่าน
3. ส่วน Verify Signature ตัว Sign เอาไว้ตรวจสอบความถูกต้องของข้อมูล
ข้อมูลทั้ง 3 เข้า Base64 แล้วเอามาต่อกัน คั่นกันด้วยจุด .
เช่น eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c วิธีอ่านง่ายๆก็ลองเอาไปเปิดดูที่ https://jwt.io/
ตัวอย่างจาก https://jwt.io/
JWT สามารถรักษาความถูกต้องของข้อมูลได้ โดยการที่มันมีการ Sign ในข้อมูลส่วนที่ 3 ซึ่งการ Sign นี้มันต้องใช้ Key ในการเข้ารหัส ถ้าผู้โจมตีไม่รู้ Key ตัวนี้ เขาก็ไม่สามารถ Sign ข้อมูลได้หรือ Sign ผิดๆไป เมื่อผู้รับได้รับ JWT มาและทำการ Verify ด้วย Key ที่ถูกต้องก็จะทราบได้ว่าข้อมูลนั้นถูกต้องไหม
เนื่องจาก JWT มันเข้าแค่ Base64 ซึ่งสามารถแกะอ่านได้ง่ายมาก ทำให้มันไม่ได้เก็บรักษาความลับ จึงไม่ควรใช้มันส่ง Payload ที่มีความลับในนั้น
โดยตัว Design ของ JWT แล้วมีความแข็งแรงพอตัว แต่ช่องโหว่หรือปัญหาที่พบได้จะเกิดจากการ implement ไม่เหมาะสมซะมากกว่า
1. ใช้ Key ง่ายๆ
เนื่องจากตัว JWT ความแข็งแรงของมันอยู่ที่การตรวจสอบ Signature ในข้อมูลส่วนที่ 3 ซึ่งมันก็ขึ้นอยู่กับว่าจะเอา Key อะไรมาใช้ในการ Sign และแน่นอนว่า ถ้าใช้ Key ง่ายๆ คนโจมตีเขาก็สามารถ Sign ข้อมูลปลอมๆโจมตีระบบได้
Key ง่ายๆ นี้มีทั้งแบบสั้นๆ คำที่นิยม หรือพวกตัวอย่างใน code ที่คนเอาไปใช้ไม่เข้าใจแล้วไม่ได้เปลี่ยนค่า ตัวอย่างที่มีการรวบรวมไว้ https://github.com/wallarm/jwt-secrets/blob/master/jwt.secrets.list
2. ไม่ได้ Verify Signature
บางระบบไม่ได้ทำการตรวจสอบ Signature เลยก็เคยพบอยู่ คือ Server ส่ง JWT กลับมา Client เอาไปแกะ Base64 payload ได้ออกมาประมวลผล ทำงานต่อเลย โดยไม่ได้ Verify เลยว่า Signature ไม่ถูกต้อง
3. ใช้ "alg": "None" ทำให้ไม่ Verify Signature
Lib บางตัว ถ้าพบว่า Header เป็น None หมายความว่าไม่มีการ Sign ถ้าเจอแบบนี้บางตัวมันก็ข้าม ไม่ตรวจสอบ Signature เลย ทั้งนี้มันจะมีบางตัวที่มัน Detect Wording None แต่ถ้าเปลี่ยนตัวเล็กตัวใหญ่ เช่น nOnE ดันรองรับก็มี อันนี้เป็นช่องโหว่ที่เคยเจอใน Lib เก่าๆ ตัวใหม่น่าจะแก้ไขตรงนี้แล้ว แต่จะลองเทสก็ไม่เสียหลาย
ยังมีอีก 2-3 ตัว เด๋วมาเพิ่มเติมวันหลัง แต่รวมๆ คือถ้าจะใช้ JWT ก็อย่าลืมดู Best prac·tice เขาหน่อย แล้วดูว่าระบบเราตั้งถูกใหม่

ดูเพิ่มเติมในซีรีส์

โฆษณา