【Pikachu】漏洞练习平台做题记录+原理解析(1)暴力破解

前言

Pikachu是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞。 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习,那么Pikachu可能正合你意。
pikachu的安装非常简单,如果安装配置过程中遇到了什么问题,欢迎找我询问。
这是pikachu的官方github:https://github.com/zhuifengshaonianhanlu/pikachu
本次做题使用的环境是linux,使用官方给出的docker部署方式部署。

![pikapika](https://img-blog.csdnimg.cn/f1fbb2235bcc4ff688e38c9496be8551.pn


暴力破解

0x00 概述

其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果

暴力破解就是用可能是密码的字符挨个试,直到成功。
缺点是需要攻击者有足够的算力、时间,还需要一个足够科学的字典,当然,最重要的或许是有一个好运气…
请添加图片描述

0x01 基于表单的暴力破解

这是一个很基本的练手题,直接使用burpsuite攻击器重发报文挨个尝试就可以通过。
重要的是让咱们知道暴力破解的思路、原理和实现方式。

解决

第一步 代理

有两种方法可以达到向burpsuit的代理发送流量的效果,一是直接使用系统的代理功能,使系统发出的流量都经过本地127.0.0.1的80端口,二是使用浏览器+代理插件,相比第一种,好处是流量捕捉的范围缩小了,不会抓到别的应用的包,不过使用这种方式需要安装其他的代理插件。

第一种代理方式 直接使用系统代理
这里使用的是win11,win10或windows其他版本也有类似选项。
在这里插入图片描述

第二种代理方式 使用浏览器抓包插件
此处是chrome浏览器,使用了SwitchOmega插件,添加代理服务器、端口如下图所示。
在这里插入图片描述

以上方法任选其一。接下来配置burpsuit的代理。
打开抓包软件 Burpsuit ,菜单栏 --> 代理(proxy)–> 选项,勾选上本地回环地址前方的 运行中 复选框。这一步是使burpsuit 抓取经过回环地址的代理流量。在这里插入图片描述

第二步 抓包

开启拦截功能。
在这里插入图片描述

如果现在下方就有了数据,说明已经抓到了一些流量报文,它们不是我们的目标,先将它们放行(forword),直到下方没有数据,再开始后面的操作。
首先,随便在表单中输入一些字符,我这里输入了admin和admin123。
在这里插入图片描述
在点击了login按钮后,burpsuit这边抓到了相应的报文。
在这里插入图片描述
可以看到,在下方的post请求体中,赫然写着username=admin还有password=admin123字样,用户输入的账号和密码直接被放在了报文的请求体中,给了我们可乘之机,我们可以利用burpsuit的攻击器(intruder)功能,替换username和password后的内容,来进行暴破攻击。
右击鼠标,在弹出的快捷菜单中选择发送到intruder(send to intruder)
在这里插入图片描述

第三步 暴破

进入攻击器,可以看到这样的页面。
在这里插入图片描述在攻击器的“位置”选项卡中,选择攻击类型为集束炸弹(Clusterbomb),然后点击“清除payload位置”来清除默认payload位置。
然后选中字段“admin”,点击添加payload位置,再选中“admin123”,同样点击添加payload位置 , 这样,就将username和password的参数内容设为了待会儿要替换的payload位置。

在这里插入图片描述在攻击器的payload选项卡中,选择payload集1,payload类型为简单列表,在下方的从列表中添加中选择用户名
在这里插入图片描述在攻击器的payload集下拉菜单中,选择2,与1同样的操作,添加payload为密码

  • payload集1payload集2分别代表了我们刚插入的两处payload位置,也就是username和password,所以需要在这个地方进行如此设置。若我们的payload位置有三处,理所当然地,这里会有三个payload集待我们配置。

在这里插入图片描述
注意:此处设置payload选项仅仅是为了演示正常情况下的添加方法,使用的是burpsuit自带的暴破字典,若是有其他的字典文件也可以从此处添加进去。
在这里插入图片描述
从pikachu平台的提示中我们可以看到,我们添加的密码字典中并没有他真正的密码123456000000abc123中的任何一个,所以肯定是暴破不出来的,我们手动地添加一下,如下图。

在这里插入图片描述

攻击器的资源池选项卡可以配置线程(并发数),这里默认的就可以。
在这里插入图片描述攻击器的选项选项卡可以配置攻击器的一些选项,默认就可以。

在这里插入图片描述点击右边的开始攻击,暴破就开始了。
在这里插入图片描述

暴破的界面如上图所示,默认是按照请求的顺序排序的,我们点一下长度标签,用返回报文的长度来排序。
经过几分钟的暴破,我们可以看到,有几个返回报文长度不一样的请求被放到了前两位,选中他们,查看他们的response可以看到,里面有“login seccess”的字样。
如此,我们可以判断,暴力破解成功了,而成功的账号为“ADMIN”、“admin”,密码为“123456”。
在这里插入图片描述
我们将账号密码在web上尝试登录。
在这里插入图片描述
登录成功。
这里由于教学burpsuit的代理、抓包方法,写得有点长,在之后会带过这些基础的部分,仅在必要时提起。

0x02.验证码绕过(on client)

为了防止如0x01中的暴破,各大网站一般都会加入验证码来阻止同一报文的重发,不过即使加上了验证码,如果加的方式不正确,就会仍然起不到验证码应有的作用。

注意:为了方便教学,这里我先做暴力破解的第三道题:验证码绕过(on client)
在这道题中,开发者在登录时加入了验证码。
在这里插入图片描述
我们随便输入用户名和密码,输入正确的验证码,打开burpsuit的代理和拦截功能,进行抓包,
在这里插入图片描述
我们发现,在原有的username和password的基础上,开发者还加入了vcode这个参数,里面存放了我们的验证码,我们现在将报文添加到repeater发送过去,查看response。
在这里插入图片描述
服务器对账号和密码做出了判断,给出了结果,与0x01没什么不一样的。那么,当验证码错误的时候,会发生什么呢?
接下来,我们再抓一次,这次我们输入错误的验证码。
burpsuit开启拦截
提示框
可以看到,浏览器弹出提示框,提示我们的验证码输入错误。
不过有一个情况值得我们注意:即使是提示框已经弹出来的时候,我们的burpsuit也是空空如也,没有抓到任何相关的报文,那网页是怎么知道我们的验证码是错误的呢?
在这里插入图片描述
我们对着网页右键查看网页源代码。
在这里插入图片描述

我们可以看到验证码的刷新和验证是通过前端的js函数 validate()实现的,调用函数createCode()来生成验证码,当输入的验证码inputcode等于本地的验证码变量code的时候会返回true,否则返回false。
在这里插入图片描述
而调用validate()的代码在上图所示的地方。

补充知识: onsubmit这个事件会在表单提交时触发,如果 onsubmit 句柄返回 fasle,表单的元素就不会提交。如果该函数返回其他值或什么都没有返回,则表单会被提交。

结合validate()函数和onsubmit事件的用法我们可以知道,若validate()返回值为true则表单会提交,若为false则不会提交,在其中我们没有找到任何与服务器交互的地方,那么是否这道题中服务器就是验证不了我们的验证码呢?刚开始抓到的报文中参数vcode有什么用呢?
我们回到burpsuit,将vcode的值随便改一改然后发送过去。
在这里插入图片描述
竟真的返回了服务器对账号密码判断后的信息,即使我将这个参数直接删掉,服务器也会返回这个信息,这说明了报文中传的参数vcode并没有任何作用,后端对验证码根本没有进行验证,只是前端的js对验证码进行了简单的验证,这种写法只能用以诓骗小白,实际上只用重发这个报文就行。

解决

我们将这个报文添加到攻击器(intruder)中,选择集束炸弹(Clusterbomb),清除默认的payload位置,在username和password两处添加payload位置。
在这里插入图片描述
如0x01一样地配置payload、资源池、选项,然后开始攻击。

成功找到账号密码。

0x03.验证码绕过(on server)

上一题中,验证码仅被放在了本地进行简单校验。不过,即使开发者将验证码放在了服务器上,也可能会存在许多问题,如验证码不过期可以被无限次使用,验证码校验不合格,或者验证码生成太过简单有规律很容易被猜解。

在这道题中,开发者将验证码判断放在了服务器上。
在这里插入图片描述

我们将含有错误验证码的报文发送到repeater中重发,看一下服务器的响应。

在这里插入图片描述

可以看到验证码错误和为空的时候都会有提示,可以知道服务器对验证码的内容是做了判断的。
接下来我们再看一下是否存在验证码不过期问题。
我们刷新网页,将代理打开,输入正确验证码,重新抓取报文,将报文发送到repeater中重发。
在这里插入图片描述
我们发送了一次请求,提示了用户名或密码不存在,那么我们改一下用户名或密码,仍用相同的验证码再发一次。
在这里插入图片描述
我们发送了第二次,发现仍会提示账户或密码不存在,而不是提示验证码错误,这说明这里存在验证码不过期的问题。

这里额外解释一下,正常情况下,验证码应该只会允许发送一次请求,之后验证码就会过期,服务器会发送一个新的验证码到客户端去参与进行之后的请求。而此时拿着旧的验证码再去服务器进行验证,服务器会将它与新验证码作对比,得出验证码错误的结果。

解决:

我们可以利用验证码不过期的漏洞,一直使用同一个正确的验证码,让服务器验证不同的账号和密码来做暴破。
将含有正确验证码的报文发送到intruder中,选择Clusterbomb,清除默认payload位置,将username和password的参数值添加为payload位置。

在这里插入图片描述
其他与之前的暴破步骤一样,开始攻击,按照长度排序,经过一段时间的暴破后得到了账号密码。

在这里插入图片描述
ps:在查看源代码inc/showvcode.php的时候顺便看到了开发者的一点小吐槽~
在这里插入图片描述

0x04.token防爆破?

在这道题中,在username和password之外还加上了一个参数token,服务器在发送了一个报文后将token作废,传回一个新token过来。
在这里插入图片描述
而这样的方式就让token有了时效性,防护了上一题中的漏洞。
可是,这样的防护方式是否就是无懈可击的呢?

解决:

并不是,我们可以在response中看到我们下一次需要发送的token,接下来,我们只需要利用burpsuit的一些功能,在发送request报文后读取服务器的response报文,取出我们下一次发送时需要的token,将它填入下一次发送的request报文中,即可通过下一次的token验证。
在每一次发送后,都将response中的token取出来留作下一次发送使用,如此,便可通过token验证,完成爆破。
在这里插入图片描述
下面有两种方式都能实现这个效果,两种方式的原理都是一样的,只是难易程度不同,建议都学习一下。

方式一 使用grep过滤

我们将报文发送到intruder中,与先前不同的是,我们将攻击类型设置为草叉(Pitchfork),这个攻击方式可以为每一处payload位置配置不同的payload集。再将下方的password和token的值添加为payload位置。
注意:这个地方由于Burpsuit的Pitchfork方式的特性,每次都会将payload换掉,所以做不成集束炸弹(clusterbomb)类似的效果,只能用这种方式检测password一个参数值。
在这里插入图片描述
在payload选项卡中,将payload集1按照前几题的方式添加,在payload集2中,需要将payload类型选择为递归提取(Recursivegrep),这个方式可以让我们提取服务器传回来的token值,放入我们要发送的报文中。
在这里插入图片描述
而payload选项中的内容从何而来?我们进入选项(options),找到“Grep-Extract”,选中“从响应包中提取以下项目:”,点击“添加”。
在这里插入图片描述
弹出的窗口应该是没有内容的,此时我们点击“获取相应”按钮,获取了相应的报文,再将报文滚动到token值这里,推荐使用下方的搜索功能搜索“hidden”,可以直接滚动到这里。
接着鼠标选中token值,不要多选或少选任何一个字符,可以看到选中的区域变为橙红色,并且在左上角的输入框中自动生成了内容。查看内容与我图中一样即可,然后点击确定。
(自动生成的内容中,可能会比我这多一点或者少一点字符,一般来说是没什么问题的,不是差太多就可以,实在不行可以直接手输。)
在这里插入图片描述
我们回到payload选项卡中,发现payload选项中已经有了内容。
在这里插入图片描述
接下来配置并发(线程)情况,在新版的burpsuit中,并发(线程)被统一放到了资源池选项卡中,我们选中“新建资源池”,更改最大并发请求数为1,就配置好了。然后点击“开始攻击”。

ps,若你找不到资源池选项卡,那你使用的或许是旧版的burpsuit,你的线程应该可以在options选项卡下的请求工程(RequestEngine)中找到,然后将“线程数(Number of threads)”置为1,可以达到同样的效果。
这里的线程为何要是1?因为我们的token是一次性的,一个token拿过来只能用一次,不能重复或同时发两个一样的,故只能是单线程。

在这里插入图片描述
经过一段时间的暴破,成功拿到了密码。
在这里插入图片描述

方式二 使用宏

这种方式虽然步骤多了点,不过起到的作用比方式一更加大,而且可以直接使用之前的暴破方式,很值得学习尝试。
在burpsuit中找到项目配置project options选项卡,找到下方的宏macros,点击添加add新建一个宏,选择生成的token的数据包,命名为“pika”。
在这里插入图片描述
在弹出的“宏编辑器”中,单击“记录宏Re-record macro”会弹出“宏记录器”,选择刚刚抓的请求包,点击“确认ok”。

在这里插入图片描述
此时在宏项目macro items中可以看到已经有了新的条目了。点击项目设置configure item,在弹出的窗口中点击添加add,在再次弹出的窗口中将参数名称Parameter name命名为token,点击获取响应Get response,鼠标选中token的值,上方的定义开始和结束Define start and end会自动生成,检查一下这个自动生成的值是否和我的差不太多,然后点击“确认”,接下来的每个窗口都直接“确认”。可以在宏macros处看到设定好的“pika”。
在这里插入图片描述
在这里插入图片描述
在上方的会话处理规则session handling rules中选择add新建一条规则,命名为“pika”,规则动作rule actions中单击添加add,选择运行宏run a macros;然后选择仅更新此参数updata only the following parameters,添加指定的参数token,确认,回到会话规则编辑器。

在这里插入图片描述
在会话规则编辑器中选择范围scope–>url范围url scope–>使用自定义范围use custom scope,把将要爆破的页面网址添加进去,之后一路ok。
在这里插入图片描述
回到代理proxy,将报文发送到intruder中,除了线程需要配置为1,其他直接按照前两题的方式,选择集束炸弹进行爆破。
在这里插入图片描述
经过一段时间的暴破,成功获取了账号和密码。
在这里插入图片描述

0x05 防范方式

使用认证安全策略,包括:

  1. 是否要求用户设置复杂的密码;
  2. 是否每次认证都使用安全的验证码(想想你买火车票时输的验证码~)或者手机otp;
  3. 是否对尝试登录的行为进行判断和限制(如:连续5次错误登录,进行账号锁定或IP地址锁定等);
  4. 是否采用了双因素认证;
    …等等。

END

猜你喜欢

转载自blog.csdn.net/ON_Zero/article/details/126380973