pikachu 暴力破解部分

第一章 暴力破解

一.暴力破解原理和测试流程

  1. 什么是暴力破解

  暴力破解就是,攻击者在不知道目标系统的账号和密码的情况下,进行不断地尝试。

 

 

 

  2.暴力破解演示和burp suite使用介绍

  代理(proxy),当打开这个模块之后,会在计算机的本地监听一个端口(可以自己设置),所以会给浏览器设置一个代理,这样浏览器对目标站点的一些操作都会通过代理从而经过proxy模块,这样burp suite也会从这些操作中进行抓包。所有请求会被代理模块拦截下来。

  Forward是把拦截到的数据放行,drop则是丢掉这些数据,intercept就是拦截的意思。

  intruder模块可以对抓到的包的一些数据进行一些自定义的修改和配置。

  Sniper:可以把其中的一个参数设置成动态的变量,通过设定的payload,对这个变量进行重放。

  最后一种用的比较多,它能组成的可能性更多。

  基于表单的暴力破解 演示:

  首先我们要把它想象成一个真实的情况,我们要去破解它,先随便输入一个用户名和密码。

  点击login,此时显示的是用户名或者密码不存在。

  我们这时打开burp suite,再进行一下这个操作,看一下对应的抓包。

  我们可以看到,这是一个POST请求,账号是tt,密码是ttt。并且可以看到验证因素只有账号和密码两项,并没有验证码之类的东西。所以基本可以确认这个接口是可以进行暴力破解的。

  然后我们选中这个请求,右击,把它发送到intruder

  我们的目的是对数据包进行连续地重放,在每一次重放的时候,我们要把账号和密码处替换成字典里的账号和密码,然后不停地去尝试,根据返回结果判断返回结果有没有成功。

  我们把需要做测试的变量add一下,设置成动态变量。(clear可以清除)

  接下来我们对各个模式进行一下简单的解释。

  我们可以对payload的模式进行设置,我看到学习视频里,这里使用的是Runtime file类型,可以上传自己的字典文件进行尝试。以下的一些截图是学习视频里的,因为我并没有字典之类的文件。

  Sniper

 

 

 

 

 

  第一个数据包就是我们自己发送的那个,接下来的12....会用字典里的数值依次替换前面的数据。先把第一个变量的那些替换完,再去替换第二个变量的。然后第一个就不管了,说明它只能同时对一个payload进行替换。

  

  Battering ram

 

   我们可以看到,这个模式下,是将两个动态变量同时替换成字典中的第一个值,再进行重放。

  Pitchfork

 

 

   这时我们发现在这个模式下这里变成了两个,因为设置了两个动态变量,也就是我们要对这两个动态变量分别设置字典。

 

   进行爆破,发现第一个变量替换的是第一个字典的第一个值,第二个变量替换的是第二个字典的第一个变量。一一对应

  Cluster bomb(这个跟上一个一样,也需要两个字典)

   这个与上一个不同的是实现了交叉的功能,用第二个字典的第一个值依次与第一个字典的不同值进行匹配,这个值匹配完后再继续用第二个值进行匹配。

  我们还是经常使用这个模式。

  我们如何判断是否正确?

  在刚刚的尝试中,会提示用户名或者密码错误,如果是正确的,就不会提示这样一句话,会直接提示login success

   把所有响应数据包中包含这句话的flag出来,没有被flag的就是成功的数据包。

  再次进行爆破

   发现后面多出来一列就是那个flag,然后点一下这个进行排序,发现有一个并没有被flag,这个就是正确的用户名和密码。

   成功登录

  如果没有这个提示(固定的字符串),我们可以根据这个长度的排序进行判断,那个在最上面的或者是和绝大部分不同的就是正确的。

   3.暴力破解的绕过和防范(验证码绕过 -on client & Token相关问题 客户端)

 

 

  这次经过几次尝试发现,验证码是必须要正确的,否则无法进行登录。我们输入正确是验证码和错误的用户名和密码,尝试登陆。用burp suite查看一下

   发现并没有什么问题

  我们来查看一下页面的源代码。我们可以发现验证码的生成是在前端的Jscript代码生成的,当点击这个验证码就会进行更换。

 

  但是这种在前端生成的验证码是不安全的,可以进行绕过

  我们在burp suite上查看一下,选择这个,右击,发送到Repeater

   在这里我们可以自定义一下数据再进行发送看看有什么变化,我们把验证码改错或者直接删没看会不会是之前那个样子(改好,直接点Go即可)

  我们可以发现出现了这句话,但它并没有说验证码没有输入。就是后台并没有对它进行验证,出现这个框其实只是在JS代码中起作用了。

  

  我们尝试一下爆破

   这里就不用选中验证码了,因为实际上它是不起什么作用的

  配置一下

 

 

 

   登录成功

  我们再来看一下后端的代码

   它对用户名和密码进行了接受,并没有对前端输入发送过来的验证码进行接受和判断。前端的验证码只是在前端做了处理,并没有在后端进行验证。这样是肯定可以被绕过的。

  4.验证码绕过之服务端相关问题(-on server

 

  我们来输入错误的用户信息和密码,输入正确的验证码尝试一下,用burp suite抓包。

  先发送到Repeater,看一下后端返回什么

  不输入验证码:

  输入错误的验证码:

  这时试试看有没有验证码过期的可能,我们把页面刷新一下,会出现新的验证码,这时我们在验证码处输入这个新的,看会不会出现其他的提示

 

  此时会出现用户名或者密码错误而不再是,之前的语句

  我们再次验证这个验证码会不会过期,我们把用户名和密码改了再提交议会试试

 

   还是提示用户或者密码错误,说明这个验证码可以被重复利用。

  进行暴力破解

 

  从代码层面进行查看

  我们在刷新页面的时候可以看见验证码是不同的

   调用了这个文件,就是每当我们刷新页面时,它都会更新验证码。这个文件就是可以生成验证码的文件。点击这个验证码也是会触发,去调用这个文件去生成新的验证码。

   在前面会进行一个判断。

  为什么会出现不过期的问题,是因为它调用的这个文件有一个时间期限问题,默认是24分钟以后销毁,但实际上并不会等这么久的,所以我们能做的就是在验证完成后,就立刻销毁这个验证码,以达到一次一用的效果。如图所示

    5.暴力破解防范措施和防范误区

Token防爆破演示

  我们查看一下这部分的源代码,发现有一个隐藏的input标签,nametoken

   中间这个长长的字符串就是tokentoken是每次在打开这个页面时,后端收到请求后的同时去生成一个token,然后把token放到筛选里面。同时会把token输出到前端的表单里。目的是,当输入账号密码,点击登录时,后台会同时对账号密码加上这个token进行验证,并且每次刷新页面token也是会变化的。

  再来查看一下后端的代码

 

   后端先查看有没有提交用户名和密码,同时将提交的tokensession里面的token进行对比,如果token验过了,才回去验证账号和密码。

  每当请求页面的时候都会生成token

  跳转到函数功能

   先判断token存不存在,如果存在先销毁掉,然后再去生成一个新的token

猜你喜欢

转载自www.cnblogs.com/zhaihuijie/p/12612859.html