虎符ctf web部分复现-第一题-easy_login
Posted hbbbb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虎符ctf web部分复现-第一题-easy_login相关的知识,希望对你有一定的参考价值。
一. 了解Node.js
简单的说 Node.js 就是运行在服务端的 javascript
(一) node.js的常见文件目录
(二) 了解jwt
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
它分为head payload和Signature。这串数据以(.)作为分隔符分为三个部分的
signature:
签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。
首先,需要指定一个密码(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。
然后,使用标头中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名。
WT安全问题一般有以下
1. 修改算法为none
2. 修改算法从RS256到HS256
3. 信息泄漏 密钥泄漏
4. 爆破密钥
二. 解题:
ctfhub已经上线hfctf的部分题目,想复现的可以去试试。
当时再比赛的时候发现了这个
然后后面我就一直试着绕过get flag函数,但是没找到方法。后面又看到一篇文章也是伪造jwt,但是再伪造密钥那部分没整出来??
现在看了下网上的wp之后才明白过来。下面就是正经的解题步骤了!o(* ̄▽ ̄*)o
我们在发现上面这个页面后,再尝试以下nodejs常见的主页面能不能访问
尝试读取常见的app.js
我们注意到了/controller这个目录,那我们试一下把这个加上,发现如下
仔细观察这个页面,发现好像该环境的验证源码?尝试代码审计
我们发现当没注册和注册的账号为admin时会报错,并且会生成一个私钥,把私钥存在global.sectets这个全局数组中。还会生成一个jwt。
这一段代码表示,账号和密码的验证,并且给jwt一个索引sid,通过判断sid来检验该账户能否登陆成功。那就以为着我们只需要伪造成admin的jwt就可以拿到最高权限,为所欲为了。
注意这里,它是把session中的usernam当作登陆成功的username
然后再最后一段代码中,判断 session 中的用户名是否为 admin,是的话就直接给 flag。
既然知道了jwt的常见安全问题,那么我们就使用最常见的将签名算法设置为none试试
再把私钥部分设为空数组就可以啦。这样只需要头部和payload部分进行base64加密就可以得到admin的token了。
os:payload部分的username要改为admin,不然验证通过不了的。(●ˇ∀ˇ●)然后注册,登陆抓包
然后分析报文,以及根据前面的代码审计。我们发现他是根据对authorization进行验证来判断你是否有权限获得flag的,
那么我只需要将这段jwt进行伪造,让服务器认为我们是admin就可以了
我们进行base64加解密
然后将HS256和admin233改成none,secretid改成一个空数组和admin就可以了
记得两串密文之间用.连接喔U•ェ•*U
然后将加密得到的密文复制到authorization即可。因为你修改算法为none,那么
Signature就不用加进去了。None是没有的意思,既然没有加密算法,
那么把部分就没用了。记得把username=哪里也要改成admin(o?v?)ノ
然后放包,再登陆,访问 api/flag就可以啦。因为这时服务器已经把你当作admin用户啦ヾ(≧▽≦*)o
总结:这题的主要考点就是jwt伪造
难点是怎么把密钥伪造出来。经过代码审计,我们发现当签名算法为none时,
将私钥id设置为空就可以绕过服务器对私钥的的验证。
当时没做出来时一位内代码审计没过关,需要继续增强!(〃>目<)
大家一起加油!冲冲冲!
以上是关于虎符ctf web部分复现-第一题-easy_login的主要内容,如果未能解决你的问题,请参考以下文章