文章目录
- 一、加密算法/编码
- 二、JWT:
-
-
- 2.1 概念:
- 2.2 确认网站使用JWT:
- 2.3 实际例子:
- 2.4 结构(三部分):
- 2.5 攻击思路:
-
- 2.6 其他:
-
一、加密算法/编码
常见的:
md5(大多数网站已经开始加盐)
SHA-1、2、256等(与md5同属于哈希算法)
AES(加密模式、填充、数据库、密码、偏移量),可选以上5种方法对内容进行加密,且输出可以选base64与hex(16进制)两种。
假设一串特殊的base64解码(密文中存在“ +/= ”)之后发现是一些乱码,这串密文大概率是AES进行加密的
其破解来说,除了“密码”与”偏移量“难搞,另外3种相关好碰撞(常见于CTF),正在陆续取代md5。
DES(与base64相似,但是在密文之中会出现“ / ”字符)
二、JWT:
2.1 概念:
一个用于替代session机制的产物,用于对用户的身份做检验。
全称JSON Web Token(JSON Web令牌)。
JWT不加密传输的数据,但是可以通过数字签名来防止数据被篡改,客户端与服务器的具体交互如下:
~用户输入正确的账户密码上传服务器,
~通过认证之后,服务器将一串证明身份的字符返回用户端,即JWT
~之后用户所有需要认证身份的数据包都携带着JWT去请求,作用十分类似cookie
需要注意的一点是,
一般JWT字符串都是保存在header之中而非cookie之中(当然可以存在cookie中)。
这就使得其可以天然防御csrf攻击,但是无法抵挡XSS攻击。
2.2 确认网站使用JWT:
~关键字 “ Authorization ”
~数据包格式(XXX.XXX.XXX)
2.3 实际例子:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
2.4 结构(三部分):
头部(base64编码)、数据(base64编码)、签名((头部+数据+一个秘钥)加密得到)
//由上述看出,一个强秘钥(类似强口令)对JWT的安全来说十分重要。
举个例子:
头部内容:
{
"alg": "HS256", 、、加密算法,常见的如HS256
"typ": "JWT" 、、可有可无的字段
}
数据:
{
"user_id": "666", 、、当前用户的编号
"admin": "false", 、、当前用户不是管理员
"iat": 1516239022 、、时间戳
}
2.5 攻击思路:
~第一种:
正常的JWT: AAA.BBB.CCC
我们可以先base64还原 AAA.BBB 之后,修改完毕在base64编码成为 XXX.YYY .
、、这里注意,假设编译的xxx.yyy中含有“=”直接去掉即可。
最终上传“ XXX.YYY. ”到服务器,直接干掉签名部分,这样假设服务器对签名不进行校验,
即可达成越权的目的。
注意的是,假设可以使用这种方式绕过身份验证,可以尝试在AAA.BBB中sql注入、XSS等等
XXX是base64编码后的:
{
"alg": "none",
}
YYY是base64编码后的:
{
"user_id": "666",
"admin": "true",
"iat": 1516239022
}
~第二种:
直接使用脚本爆破JWT的秘钥,直接谷歌/百度即可,或者在GitHub上搜索
~第三种:
在一些日志文件中得到JWT,直接使用可能提示失效,
可以试着修改其对应的时间戳,即失效时间。(配合前两种情况)
2.6 其他:
~遇到类似字符串的时候,可以复制粘贴到这个网站看看:
https://jwt.io/
~可以通过对JWT进行二次加密或者魔改来达到提高其安全性的目的