题目来源:https://ctflearn.com/index.php?action=find_problem_details&problem_id=541
原题:
admin gate first
Flag is safe in the admin account info
http://ec2-54-187-57-106.us-west-2.compute.amazonaws.com/admingatefirst/
honestly i don't know the flag and i want to know how to get it .. if you figured out comment the way below (i will leave the flag blank) help :*
点开题目给出的网站,我们可以看到一个登入界面。页面上给出了一个test用户的用户名和密码。根据题目的提示,我们的目标是以admin身份登入这个页面,网页应该就会返回flag。
首先我们尝试用SQL注入绕过验证,但是并不能绕过验证而登入admin用户。输入页面给出的test用户名和密码进入页面,页面结果如下:
可以看到页面返回了一列JSon信息,其中包括了test用户的角色。用Burp Suite进行抓包,刷新页面:
我们可以看到刷新页面后网页用token来识别用户的身份。可以看到"Authorization: Bearer",说明这个token是JWT(JSON WEB Token)。利用JWT解码器来解码这个token(https://jwt.io/):
可以看到前两部分是编码的格式和token中的数据。但是最后的签名验证却失败了。这是因为JWT的HS256格式会接收一个密钥来签名。如果我们不知道密钥我们就不能构造出自己的token。
接下来我们就要对JWT进行攻击,参考了这篇文章:https://www.sjoerdlangkemper.nl/2016/09/28/attacking-jwt-authentication/
首先我尝试了将JWT第一个字段中的加密模式改为none,最后的签名字段留为空白。将这个token传递给了页面。但是页面返回了500,说明我们的token不能被验证。
接着我尝试用Brute force来破解HS256的密钥。利用了这个工具:https://github.com/Sjord/jwtcrack
以rockyou为字典进行破解:
程序很快返回了结果,密钥是123456。
知道了密钥后我们就可以构造出自己的token。将这个密钥输入到JWT解码器中,并修改data中的用户信息:
再将这个token传递给网页:
可以看到网页返回了flag值:
{"username":"admin","role":"admin","flag":"J!W!T#S3cr3T@2018"}
网友评论