05.WebGoat之身份验证缺陷

身份认证绕过

介绍

利用配置和逻辑缺陷,通过篡改数据达到认证绕过

攻击方式

  1. 通过html中隐藏的input标签值

  2. 通过移除/修改提交的参数来确认程序的响应

  3. 通过猜测和暴力破解强制访问站点的某些URL

JWT

介绍

JWT全称JSON Web
Token,是在RFC7519中定义的一种在客户端和服务器之间使用JSON对象,以自包含的方式安全的传输数据。数据是被签名的,可被验证和信任,签名方式可以选择HMAC也可以选择基于公私钥的RAS

JWT用于携带身份标识和客户端的特征,内容经过服务器签名为防止客户端篡改,签名方式可以选择HMAC也可以选择基于公私钥的RAS。token创建在身份被服务器端认证客户端成功以后的任何时期,后续客户端通过token向服务器提供期身份并由服务器验证其有效性和完整性,是便携的和无状态的

令牌结构

05.01.png

令牌格式为Header.claims.Signature

  1. Header中存放加密的算法和类型,数据为JSON经过BASE64URL算法的编码结果,JSON字符串格式为:

    05.02.png
  2. Claims中存放实际传递的数据(注意该部分非加密格式,可任意读取),数据为JSON经过BASE64URL算法的编码结果,JSON字符串格式为:

    05.03.png

    字段可以为JWT官方定义的标准字段,也可以自定义,标准字段有7个,分别为:

    • iss (issuer):签发人

    • exp (expiration time):过期时间

    • sub (subject):主题

    • aud (audience):受众

    • nbf (not Before):生效时间

    • iat (issued at):签发时间

    • jti (JWT ID):编号

  3. Signature中存放通过secret对header和claims计算签名并经过BASE64URL算法的编码结果,算法格式为:

    05.04.png

    Base64URL编码与Base64类似,主要是将Base64编码中的=省略,+替换为-,/替换为_

    签名算法:

    • HS256:HMAC using SHA-256

    • HS384:HMAC using SHA-384

    • HS512:HMAC using SHA-512

    • RS256:RSASSA-PKCS1-v1_5 using SHA-256

    • RS384:RSASSA-PKCS1-v1_5 using SHA-384

    • RS512:RSASSA-PKCS1-v1_5 using SHA-512

    • ES256:ECDSA using P-256 and SHA-256

    • ES384:ECDSA using P-384 and SHA-384

    • ES512:ECDSA using P-521 and SHA-512

    • PS256:RSASSA-PSS using SHA-256 and MGF1 with SHA-256

    • PS384:RSASSA-PSS using SHA-384 and MGF1 with SHA-384

    • PS512:RSASSA-PSS using SHA-512 and MGF1 with SHA-512

    • none:No digita signature or MAC performed

令牌获取流程

05.05.png
  1. 客户端向服务器提交身份认证(用户名和密码)

  2. 服务器对提交的用户名和密码进行认证后生成一个jwt信息,并通过HTTP response返回给客户端

  3. 客户端在后续请求中通过HTTP request 头传递jwt信息给服务器

  4. 服务器对jwt信息进行验证,并返回数据给客户端

Token分类

  1. access token(访问令牌): 用于调用API时使用,具有一定的生命周期

  2. refresh token(刷新令牌):
    当访问令牌不在有效,可以向服务器端提交的刷新令牌到获取一个新的有效访问令牌。刷新令牌具有比访问令牌更长的有效生命周期(解决用户需要再次使用身份凭证进行认证的问题)

    在用户认证成功后服务器端生成refresh token和access token,并对refresh token及access token进行存储(在通过刷新令牌生成新的access token时需要对用户提交的refresh token及access token与refresh token的关系进行验证),并将refresh token和access token响应给客户端。在access token有效时间范围内,认证信息在客户端自包含,服务器端不存储用户的session信息,依然是无状态的。当access token失效,客户端需要向服务器端提交refresh token和access token并由服务器进行验证,验证通过后生成新的refresh token和access token并响应给客户端

    刷新令牌也可以是无状态的,引起问题:用户无法对令牌进行吊销

攻击方式

  1. 将签名算法设置为none从而绕过签名验证

  2. 密钥暴力破解token信息

  3. 利用refresh token逻辑错误,对其他账号的access token进行刷新

密码重置

介绍

Web站点常提供忘记密码功能以应对用户在密码遗忘情况下可以找回或重置密码,常采用的思路为:

  1. 让用户提供设置的密码问题答案

  2. 为用户认证的邮箱或手机发送一个验证码或重置密码连接

在验证中过程中可能存在被利用的逻辑错误

攻击方式

