Web
打开网址,查看网页源码
进入/protected里查看,返回
Misssing header: Authorization
OAuth2.0协议是一种授权协议,表示一种约定的流程和规范。目前主流的互联网网站除了可以使用“用户名+密码”模式和“手机号+验证码”模式登录外,很多还提供了第三方帐号登录,比如常见的QQ登录、微博登录、百度帐号登录、GitHub登录等。而这些第三方登录方式就是采用了OAuth2.0协议实现。如下图直观显示。
OAuth2.0协议目前已经成为SSO单点登录和用户授权的标准。
具体协议规范和实现方法可参考:
https://tools.ietf.org/html/rfc6749
里面标明了诸如/oath2/authorize和/oath2/token等请求的发送方法。
经查看得知其Authorization Request的发送方式,response_type和client_id是必需的,且response必需为code,而client_id根据题意就是admin。另外redirect_uri一般也是需要的,这里填写最终要查询的/protected网址,即http://web.chal.csaw.io:9000/protected。
并且要求使用"application/x-www-form-urlencoded"格式,根据题意使用POST方法发送请求。准备Burp。
发起/oauth2/authorize请求并抓包发送至Repeater,给出相应的参数。
如此一来,就得到了code的内容:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbGllbnRfaWQiOiJhZG1pblxyXG5cclxuIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3dlYi5jaGFsLmNzYXcuaW86OTAwMC9wcm90ZWN0ZWQiLCJpYXQiOjE1MzcyODQyNDgsImV4cCI6MTUzNzI4NDg0OH0.5IzhVwgdktwjoDj4mu9U3Y50OjZzM3eCUXSGCfQAyjc
code的内容其实可以通过base64解密,解密后发现这其实是一个JWT(Json Web Token)字符串。
接下来就是Access Token Request请求的构造。
这里协议里说的很清楚,要求有grant_type/code/redirect_uri/client_id,除了将redirect_uri设置为最后要求证的http://web.chal.csaw.io:9000/protected。
同样在浏览器端发起/oauth2/token请求并burp抓包发送到Repeater,并将请求做相应修改。
在响应中得到token值:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoidXNlciIsInNlY3JldCI6InVmb3VuZG1lISIsImlhdCI6MTUzNzI4NDI2MywiZXhwIjoxNTM3Mjg0ODYzfQ.5BRLhTv810S1ZGGZdBY3jkPmUbCXnFNZoH_lLFavTMo
同样可以base64解密,但是可以看到最后有乱码。
这里有一个比较好用的JWT base64编解码网站:https://jwt.io/
将token的内容复制过去,右边即是解密内容。
得到token后,其实就可以去尝试访问/protected的内容了,查看文档可知,可以在Authorization里使用Bearer token的形式发起GET请求。
如果不改user为admin,将会提示如下:
如果不填写secret的话,将会提示如下:
正确修改方法如下图:
对应的token为:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoiYWRtaW4iLCJzZWNyZXQiOiJ1Zm91bmRtZSEiLCJpYXQiOjE1MzcyODQyNjMsImV4cCI6MTUzNzI4NDg2M30.hTXoA7lKV8MEndimn13JF2naTBudr77aftGyqzT1A70
Burp抓包处理,使用上面的token,即可得到flag:
flag{JsonWebTokensaretheeasieststorage-lessdataoptiononthemarket!theyrelyonsupersecureblockchainlevelencryptionfortheirmethods}
注意token的时效性。
挺不错的一道学习OAuth2.0协议使用的题目。