文章目录

  • (1)暴力破解是什么
  • (2)暴力破解的一般防范方法
  • (3)前后端常见的漏洞
    • <0>无防护下的暴力破解
    • <1>前端防护的漏洞
    • <2>后端防护的漏洞
    • <3>加入token的暴力破解
      • 【1】什么是Token
      • 【2】Token防什么
      • 【3】有Token情况下的举例

(1)暴力破解是什么

暴力破解在ctf中是归于密码口令里的知识,暴力破解常用于破解用户名或者密码,通过脚本不断的尝试可能的密码类型。类似nmap这一类工具,爆网站的目录的时候也是通过这种逻辑,用各种常用路径的尝试暴力破解文件网站的路径的。

(2)暴力破解的一般防范方法

  • 1、设计更难得验证码
  • 2、后端主要不要有逻辑上的漏洞(不要将验证码以文本得形式以各种方法返回给前端,或者出现输入不同错误导致返回有什么明显不同)
  • 3、php.ini设置合理且注意用完验证码之后就要被销毁
  • 4、设置失败登录限制,登录失败次数太多就要被限制一段时间之后再登录

(3)前后端常见的漏洞

<0>无防护下的暴力破解

拿pikachu上的 ‘ 基于表单的暴力破解 ’ 举例

【源码分析】
打开“基于表单的暴力破解”模块鼠标右键打开菜单,点击查看源码,会发现没有设置javascript代码做验证码防护,再打开后端的bf_form.php文件,审计后端源码,如下图:

if(isset($_POST['submit']) && $_POST['username'] && $_POST['password']){$username = $_POST['username'];$password = $_POST['password'];$sql = "select * from users where username=? and password=md5(?)";$line_pre = $link->prepare($sql);$line_pre->bind_param('ss',$username,$password);if($line_pre->execute()){$line_pre->store_result();if($line_pre->num_rows>0){$html.= '<p> login success</p>';} else{$html.= '<p> username or password is not exists~</p>';}} else{$html.= '<p>执行错误:'.$line_pre->errno.'错误信息:'.$line_pre->error.'</p>';}
}

代码做了这么几件事

  • 1、将传过来的username和pasword分别赋值给$username$password
  • 2、进行sql预编译(上面的函数中没有相应的$link代码,其实在这之前有$link=connect();这个语句才能用prepare方法进行预编译)
  • 3、用bind_param方法将$username$password变量传入sql语句中(bind_param中的第一个参数是按照顺序对输入的变量做声明类型的,比如有s–string、d–double、i–integer、b–bool)
  • 4、后用store_result方法将执行之后的结果集转移,然后用num_rows看返回的结果集有几行,若大于零则返回’login success

从上面分析出代码对sql做了防范但是没有生成验证码的模块,也没有检验验证码的模块也就是说没有对暴力破解做防护。我们可以直接用burpsuite抓包之后用intruder模块进行爆破。

【操作步骤】

  • 1、首先输入一个随机的账户名和密码,作者这里的密码被我用开发者工具改了一下html不然密码会是一个个实心的黑弹弹

  • 2、之后在inetcpl.cpl中设置代理,用burpsuite抓包

  • 3、发送到intruder模块设置attack type类型为cluster bomb将默认的变量clear,然后加入新的变量。cluster bomb类型允许给不同变量设置不同的字典,且组合字典中的各种值。(下图和intruder模块没有任何关系,截图截错了)

  • 4、在Payloads模块添加爆破的字典,下面要做的就是给第一和第二个变量分别甚至字典,有自己的字典的可以用add from list处添加或者修改payload type的类型为runting list都可以打开目录导入字典。笔者因为已经直到真正的密码是什么,所以没有导入,在simple list模式下添加了几个词段意思一下。

  • 5、之后点击start attack开始爆破,爆破完成之后会发现用户名为admin而密码为123456的返回长度和其它的完全不同,这就说明该结果为正确答案

