WebGoat攻略 for Mac(1)
WebGoat攻略 for Mac(2)
WebGoat攻略 for Mac(3)
一、题目攻略
A2.Broken Authentication(认证中断)
1.Authentication Bypasses(认证绕过)
- 认证绕过
认证绕过以多种方式发生,但通常利用配置或逻辑中的一些缺陷。篡改以达到正确的条件。如隐藏输入、移除参数、强制浏览等。
- 2FA密码重设
任务是成功获得更改密码的权限。

首先随便输入一些数,然后点击Submit进行抓包,如图所示。

上面例子是把密保问题的相关输入删掉(即删掉secQuestion0和secQuestion1),但是我试了一下不行,然后尝试修改参数名,改为secQuestion00与secQuestion11,如图所示。

然后重发送,显示成功绕过认证,任务完成。

2.JWT tokens(JWT代币)
- JWT令牌的结构
令牌是base64-url编码的,由header.claims.signature三部分组成。下面是示例。
JWT header(头部):
{ "alg":"HS256", "typ":"JWT"}
JWT payload(声明):
{ "exp": 1416471934, "user_name": "user",
"scope": [ "read", "write" ],
"authorities": [ "ROLE_ADMIN", "ROLE_USER" ],
"jti": "9bc92a44-0b1a-4c5e-be70-da52075b9a84",
"client_id": "my-client-with-secret"}
签名(HS256为例):
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret)
- 认证并获取JWT令牌
会话流程:
1、用户端登陆,用户名和密码发往服务器。
2、服务器验证后生成JSON头部和声明并加密,生成JWT,此时服务器并没有保存登录状态信息。
3、服务器将JWT返回客户端(响应)。
4、客户端将JWT写在HTTP请求头部的Authorization字段中。
5、服务器对JWT验证,若成功确定用户登录状态。
6、服务器返回响应。
Base64 URL编码中,“+“会变成”-”,“/“会变成”_”,"="会被去掉。
- JWT签约
任务是取得管理员权限并重置投票。

点击上方的垃圾箱(重置投票),显示只有管理员才有权限操作。抓包抓到重置时的POST:

很显然,图片中的access_token后面的参数就是加密后的JWT,使用软件解密后可得(JWT解密网站)。

所以我们需要吧admin从false改为true,并生成JWT。可是HS512需要密钥,这是我们直接把alg改为none,就可以使用简单的Base64生成JWT了。
使用Base64编码网站,首先编码:
{
"alg":"none"
}
结果为:
ewogICJhbGciOiAibm9uZSIKfQ==
然后编码:
{
"iat": 1619539327,
"admin": "true",
"user": "Tom"
}
结果为:
ewogICJpYXQiOiAxNjE5NTM5MzI3LAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJUb20iCn0=
将"=“删掉,并在后面加入”.",生成以下结果,将结果替换access_token的参数,如图所示。

然后重发送,任务完成。

- JWT裂纹
任务是尝试查找密钥并提交新密钥,用户名更改为WebGoat。

既然题目中给出了JWT,那我们直接使用hashcat进行爆破。hashcat安装方法如下,终端输入:
brew search hashcat
brew install hashcat
brew info hashcat
查看hashcat版本,正常显示版本则说明安装成功。
hashcat --version
然后下载常见单词top10000作为字典,在Github下载。
将题目中给出的JWT保存为txt文件,然后终端输入命令:
hashcat -m 16500 JWT.txt -a 3 -w 3 google-10000-english.txt
运行完之后可以加"–shwo"来看结果:
hashcat -m 16500 JWT.txt -a 3 -w 3 google-10000-english.txt --show

然后进入(JWT加密网站)进行加密,按照要求将JWT中的username后面的参数改为"WebGoat",然后生成JWT令牌。

输入令牌,任务完成。

由于JWT令牌会有时间限制,如果解密时间过长,可能显示令牌过期,这时候刷新,然后直接拿给出的令牌修改成WebGoat就可以了(密钥并不会改变,还是之前破解出来的)。
或者可以修改JWT令牌中的结束时间(可以用python得到现在的时间)。
- 刷新令牌
一般来说有两种类型的令牌:访问令牌和刷新令牌。刷新令牌可能会过期,但其寿命要长得多。
任务是从去年的违规行为中,找到让汤姆支付的漏洞。

