菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
424
0

HACK TEH BOX - Under Construction(JWT密钥混淆 + SQL注入)

原创
05/13 14:22
阅读数 848008

HACK TEH BOX - Under Construction(JWT密钥混淆 + SQL注入)

1. JWT密钥混淆

  JWT的组成一般分为三部分,{算法}.{payload}.{签名},例如加密函数中jwt.sign(data, privateKey, { algorithm:'RS256' })中,data为数据,privateKey为加密密钥,{ algorithm:'RS256' }为加密算法,JWT的一般形式和组成如下图所示。

  JWT常用的两种算法是RSAHMAC,分别是非对称算法(一对密钥)和对称算法(一个密钥)。RS256算法在服务端利用私钥进行加密,利用公钥来进行解密验证数据。HS256算法只拥有一个密钥,用于加密和解密。考虑一种情况,如果在解密的过程中,解密的算法被伪造,由RS256更改为HS256,那么被用于HS256解密的密钥就变为RS256中的公钥,而由于公钥的性质,可能会被攻击者获取,攻击者在获取到RS256的公钥后,使用公钥作为密钥,利用HS256算法进行加密,当JWT值发送给服务端时,会被以HS256的方式进行解密,而解密的密钥也是RS256公钥,这样攻击者就可以伪造JWT中的payload值。
  下图为题目中存在漏洞的代码,作为示例来介绍该漏洞
  
  示例代码中,加密过程使用的是RS256算法,利用私钥进行加密,但是在解密的函数中,同时提供了两种算法选项,这就表示如果使用HS256算法进行解密,依然是使用公钥作为密钥,存在该漏洞。

2. 环境

  Hack The Box生成 Challenge环境(206.189.121.131:30520)  
  参考代码一份,包含内容如下
  

3. Challenge

  首先去环境看一下  
  一个简单的登录页面,注册一个admin/123456的账户,再使用该账户登录,登陆后页面跳转
  注册请求:  
  登录请求,返回JWT:  
  登陆成功,页面跳转:  
  登录页面进行简单的sql注入测试后,未发现注入点,F12浏览一下网站内信息,没有js文件被加载,登录后被分配一个JWT值  
  拿去Burpsuite里解密一下看看内容  
  RS256算法,非对称加密,但是在payload部分发现了公钥信息
  写个简单脚本使用公钥来解密一下信息  
  运行成功,即JWT里面的公钥正确  
  目前就能获取到这么多信息了,结合JWT内的公钥信息,可以大概猜出是利用JWT作为突破点进行攻击
  接下来去看一下Challenge提供的网站源码,看有没有什么有用的信息
  先去看看/routes/index.js路由文件
  
  整个路由包含了以下几个部分
    1.GET请求/
    2.GET请求/auth
    3.GET请求/logout
    4.POST请求/auth
  这四个部分的功能都非常的简单,POST请求根据register字段的值判断登录/注册,/logout清除session值,/auth返回auth.html页面,在GET请求/时,需要先通过JWT内的值判断用户是否存在,再进行页面跳转或错误信息,判断过程首先要执行AuthMiddleware函数,返回成功后再执行DBHlper.getUser(username)函数,如果username在数据数据库中存在的话,就会跳转至index.html页面,也就是登录后看到的页面了。
  顺着这个顺序,首先先去看看AuthMiddleware.js文件  
  大概功能就是返回JWT解码后的username值,然后这个值就会被拿去DBHlper.getUser(username)函数比对
  接着去JWTHelper.js文件  
  就是一个简单的JWT加解密,但是在解密的过程中,同时支持了两种算法RSA256/HS256,这个地方就暴露出了漏洞——JWT密钥混淆
  在进行完AuthMiddleware函数的流程后,进行下一步DBHlper.getUser(username)  
  在这个代码中,第一个sql语句使用了拼接字符串的形式,后面的sql语句则是传递参数的形式,存在sql注入的漏洞
  到这里就可以确定整个题目的思路了,首先GET请求/时,携带利用公钥伪造的JWT,而JWT中的username字段值为sql注入语句,执行后就可以进入数据库查找flag了。

发表评论

0/200
424 点赞
0 评论
收藏