Algorithm confusion (key confusion) hujumlari hujumchi serverni JWT imzosini dasturchilar mo'ljallaganidan boshqa algoritm bilan tekshirishga majbur qila olganda yuzaga keladi. Bu holat to'g'ri boshqarilmasa, hujumchi serverning maxfiy imzolash kalitini bilmasdan ixtiyoriy qiymatli yaroqli JWT soxtalashi mumkin.
HS256 (HMAC + SHA-256) kabi ba'zi algoritmlar "simmetrik" kalit ishlatadi — server tokenni imzolash va tekshirish uchun bitta kalit ishlatadi (u maxfiy bo'lishi kerak). RS256 (RSA + SHA-256) kabi boshqalari "asimmetrik" kalit juftini ishlatadi: private kalit (imzolash uchun, maxfiy) va matematik bog'liq public kalit (tekshirish uchun, ko'pincha ochiq bo'lishiladi).
Ko'p kutubxonalar imzoni tekshirish uchun bitta, algoritmga bog'liq bo'lmagan metod beradi va u header'dagi alg parametriga tayanadi:
function verify(token, secretOrPublicKey){
algorithm = token.getAlgHeader();
if(algorithm == "RS256"){ /* RSA public key sifatida ishlat */ }
else if (algorithm == "HS256"){ /* HMAC secret key sifatida ishlat */ }
}Muammo dasturchilar bu metod faqat RS256 kabi asimmetrik algoritm bilan ishlaydi deb taxmin qilib, unga doimo sobit public kalitni uzatganda yuzaga keladi. Agar server HS256 bilan imzolangan token olsa, kutubxona public kalitni HMAC secret sifatida qabul qiladi — ya'ni hujumchi tokenni HS256 va public kalit bilan imzolasa, server ham xuddi shu public kalit bilan imzoni tekshirib, qabul qiladi.
Umumiy qadamlar: (1) serverning public kalitini oling (ko'pincha /jwks.json yoki /.well-known/jwks.json da JWK formatida); (2) uni mos formatga (masalan X.509 PEM) o'giring; (3) payloadni o'zgartirib, alg header'ini HS256 ga o'rnating; (4) tokenni HS256 bilan, public kalitni secret sifatida ishlatib imzolang. Muhim: ishlatgan public kalit serverdagisiga bayt-ba-bayt aynan mos bo'lishi kerak.
Public kalit mavjud bo'lmasa ham, uni mavjud ikkita JWT juftidan chiqarib algorithm confusion'ni sinash mumkin. Buni rsa_sign2n GitHub repositorysidagi jwt_forgery.py kabi vositalar bilan bajarish oson:
docker run --rm -it portswigger/sig2n <token1> <token2>Bu berilgan JWT'lardan bir yoki bir nechta ehtimoliy n qiymatini hisoblaydi. Har biri uchun soxta JWT chiqaradi — Burp Repeater bilan qaysi biri server tomonidan qabul qilinishini aniqlab, mos kalitni ishlating.