环境搭建
jdk版本:openjdk version "17.0.5“
WebGoat版本:webgoat-server-8.1.0.jar
环境不同有很大可能不能搭建成功
运行命令:java -jar webgoat-server-8.1.0.jar --server.port=8888 --server.address=192.168.142.131
搭建完成后浏览器访问
完成注册后就可以开始使用
JWT
JWT详解
jwt即(json,web,token),因为配置不当很容易造成越权问题
JWT(JSON Web Token)由三部分组成:头部(Header)、载荷(Payload)、签名 (Signature)。
头部(Header):头部通常由两部分组成,算法类型和令牌类型。 算法类型:指定用于生成签名的算法,例如 HMAC、RSA 或者 ECDSA。 令牌类型:指定令牌的类型,常见的是 JWT。 头部使用 Base64Url 编码表示,并作为整个 JWT 的第一部分。头部的一个示例: { "alg": "HS256",none "typ": "JWT" }
载荷(Payload):载荷存储了有关用户或实体的声明和其他有关信息。 声明:如用户 ID、角色、权限等信息。 注册声明:包含一些标准的声明(比如发行人、过期时间等)和一些自定义的 声明。 载荷也使用 Base64Url 编码表示,并作为整个 JWT 的第二部分。载荷的一个示例: { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
签名(Signature):签名是对头部和载荷进行签名的结果,用于验证 JWT 的完整 性和真实性。 签名生成方式:将头部和载荷进行 Base64Url 编码后拼接在一起,然后使 用指定的加密算法(如 HMAC、RSA)进行签名,将生成的签名添加到 JWT 中
JWT signing
这题的解题条件是重置投票,可是提示我们不是admin
抓包,这里我用了Yakit,bp其实也可以
将数据包发送到fuzz模块
上面的功能试了一下不太行,这里提供一个免费JWT解析网站 jwt.io
如图,这里jwt的格式是这样的,要修改一下 ,修改 payload 数据,admin 修改为 true,将加密方式修改为 none,因为数据是通过base64加密的,这里提供在线加密网站 Base64加密、解密-BeJSON.com
要注意,不要复制=号
如图
将payload复制到抓取的数据包替换即可
发送请求,结果又失败了,看了一下是忘记删除第三处的加密算法了,将点后面的删掉即可,不要把点也删了,成功通关
Refreshing a token
这题要让tom给我们付钱,点击here看到日志信息
点击购买,抓取数据包,发到fuzz模块
先把日志的token字段复制出来,很明显是jwt格式数据,中间两个点,拿去解密
eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE1MjYxMzE0MTEsImV4cCI6MTUyNjIxNzgxMSwiYWRtaW4iOiJmYWxzZSIsInVzZXIiOiJUb20ifQ.DCoaq9zQkyDH25EcVWKcdbyVfUL4c9D4jRvsqOqvi9iAd4QuqmKcchfbU8FNzeBNF9tLeFXHZLU4yRkq-bjm7Q
注意到有一个exp(expire),即过期时间
鼠标悬在数字上,这个网站提示我们这个18年就过期了
直接修改时间,这个时间其实就是离某个时间过了多少秒
把payload复制到base64加密,剩下的步骤和前面没什么区别