token验证是一种web常用的身份验证手段。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:空间域名、网页空间、营销软件、网站建设、达州网站维护、网站推广。
在这里不讨论它的具体实现,需要在golang里实现token验证,Web框架是Gin当然这与框架没有关系步骤如下从request获取tokenstring,将tokenstring转化为未解密的token对象。
说明:
将未解密的token对象解密得到解密后的token对象,从解密后的token对象里取参数,获取解密后的token,该函数根据request,获得tokenstring,并转为未解密token对象,解密后得到解密token对象。
import github.com/dgrijalva/jwt-go/requestrequest.ParseFromRequestreq *http.Request, extractor Extractor, keyFunc jwt.Keyfuncreq即为http请求。
extractor 是一个实现了Extractor接口的对象,该接口需要实现的函ExtractToken*http.Request string, error,用于从http请求中提取tokenstring,keyFunc是一个函数,需要接受一个未解密的token。
并返回Secretkey的字节和错误信息func GetTokenr *http.Request,token *jwt.Token, err error 由request获取token,t := T t是已经实现extract接口的对象,对request进行处理得到tokenString并生成为解密的token。
.
.
(三种不同的信息)
第一部分:红色 令牌Header--头部包含所使用的签名算法和令牌的类型
{ "alg": "HS256", "typ": "JWT"} 经过Base64Url 编码以后,结果大致如:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
第二部分:绿色 载荷payload--数据实体
{
data: { username: 'abc', password: '111111' },
exp: 1591933872,
iat: 1591930272
}
注:atob:ASCII-to-Binary 解密-返回一个正常字符串;
btoa:Binary-to-ASCII 加密-返回一个 Base64 表示的字符串
第三部分:蓝色 签名Signature--是对前两部分的防篡改签名。将Header和Payload用Base64URL编码后,再用点(.)连接起来。然后使用签名算法和密钥对这个字符串进行签名。
signature = hmac_sha256(base64encode(header) + '.' + base64encode(payload), 'MY_SUPER_SECRET_KEY')
注:这个密钥(MY_SUPER_SECRET_KEY)只有服务器才知道,不能泄露给用户。
0x01
现在的网站安全性越来越高,防爆破机制也越来越多,token 验证便是其中比较常见的一种。客户端每次请求服务器时,服务器会返回一个 token,下次请求时,客户端需要带上这个 token,否则服务器认为请求不合法。且这个 token 不可重复使用,每次请求都将生成新的 token,并导致旧的 token 失效。
0x02
token 机制使得我们的爆破变得困难了许多,但正所谓道高一尺魔高一丈,神器 BurpSuite 已经为我们提供了这一问题的解决方案,接下来就由老夫将这武林秘籍授予你们!(哈哈哈一不小心就中二了)
0x03
PIkachu 靶场第 4 关,token防爆破
首先浏览器设置代理,然后点击登录,burp 拦截到请求,可以看到请求携带了 token。
右键,Send to Repeater,然后点击 go,发送请求,提示 username or password is not exists~,并且可以看到返回了新的 token。
再次点击 go,又返回了新的 token,且提示 csrf token error,说明旧的 token 已经失效。
由此我们可以知道,每次请求服务端都会返回新的 token,并且会放在页面上,我们只需要将这个值拿出去,并且放到请求里带上即可。
0x04
在 Repeater 界面单机右键,Send to Intruder,来到 Intruder 界面。
点击 Position,点击 Clear,清除默认荷载,然后依次分别选择密码部分和 token 部分的值并点击 Add,(账号部分我就不选中了,因为我知道账号就是 admin),Attack Type 选择 Pitchfork,完成后如下图。
接着点击 Payloads,首先设置密码的字典,选择从文件加载。
然后设置 token,首先把 Payload Set 切换到 2,因为我们刚刚 Add 的时候 token 是在第二个位置,密码是在第一个,这个其实就是设置第几个位置的荷载的值。
点击 Options,找到 Grep-Extract,点击 Add。
弹出一个框,点击 fetch response(或者 refetch response)。
然后我们搜索 token,点击 + 旁边的 切换上一个和下一个,找到如下位置,然后双击选中 token 的值,如下图所示。
然后点击 ok,可以在 Grep - Extract 看到一条记录,就是我们刚刚加的。
接下来设置 Redirections,设置为 Always。
继续设置线程数,设置为 1 个线程,因为多线程会导致 token 出现问题。
回到 Payloads,将 Payload set 2 的 Payload type 设置为 Recursive grep,如下设置。
一切准备就绪,点击 start attack 开始爆破。
可以看到每次带上的 token 都是不一样的,第 4 条记录的 Length 和其他的不一样,为正确的账号密码 admin 123456。
至此成功绕过 token 验证。