利用此功能逻辑缺陷可被用于:

  1. 验证用户名/邮箱/手机号是否注册

  2. 暴力破解问题答案,后进行重置密码

  3. 通过钓鱼方式获取用户重置密码验证码或重置链接后进行重置

  4. 针对弱算法生成的验证码或重置链接进行暴力破解

防御

  1. 在重置密码失败3次以上,提供后端验证码生成,提示用户输入,并在后端进行验证

  2. 针对使用问题答案进行重置密码功能,不应限制问题答案范围

  3. 提供发送验证码和重置链接,选择随机性强算法,并记录验证码和用户的关系,同时需要设置验证码和重置连接的有效时间,并保证验证码和重置链接至多使用一次

解题

  1. Authentication Bypasses 02

    05.06.png
    05.07.png
    05.08.png
    05.09.png
  2. JWT tokens 04

    05.10.png
    05.11.png
    05.12.png
    05.13.png
    05.14.png
    05.15.png
    05.16.png
    05.17.png
    05.18.png
  3. JWT tokens 05

    05.19.png

    准备暴力破解脚本及密码字典,并将赋值的token替换到脚本中(这里尝试了使用a-zA-Z0-9生成密码进行暴力破解使用python和go分别进行了实现,但是当密钥超过5位时,破解时间会远远增长,所以在暴力破解中使用提前准备好的弱口令密码字典进行破解效果会更好)

    05.20.png
    05.21.png
    05.22.png
    05.23.png
    05.24.png
  4. JWT tokens 07

    05.25.png
    05.26.png
    05.27.png
    05.28.png
    05.29.png
    05.30.png

    疑问:

    a. 如何获取refresh token信息?

    猜测:日志中记录的/refresh/login应该是用于登陆,并返回refresh_token

    尝试:

    • 使用zap重放攻击请求/refresh/login接口,提示Content type:application/x-www-form-urlencoded;charset=UTF-8 not supported

    • 修改请求头重的Content-Type为application/json;charset=UTF-8,重新发起请求,提示Required request body is missing

    • 修改request body为{},重新发起请求,提示401状态码

    • 修改request body为{"username" : "silence", "password" : "123456"}(为webgoat登陆账号密码信息),重新发起请求,提示401状态码

      结论:尝试失败

    b. 如何通过refresh token刷新access_token?

    通过luyten反编译jar包或查看WebGoat源码得知结果:

    05.31.png

    a. 如何获取refresh token信息?

    向URL /refresh/login提交json数据{"user" : "Jerry", "password" :"bm5nhSkxCXZkKRy4"},为用户Jerry创建access_token和refresh_token

    b. 如何通过refresh token刷新access_token?

    向URL/refresh/newToken提交json数据{"refresh_token" : xxx}和request header Authorization: xxx token,为token中用户Tom重置token

    05.32.png
    05.33.png
    05.34.png
    05.35.png
    05.36.png
    05.37.png
    05.38.png
  5. JWT tokens 08

    05.39.png
    05.40.png
    05.41.png
    05.42.png
    05.43.png
    05.45.png
    05.46.png
    05.47.png
    05.48.png
    05.49.png
    05.50.png

    疑问:

    a. 如何影响提交参数影响签名查询结果为自己定义的

    是否可以通过;指定查询链,改写kid查询的结果控制输出(签名)

    分别将kid修改为:

    • webgoat_key';select 'test(失败,hsqldb语法不支持改语法,但支持SELECT 1 FROM
      INFORMATION_SCHEMA.SYSTEM_USERS)

    • webgoat_key';create table tk(key varchar(32));insert into tk values('test');select key from tk where key='test (失败,未知原因)

    结论:尝试失败

    通过luyten反编译jar包或查看WebGoat源码得知结果:

    05.51.png

    根据代码,可借助jwt_keys表查询将secret自定义,且secret必须为base64编码

    05.52.png
    05.53.png
    05.54.png
    05.55.png
    05.56.png
    05.57.png
  6. Password reset 02

    05.58.png
    05.59.png
    05.60.png
    05.61.png
  7. Password reset 04

    05.62.png
    05.63.png
    05.64.png
    05.65.png
    05.66.png
    05.67.png
    05.68.png
    05.69.png
  8. Password reset 05

    注意此题目不能使用ZAP代理,原因ZAP代理会自动修改HOST头信息为请求地址

    05.70.png
    05.71.png
    05.72.png
    05.73.png
    05.74.png
    05.75.png

    疑问:

    a. 如何得知tom@webgoat-cloud.org用户的重置密码时的唯一标识

    查看WebGoat源码得知结果:

    05.76.png
    05.77.png
    05.78.png
    05.79.png
    05.80.png
    05.81.png
    05.82.png

欢迎添加公众号【扯淡er】学习交流

扯淡er
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342