<1>前端防护的漏洞

  • 1、前端javascript代码生成验证码并且验证,这一类方法就是欺负老实人不懂技术。

  • 2、后端生成的验证码直接输出到了返回的文件中

  • 3、验证码出现在返回的html中

要以pikachu上面的验证码绕过(on client)模块举例,值得一提的是,在pikachu上的关卡没有设置后端验证码直接泄漏到网页的源码里的情况,这种情况是不是就没办法联系?实则不然,这种情况的操作方法和有token的暴力破解类似,所以这里就只按照一般情况下去说,具体验证码泄漏到返回前端源码里的情况可以参考token。

【源码分析】

在打开验证码绕过(on client)的模块鼠标右键点击查看源码,直接拉到最下面会发现有下面的javascript代码

<script language="javascript" type="text/javascript">var code; //在全局 定义验证码function createCode() {code = "";var codeLength = 5;//验证码的长度var checkCode = document.getElementById("checkCode");var selectChar = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');//所有候选组成验证码的字符,当然也可以用中文的for (var i = 0; i < codeLength; i++) {var charIndex = Math.floor(Math.random() * 36);code += selectChar[charIndex];}//alert(code);if (checkCode) {checkCode.className = "code";checkCode.value = code;}}function validate() {var inputCode = document.querySelector('#bf_client .vcode').value;if (inputCode.length <= 0) {alert("请输入验证码!");return false;} else if (inputCode != code) {alert("验证码输入错误!");createCode();//刷新验证码return false;}else {return true;}}createCode();
</script>

这一段javascript代码做的事情有如下操作

  • 1、首先定义一个全局变量code
  • 2、定义一个create函数,这个函数做了以下几件事
    • (1)将code定义为空
    • (2)定义一个整型变量codeLengrh
    • (3)通过getElementByid的方法调用了id为checkCode的节点并将生成的句柄赋值给checkCode
    • (4)定义一个有36个元素的数组并且将这个数组赋值给selectChar
    • (5)定义一个循环五次的for循环,其中每次都要执行以下程序先用Math.random方法生成一个大于零小于一的数,之后将这个数乘36作为Math.floor的参数,Math.floor会随机返回一个小于或等于参数的数,并且将这个数用作selectCode变量的下标访问对应的元素,拼接之前的code值并再次赋值给code
    • (6)再对checkCode变量所指的checkCode节点设置value和classname
  • 3、定义一个validate函数,这个函数做了如下的事
    • (1)通过搜索器的方式将id为bf_client且class为vcode的节点的value值返回赋值给inputcode变量
    • (2)然后用if语句判断是否没有数值,和是否和code值一样,若为空的话就不会新生成一个验证码,而输入的验证码错误的话就会新生成一个验证码

而检查后端之后发现如下

if(isset($_POST['submit'])){if($_POST['username'] && $_POST['password']) {$username = $_POST['username'];$password = $_POST['password'];$sql = "select * from users where username=? and password=md5(?)";$line_pre = $link->prepare($sql);$line_pre->bind_param('ss', $username, $password);if ($line_pre->execute()) {$line_pre->store_result();if ($line_pre->num_rows > 0) {$html .= '<p> login success</p>';} else {$html .= '<p> username or password is not exists~</p>';}} else {$html .= '<p>执行错误:' . $line_pre->errno . '错误信息:' . $line_pre->error . '</p>';}}else{$html .= '<p> please input username and password~</p>';}
}

可以发现,这一段代码和不做防护的代码不能说相像只能说一模一样,别说验证验证码,连接收一下传过来的验证码都没有,所以不多说了。

基于前后端是如上的情况,我们可以用的绕过方式是,先输入正确的验证码通过javascript代码的检验,用burpsuite抓包直接在intruder模块进行爆破。

【操作步骤】

  • 1、首先输入用户名、密码还有正确的验证码

  • 2、再用burpsuite抓包,由以上的分析可以得出,vcode变量可以是任意值,因为后端没有检验,attack type类型建议设置为cluster bomb,这个类型允许给不同变量设置不同的字典,且会组合各种不同的组合方式

  • 3、然后和没有在前后端设置防护的操作一样设置payload

  • 4、最后点击start attack

