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了。

4. Walkthrough

  写脚本利用公钥作为密钥进行HS256加密  

  报错  

  查看源码,发现被禁止使用公钥来加密  

  直接去掉  

  在执行,返回值  

  拿着这个值去GET请求/验证  

  验证成功,返回index.html页面,此时可以构造username字段进行sql注入

  接下来结合JWT,写一个sqlmaptamper脚本  

  大概思路就是cookie值作为注入点,然后将payload写进username字段再进行加密作为cookie值传递

  tamper脚本实现的过程只需要修改输入参数payload,然后输出retVal即可,如下图所示

  

  执行代码时同样报错  

  改掉

  

  测试代码输出成功,接下来进行脚本编写  

  写好  

  上sqlmap测试        

拿到flagHTB{d0n7_3xp053_y0ur_publ1ck3y}

HACK TEH BOX - Under Construction(JWT密钥混淆 + SQL注入)的更多相关文章

  1. 浅析history hack、心血漏洞、CSS欺骗、SQL注入与CSRF攻击

    漏洞产生的原因主要有系统机制和编码规范两方面,由于网络协议的开放性,目前以 Web 漏洞居多 关于系统机制漏洞的典型有JavaScript/CSS history hack,而编码规范方面的漏洞典型有 ...

  2. Hack The Box( Starting Point )

    Hack The Box [Starting Point] 初始点 -- 了解渗透测试的基础知识. 这一章节对于一个渗透小白来说,可以快速的成长.以下将提供详细的解题思路,与实操步骤. TIER 0 ...

  3. [转]高级SQL注入:混淆和绕过

    ############# [0×00] – 简介[0×01] – 过滤规避(Mysql)[0x01a] – 绕过函数和关键词的过滤[0x01b] – 绕过正则表达式过滤[0×02] – 常见绕过技术 ...

  4. Hack The Box Web Pentest 2017

    [20 Points] Lernaean [by [Arrexel] 问题描述: Your target is not very good with computers. Try and guess ...

  5. Hack the box: Bastion

    介绍 目标:10.10.10.134 (Windows) Kali:10.10.16.65 In conclusion, Bastion is not a medium box. But it wou ...

  6. Bashed -- hack the box

    Introduction Target: 10.10.10.68 (OS: Linux) Kali linux: 10.10.16.44 Information Enumeration Firstly ...

  7. Hack The Box 获取邀请码

    TL DR; 使用curl请求下面的地址 curl -X POST https://www.hackthebox.eu/api/invite/generate {"success" ...

  8. Hack The Box Web Pentest 2019

    [20 Points] Emdee five for life [by L4mpje] 问题描述: Can you encrypt fast enough? 初始页面,不管怎么样点击Submit都会显 ...

  9. hack the box -- sizzle 渗透过程总结,之前对涉及到域内证书啥的还不怎么了解

     把之前的笔记搬运过来 ---   1 开了443,用smbclient建立空连接查看共享 smbclient -N -L \\\\1.1.1.1 Department Shares Operatio ...

随机推荐

  1. winform解析json API数据

    {  "retCode" : "SUCCESS",  "msg" : "",  "data" : { ...

  2. Jquery hover鼠标经过时弹出div动态提示语

    一.效果图 二.需求描述 1.鼠标经过table每一行时,弹出div动态提示语: 2.div弹出层的位置随鼠标位置的变化而变化: 3.鼠标离开table或获取的动态提示语为空时,div弹出层消失. 下 ...

  3. 看完我的笔记不懂也会懂----MongoDB

    MongoDb数据库学习 - 数据库的分类 - 数据库基本概念 - MongoDB常用指令 - MongoDB的CURD - sort({key:*[1,-1]}).limit(num).skip(n ...

  4. POJ-3080(KMP+多个字符串的最长公共子串)

    Blue Jeans HDOJ-3080 本题使用的是KMP算法加暴力解决 首先枚举第一个字符串的所有子串,复杂度为O(60*60),随后再将每个子串和所有剩下的m-1个字符串比较,看是否存在这个子串 ...

  5. 一文读懂Java动态代理

    作者 :潘潘 日期 :2020-11-22 事实上,对于很多Java编程人员来说,可能只需要达到从入门到上手的编程水准,就能很好的完成大部分研发工作.除非自己强主动获取,或者工作倒逼你学习,否则我们好 ...

  6. Docker安装开发环境

    目录 Docker Docker 安装 Mysql Docker 安装Redis Docker 安装Zookeeper Docker Docker 安装 Mysql Docker 查看可用Mysql镜 ...

  7. 1.1 Python3基础-前言

    >>返回主目录 Python 交互式代码 Python 脚本式代码 第一段Python代码: print('Hello World!') >>返回主目录

  8. mysql内一些可以延时注入的查询语句

        一.sleep() 配合其他函数进行使用将十分方便,如下所示: 拆分讲解: select substr(database(),1,1) ; 截取当前数据库的第一位,转换为ascii码值: se ...

  9. Codeforces Round #684 (Div. 2)

    A 讨论三种情况,不换/全换成0/全换成1 ,取一个花费最小值 #include <bits/stdc++.h> using namespace std; const int N = 10 ...

  10. python获取到本机的公网IP

    5行代码获取到本机的公网IP from urllib.request import urlopen import re text = str(urlopen("http://txt.go.s ...