CTF案例:CTFHub
打开环境一个正常的登录页面
先尝试注册
这里想试试能不能注册admin为用户的账号,发现不能注册,盲猜有猫腻,已存在管理员账号为admin
然后正常注册
注册后成功跳转登录页面,先尝试正常登录
点击下方的Get flag
这边显示权限不行
结合第一个注册的admin失败的情况,猜测管理员用户名admin尝试越权
这里在登录界面重新抓包
根据cookie值中的authorization进行判断发现属于jwt的格式(等会补充)
jwt数据格式特征 由标头,声明,和响应体组成,同时这三部分通过英文,进行分割,每部分数据base64编码
将数据包中的authorization对应标头和声明值的部分放在burpsuite 解码器模块中,使用base64解码
图一
图二
由图二不难发现username对应登录用户名,尝试修改为admin,并且把secretid的值置为[]
而图一中的alg则和jwt数据中第三部分令牌的算法加密有关系
这里将alg 的值置为none
将修改后的值重新使用base64编码
因为base64加密后的数据经过浏览器url编码后=会被转义所以将=改为.
这里有坑,用burpsuite解码时数据的声明部分会乱码,并且解析后的数据少一个}需要自己补上不然base64编码后会由差异,因此声明部分推荐JSON Web Tokens - jwt.io
解码,但是这玩意也有坑,数据标头部分一改就没,所以两个结合起来
最后得到eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzZWNyZXRpZCI6W10sInVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6ImN0ZiIsImlhdCI6MTY4NDI0MzIyNX0.
将这串数据改到数据包中
返回成功
点击Get Flag抓包然后放进重发器模块
得到最终结果
jwt
JWT(JSON Web Token)是一种基于JSON的开放标准,用于在客户端和服务器之间传递信息。它可以安全地传输信息,因为它使用了加密和签名技术来保护数据的完整性和保密性。
以下是一些JWT安全性方面的注意事项:
1. 验证令牌:在使用JWT之前,必须对令牌进行身份验证和授权。这可以通过使用数字证书或密钥对来实现。只有经过身份验证的令牌才能被接受并使用。
2. 防止重放攻击:JWT包含一个称为“expires”字段的时间戳,指示令牌何时过期。通过在生成JWT时将当前时间戳添加到JWT中,可以防止重放攻击。
3. 防止篡改:JWT包含一个签名,用于验证其完整性和真实性。签名可以使用哈希算法(如HMAC)来生成,并且只有知道密钥的人才能生成有效的签名。因此,JWT不能被篡改或伪造。
4. 保护敏感数据:JWT可以用于传递敏感数据,例如用户名、密码和其他机密信息。为了保护这些数据,可以使用HTTPS等安全协议来传输JWT,并将JWT存储在安全的位置(例如数据库)中。
总之,JWT是一种安全的身份验证和授权机制,可以用于保护Web应用程序中的敏感数据。但是,为了确保其安全性,必须正确地配置和使用JWT。
jwt格式数据 分为 标头,声明,签名三个部分组成,由英文的.分割
其中标头(headers)数据:
{
"alg":"HS256",
"typ":"JWT"
}
alg 表示签名的加密参数
这里如果将alg参数改为 "none"
签名则为空值,以此绕过签名验证
声明claim:
{
"secretid": [],
"username": "admin",
"password": "ctf",
"iat": 1684243225
}
该ctf就是通过修改声明部分的username值达到越权效果,这里存放一些数据进行声明提交给服务器端
签名Signature
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), ) secret base64 encoded
服务器有一个不会发送给客户端的密码(secret),用头部(header)中指定的算法对头部和声明的内容用此密码进行加密,生成的字符串就是 JWT 的签名。
资料:
【小迪安全】Day40JAVA安全-JWT安全&预编译CASE注入 - 哔哩哔哩 (bilibili.com)