<2>后端防护的漏洞

  • 1、后端生成的验证码逻辑过于简单,有明显的规律这样也会导致无法防护成功

  • 2、后端的验证有逻辑上的漏洞,比如密码和用户名输入正确而验证码输入错误,与验证码与密码和用户名都错误时返回的文件长度不同。

  • 3、一个验证码在没有用完就用unset函数删除的情况下默认存在24分钟,这样就会导致前端输入的验证码只要输入一个之前生成的且在24分钟的时效内的验证码都能被验证成功。

这一部分还是要用pikachu上的举例,用的是验证码绕过(on serve)模块

【源码分析】
前端是没有验证的,直接看后端,朋友们可以在pikachu上的vul目录下打开breakforce目录找到bf_server.php查看源码,后端的验证代码如下

$link=connect();
$html="";
if(isset($_POST['submit'])) {if (empty($_POST['username'])) {$html .= "<p class='notice'>用户名不能为空</p>";} else {if (empty($_POST['password'])) {$html .= "<p class='notice'>密码不能为空</p>";} else {if (empty($_POST['vcode'])) {$html .= "<p class='notice'>验证码不能为空哦!</p>";} else {
//              验证验证码是否正确if (strtolower($_POST['vcode']) != strtolower($_SESSION['vcode'])) {$html .= "<p class='notice'>验证码输入错误哦!</p>";//应该在验证完成后,销毁该$_SESSION['vcode']}else{$username = $_POST['username'];$password = $_POST['password'];$vcode = $_POST['vcode'];$sql = "select * from users where username=? and password=md5(?)";$line_pre = $link->prepare($sql);$line_pre->bind_param('ss',$username,$password);if($line_pre->execute()){$line_pre->store_result();//虽然前面做了为空判断,但最后,却没有验证验证码!!!if($line_pre->num_rows()==1){$html.='<p> login success</p>';}else{$html.= '<p> username or password is not exists~</p>';}}else{$html.= '<p>执行错误:'.$line_pre->errno.'错误信息:'.$line_pre->error.'</p>';}}}}}
}

这一段代码做了以下几件事:

  • 1、调用connect函数并将产生的句柄赋值给$Link变量

  • 2、定义并给$html变量赋值为空

  • 3、调用多个if函数实现密码为空时返回’密码为空‘,用户名为空时返回’用户名为空‘,验证码为空的时返回’验证码为空‘,全不为空时执行之后的程序

  • 4、若验证码、密码、用户名都不为空,会用$_POST方法调取vcode变量与用$SESSION方法调取存储在会话中存储的vcode变量做比较,若不同则返回’验证码输入错误‘,且比对时用了strtolower函数将两个变量全部转换为了小写

  • 5、若验证码正确,则执行的程序与之前无防护时的操作一样都是先对sql语句进行预编译,然后查询,所以这里就不赘述了

由以上的分析发现在验证码验证错误和验证正确之后没有将验证码用unset函数取消,而验证码默认最多再后台存储24分钟,也就是说在这24分钟的时间内,用这个验证码就能一直尝试登录。

【操作步骤】

  • 1、首先还是输入用户名、密码和验证码,这里的验证码就是后端产生之后返回到前端的,不是前端产生的

  • 2、之后就是burpsuite抓包,由上面的分析可以直到这里的vcode变量就不能随便的输入任意值,还是和之前一样设置变量,设置attack type类型为culster bomb

  • 3、在payload板块设置字典,如下

  • 4、再点击start attack,开始爆破

<3>加入token的暴力破解

【1】什么是Token

Token可以理解为一个随机生成的字符串,这个字符串会被服务器发送给前端,并一般将这个字符串保存到要发送到后端的form表单中,这样跨域的访问就能被马上识别出来,识别身份之后服务器才会根据token发送端可以执行的操作做出相应的动作

【2】Token防什么

先说结论,Token防的是CSRF(跨域请求伪造)不防暴力破解。Token是一串字符串,一般Token是由 请求的URL+时间戳+随机数 组合而成,并且被保存在前端的form表单中,当浏览器发起请求的时候一起被发送到后端,用于身份验证。在burpsuite中的intruder模块可以在options板块找到Grep Exreact部分将html文件中的token在发送之前赋值给请求报文中的某一变量

【3】有Token情况下的举例

还是以pikachu上的模块举例

【源码分析】

$link=connect();
$html="";
if(isset($_POST['submit']) && $_POST['username'] && $_POST['password'] && $_POST['token']){$username = $_POST['username'];$password = $_POST['password'];$token = $_POST['token'];$sql = "select * from users where username=? and password=md5(?)";$line_pre = $link->prepare($sql);$line_pre->bind_param('ss',$username,$password);if($token == $_SESSION['token']){if($line_pre->execute()){$line_pre->store_result();if($line_pre->num_rows>0){$html.= '<p> login success</p>';} else{$html.= '<p> username or password is not exists~</p>';}}else{$html.= '<p>执行错误:'.$line_pre->errno.'错误信息:'.$line_pre->error.'</p>';}}else{$html.= '<p> csrf token error</p>';}
}
//生成token
set_token();

后端代码做的还是预编译sql语句,只不过多加了一个生成token的函数—set_token函数,这个函数的代码如下

function set_token(){if(isset($_SESSION['token'])){unset($_SESSION['token']);}$_SESSION['token']=str_replace('.','',uniqid(mt_rand(10000,99999),true));
}

通过这个代码执行的操作是,删除原有Token再设置新的Token所以我们在用burpsuite的时候要将上一次请求返回的报文中的Token作为参数加入到请求报文中

【操作步骤】
有Token的情况下在burpsuite上的操作,关键的点是在burpsuite中怎样的操作才能设置将上一个请求得到的返回中的值截取下来作为数据添加到报文中

  • 1、首先输入用户名、密码

  • 2、用burpsuite抓包到payload position板块,这次不能像之前一样将attack type设置为cluster bomb,应该将其设置为pitchfork,如果设置成cluster bomb模块,就会发现burpsuite会持续爆破,这是因为每一次传回来的Token都不同,而这个模式会组合所有的情况,这样就会一直爆破。还要设置三个变量,如下图

  • 3、再在options板块将线程设置为1,这是因为设置多个线程之后,程序会不知道本次请求的Token要设置的是哪一个返回报文中的Token

  • 4、同样在这一个板块下,还要设置Grep Extra,在板块中找到这一个设置勾选Extra the following items from reponses前的小框,这样就能设置在返回报文中找参数,之后点击add,再点击fetch reponse,并按照下图设置设置截取的内容

  • 5、在payload板块中如下设置每一个变量的字典


  • 6、点击Start Attack开始爆破

pikachu上的密码口令暴力破解相关推荐

  1. 弱口令暴力破解详解(包含工具、字典下载地址)

    目录 一.弱口令概述 二.Web类-加密&验证码后台猜解 三.服务类-SSH&RDP远程终端猜解 四.应用类-ZIP&Word文件压缩包猜解 一.弱口令概述         弱 ...

  2. 如何防止自己的云服务器被暴力破解密码(限制暴力破解并发送邮件到自己的邮箱)

    如何防止自己的云服务器被暴力破解密码(限制暴力破解并发送邮件到自己的邮箱) 今天看到自己的阿里云服务器被别有用心的人gank一波,于是才想到得设置一套完美的防火墙策略了 首先黑客登录失败的日志为/va ...

  3. 安全测试(三) 服务器安全 渗透测试 常规服务器安全漏洞 高危端口暴露、弱口令密码、暴力破解、服务器提权、Mysql数据库提权等 浅谈《社会工程学》实战案例

    文章目录 一.前言 二.服务器安全 高危端口 2.1 端口号(Port number) 2.2 常见端口后及其用途表 2.3 端口号 扫描工具介绍 2.4 端口号 端口说明 攻击技巧 2.5 安全警示 ...

  4. web后台登录口令暴力破解及防御

    在实际网络安全评估测试中,前台是给用户使用,后台是给网站管理维护人员使用,前台功能相对简单,后台功能相对复杂,可能保护媒体文件上传,数据库管理等.前台用户可以自由注册,而后台是网站管理或者维护人员设定 ...

  5. 前女友闺蜜给我发了一个压缩包,居然还带密码?暴力破解ZIP加密文件的密码!

    前言 今晚下班后微信收到一跳消息!是前女友的闺蜜发过来的,然后让我自己去猜密码,本来我是不打算理她的!但是她后面说里面有你想不到的福利!这句话对于一枚(lsp)不对一枚宅男程序员没有抵抗力,毕竟我对她 ...

  6. 口令暴力破解--Telnet协议暴力破解、数据库暴力破解与远程桌面暴力破解

    Telnet协议暴力破解 Telnet Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力.要开始一个 ...

  7. python暴力破解压缩包密码(python暴力破解zip压缩包)

    python暴力破解压缩包密码 简介 简介: ZIP文件格式是一种数据压缩和文档储存的文件格式,原名Deflate,发明者为菲尔·卡茨(Phil Katz),他于1989年1月公布了该格式的资料.ZI ...

  8. mysql 弱口令暴力破解本地渗透测试

    文章目录 环境配置 主机 数据库 使用 Hydra 工具进行暴力破解 使用 metsploit 暴力破解 基本模块 基本命令 环境配置 主机 靶机: 本地Linux服务器虚拟机 + phpstudy ...

  9. 用TIA Portal+S7Client暴力破解西门子S7-300/400密码

    写在前面(文中下载仅在微信公众号"智能制造之家"有效) 前面我们谈到了不论是西门子.施耐德.罗克韦尔,或者其它工控系统,都不存在绝对的安全,并分享了工业控制相关的安全案例: 施耐德 ...

最新文章

  1. python之sys模块详解_(转)python之os,sys模块详解
  2. Vue单文件组件与vue-loader
  3. 第二天学习Java的笔记
  4. 田志刚:企业知识管理的知识传播
  5. 人工智能为什么这么火?
  6. 图像处理-灰度变换函数imadjust和stretchlim
  7. 使用mprotect系统调用来调试内存问题:memalign,aligned_alloc
  8. 星尘小组第十一周翻译-设计和优化索引
  9. 极客大学产品经理训练营 产品思维和产品意识(下) 第5课总结
  10. 基于ssm的宠物医院信息管理系统 java毕业设计源码介绍
  11. 服务器可以把ssd虚拟成内存,西数黑科技:把SSD当内存用
  12. spss 为何打不开
  13. 破解闪讯,让你的笔记本变成wifi基站
  14. 宝德自强PT620Z1
  15. 如何禁止Apache静态文件缓存
  16. licecap:截屏录制gif图片工具
  17. 做哪些事情可以提升生活品质?四十七个小建议
  18. php 多核cpu,如何利用多核CPU来加速你的Linux命令
  19. 零基础也能快速上手的动画制作工具 | 万彩动画大师
  20. win10系统升级没有声音?老司机教你怎么重新安装声卡驱动

热门文章

  1. ML之XGBoost:Rabit(XGBoost并行库)的简介、使用方法、案例应用之详细攻略
  2. 学人工智能需要什么配置的电脑?AI电脑配置需求
  3. 星战 java_星战知识之多少 -- 暗黑原力西斯(Sith)篇
  4. 清华北大2018届毕业生去向统计
  5. jQuery性能优化
  6. 用python发送put请求
  7. Java合并两个List并去掉重复项的几种做法
  8. 【看了10年前我为本单位写的此篇文章,感慨万分】此文章题目为:为关于“执行力”相关要素的方案设想
  9. luogu 1094
  10. Linux内核LED模块分析(二)