点击Checkout,抓包。


结果显示缺少JWT令牌,也就是说现在处于未登录状态。
从题目链接中找到了之前的登录信息:

进入JWT解密网站对JWT进行解码,修改加密方式为none(因为我们没有获得密钥),然后再修改一下时间。
用python读取一下现在的时间:
import time
time.time()

然后使用Base64编码网站进行编码,按照之前的方法生成JWT就可以了。

点击重发送,任务完成。

- 最后的挑战
任务是删掉Ton的推特。

抓到Delete Tom的包之后,把里面的JWT解码后发现header里面存在kid值,而通过webgoat的源码,我们看到kid是可以进行注入的。它的Java代码中直接使用了:
"SELECT key FROM jwt_keys WHERE id = '" + kid + "'"
并没有任何过滤。
所以可以构造命令:
1' UNION SELECT 'dG9t' FROM jwt_keys WHERE id='webgoat_key
其中’dG9t’是’tom’的base64编码,因为服务器中没有id=‘1’的用户,所以前面不会不会发生返回(原先的返回值为Jerry账户的密钥的Base64),同时UNION连接的SELECT是指定了返回结果为dG9t。这时就可以在密钥中输入tom。然后把DATA中所有jerry改为tom,生成新的JWT。

把生成的新JWT放入token中。

重发送,任务完成。

3.Password reset(密码重设)
- 使用WebWolf的电子邮件功能
(差点都忘记了还有WebWolf这回事)
任务是:首先启动WebWolf,在下面的重置页面中发送电子邮件至username@webgoat.org,然后打开WebWolf并阅读电子邮件并使用您的用户名和电子邮件中提供的密码登录。

首先点击Forgot,然后输入自己的Webgoat邮箱,登录WebWolf,查看邮件中的新密码。


然后返回Account Access界面,用新密码登录,任务完成。

但是题目上面并没有变成绿色(估计是bug)。
- 安全问题(1)
任务是检索另一个用户(如tom,admin,larry)的密码。

直接用Brup Suite抓包,然后进行颜色字典爆破就可,直接找到admin的颜色为green。任务完成。

- 安全问题(2)
随便查看几个,任务完成。

- 创建密码重设链接
任务是重置tom密码并登录(Tom总是在带有链接的电子邮件后立即重设密码)。

点击Forget,进入到这个界面。

输入邮箱后,它会往WebWolf发送一个邮件。

点击link,会进入到重设密码的界面。

观察到重设密码界面的链接中可能存在身份凭证
https://127.0.0.1:8080/WebGoat/PasswordReset/reset/reset-password/18320e2f-8bc2-4e20-a1ec-1f32557a697f
所以我们把目标放在获取tom的身份凭证上。我们抓取发送tom邮件的包,发现发送邮件后,会生成重设密码界面的链接,并把信息返回Host,我们只需要把Host的端口改为9090,就可以在WebWolf的Incoming requests看到重设密码界面的链接了。


把链接后面的身份凭证置换自己重设密码界面的身份凭证,修改密码,然后返回登录,任务完成。

- 如何防止滥用密码重设功能(略)
4.Secure Passwords(安全密码)
- NIST密码标准
介绍了一些了安全密码(强密码)的规则(略)。
- 暴力破解你的密码需要多长时间
任务是设置一个强密码。

emmm,任务完成。

- 你的密码安全吗(略)
- 存储密码(略)
本文详细介绍了在Mac环境下,针对WebGoat的认证中断(Broken Authentication)部分的实战攻略,包括认证绕过、JWT令牌的结构与利用、密码重设等场景。通过抓包、修改参数、JWT解密与编码等方式,演示了如何成功完成各个安全挑战。
&spm=1001.2101.3001.5002&articleId=115793927&d=1&t=3&u=4291d38964134efa9c84f78ce205b3d0)
3035

被折叠的 条评论
为什么被折叠?



