HACK TEH BOX - Under Construction(JWT密钥混淆 + SQL注入)
HACK TEH BOX - Under Construction(JWT密钥混淆 + SQL注入)
1. JWT密钥混淆
JWT的组成一般分为三部分,{算法}.{payload}.{签名}
,例如加密函数中jwt.sign(data, privateKey, { algorithm:'RS256' })
中,data
为数据,privateKey
为加密密钥,{ algorithm:'RS256' }
为加密算法,JWT的一般形式和组成如下图所示。
JWT常用的两种算法是RSA
和HMAC
,分别是非对称算法(一对密钥)和对称算法(一个密钥)。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,写一个sqlmap
的tamper
脚本
大概思路就是cookie
值作为注入点,然后将payload
写进username
字段再进行加密作为cookie
值传递
tamper
脚本实现的过程只需要修改输入参数payload
,然后输出retVal
即可,如下图所示
执行代码时同样报错
改掉
测试代码输出成功,接下来进行脚本编写
写好
上sqlmap测试
拿到flagHTB{d0n7_3xp053_y0ur_publ1ck3y}
HACK TEH BOX - Under Construction(JWT密钥混淆 + SQL注入)的更多相关文章
- 浅析history hack、心血漏洞、CSS欺骗、SQL注入与CSRF攻击
漏洞产生的原因主要有系统机制和编码规范两方面,由于网络协议的开放性,目前以 Web 漏洞居多 关于系统机制漏洞的典型有JavaScript/CSS history hack,而编码规范方面的漏洞典型有 ...
- Hack The Box( Starting Point )
Hack The Box [Starting Point] 初始点 -- 了解渗透测试的基础知识. 这一章节对于一个渗透小白来说,可以快速的成长.以下将提供详细的解题思路,与实操步骤. TIER 0 ...
- [转]高级SQL注入:混淆和绕过
############# [0×00] – 简介[0×01] – 过滤规避(Mysql)[0x01a] – 绕过函数和关键词的过滤[0x01b] – 绕过正则表达式过滤[0×02] – 常见绕过技术 ...
- Hack The Box Web Pentest 2017
[20 Points] Lernaean [by [Arrexel] 问题描述: Your target is not very good with computers. Try and guess ...
- 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 ...
- Bashed -- hack the box
Introduction Target: 10.10.10.68 (OS: Linux) Kali linux: 10.10.16.44 Information Enumeration Firstly ...
- Hack The Box 获取邀请码
TL DR; 使用curl请求下面的地址 curl -X POST https://www.hackthebox.eu/api/invite/generate {"success" ...
- Hack The Box Web Pentest 2019
[20 Points] Emdee five for life [by L4mpje] 问题描述: Can you encrypt fast enough? 初始页面,不管怎么样点击Submit都会显 ...
- hack the box -- sizzle 渗透过程总结,之前对涉及到域内证书啥的还不怎么了解
把之前的笔记搬运过来 --- 1 开了443,用smbclient建立空连接查看共享 smbclient -N -L \\\\1.1.1.1 Department Shares Operatio ...
随机推荐
- Linux Cron 定时任务
作者:丁仪 来源:https://chengxuzhixin.com/blog/post/LinuxCron-ding-shi-ren-wu.html 定时任务是经常被用到的,比如系统备份.数据导出等 ...
- QT实现输入框与下拉框提示并可模糊匹配
功能:支持下拉框选择.手动输入更改和模糊匹配 组件:QLineEdit.QComboBox.QCompleter.QStringListModel 一.组件介绍 1.1 QLineEdit QLine ...
- ELK----elasticsearch7.10.1安装配置
环境: vmware centos7 1.下载适合自己的es版本 https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-1 ...
- HDOJ-1074(动态规划+状态压缩)
Doing Homework HDOJ-1074 1.本题主要用的是状态压缩的方法,将每种状态用二进制压缩表示 2.状态转移方程:dp[i|(1<<j)]=min(dp[i|(1<& ...
- mysql查询较长的执行进程及创建权限账号
A:对于死锁,进程的操作 1.查找当前活跃事务 SELECT * from information_schema.INNODB_TRX 根据trx_started等判断事务是否异常锁定 2.杀死线程 ...
- freebsd root 登录 KDE SDDM
sddm.conf 文件现在默认不会自动生成了.需要自己创建:ee /usr/local/etc/sddm.conf写入MinimumUid=0MaximumUid=00就是root用户.然后更改/u ...
- 【docker】删除docker中的运行日志
docker inspect --format='{{.LogPath}}' 容器名称 |sudo xargs -i rm {}
- 安装VMTools失败的三类解决方法(Windows、Linux、MacOs)
前言 写这篇笔记的原因,是前几天在虚拟机 Vmware 中重新安装了几个操作系统,突然发现 VMTools 这个工具成了一个特殊的问题,以前还没有发现,因为通常它就给你自动安装了.但是大多数时候也是需 ...
- 叫练手把手教你读JVM之GC信息
案例 众所周知,GC主要回收的是堆内存,堆内存中包含年轻代和老年代,年轻代分为Eden和Surivor,如下图所示.我们用案例分析下堆的GC信息[版本:HotSpot JDK1.8]. /** * @ ...
- Java8 Stream 中 List 转 Map 问题总结
在使用 Java 的新特性 Collectors.toMap() 将 List 转换为 Map 时存在一些不容易发现的问题,这里总结一下备查. 空指针风险 java.lang.NullPointerE ...