【Pikachu】漏洞练习平台做题记录+原理解析(1)暴力破解
前言
Pikachu是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞。 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习,那么Pikachu可能正合你意。
pikachu的安装非常简单,如果安装配置过程中遇到了什么问题,欢迎找我询问。
这是pikachu的官方github:https://github.com/zhuifengshaonianhanlu/pikachu
本次做题使用的环境是linux,使用官方给出的docker部署方式部署。
暴力破解
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集1
和payload集2
分别代表了我们刚插入的两处payload位置,也就是username和password,所以需要在这个地方进行如此设置。若我们的payload位置有三处,理所当然地,这里会有三个payload集待我们配置。
注意:此处设置payload选项仅仅是为了演示正常情况下的添加方法,使用的是burpsuit自带的暴破字典,若是有其他的字典文件也可以从此处添加进去。
从pikachu平台的提示中我们可以看到,我们添加的密码
字典中并没有他真正的密码123456
、000000
、abc123
中的任何一个,所以肯定是暴破不出来的,我们手动地添加一下,如下图。
攻击器的资源池
选项卡可以配置线程(并发数),这里默认的就可以。
攻击器的选项
选项卡可以配置攻击器的一些选项,默认就可以。
点击右边的开始攻击
,暴破就开始了。
暴破的界面如上图所示,默认是按照请求的顺序排序的,我们点一下长度
标签,用返回报文的长度来排序。
经过几分钟的暴破,我们可以看到,有几个返回报文长度不一样的请求被放到了前两位,选中他们,查看他们的response
可以看到,里面有“login seccess”的字样。
如此,我们可以判断,暴力破解成功了,而成功的账号为“ADMIN”、“admin”,密码为“123456”。
我们将账号密码在web上尝试登录。
登录成功。
这里由于教学burpsuit的代理、抓包方法,写得有点长,在之后会带过这些基础的部分,仅在必要时提起。
0x02.验证码绕过(on client)
为了防止如0x01中的暴破,各大网站一般都会加入验证码来阻止同一报文的重发,不过即使加上了验证码,如果加的方式不正确,就会仍然起不到验证码应有的作用。
注意:为了方便教学,这里我先做暴力破解的第三道题:验证码绕过(on client)
在这道题中,开发者在登录时加入了验证码。
我们随便输入用户名和密码,输入正确的验证码,打开burpsuit的代理和拦截功能,进行抓包,
我们发现,在原有的username和password的基础上,开发者还加入了vcode这个参数,里面存放了我们的验证码,我们现在将报文添加到repeater发送过去,查看response。
服务器对账号和密码做出了判断,给出了结果,与0x01没什么不一样的。那么,当验证码错误的时候,会发生什么呢?
接下来,我们再抓一次,这次我们输入错误的验证码。
可以看到,浏览器弹出提示框,提示我们的验证码输入错误。
不过有一个情况值得我们注意:即使是提示框已经弹出来的时候,我们的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 防范方式
使用认证安全策略,包括:
- 是否要求用户设置复杂的密码;
- 是否每次认证都使用安全的验证码(想想你买火车票时输的验证码~)或者手机otp;
- 是否对尝试登录的行为进行判断和限制(如:连续5次错误登录,进行账号锁定或IP地址锁定等);
- 是否采用了双因素认证;
…等等。
END
【Pikachu】漏洞练习平台做题记录+原理解析(1)暴力破解相关推荐
- 【Pikachu】漏洞练习平台做题记录+原理解析(2.2)XSS姿势和技巧
前言 Pikachu是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞. 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习,那么Pikachu可能正合你意. pikach ...
- 2020.9月做题记录
八月的做题记录因为是暑假所以鸽掉了. 离联赛真的不远了,要继续努力啊qwq- week -1 2020.08.30 2020.08.30 今天考试,修了20+次锅,修的我都没有心情做题了- 然后开始消 ...
- CTF-web做题记录(狼组/BUUCTF)【一】
CTF-web做题记录(狼组/BUUCTF)[一] WEB 1.ctf.wgpsec 你可能需要一部iphone 题目如下 考察点:user-agent,burp改为iphone的user-agent ...
- 概率期望题(期望 DP)做题记录
概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...
- 数数题(计数类 DP)做题记录
数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当:所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和. 完全图点数为 \(n ...
- pikachu漏洞搭建平台
pikachu漏洞搭建平台 想要体验更好阅读并且下载下面需要的软件,请点击链接: xuwenjie. 根据需求自行下载 安装VMware以及win7系统以及win server 2003靶机 1,VM ...
- CSDN 第六期编程竞赛做题记录
CSDN 第六期编程竞赛做题记录 -- CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16 9.18周日闲来无视写一下 csdn 的编程题,每期编程 ...
- 退役前的做题记录5.0
退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...
- Regional 做题记录 (50/50)
写在前面 博主深感自己太弱了QAQ 于是有了一个刷水的想法,Regional的题目还是有很多考查思维的题目,所以这次是乱做50道思考题,可能会顺带做一些水题,这些题的简要题解会写到这篇博文里面,希望能 ...
最新文章
- 编译分布式并行版caffe(Open MPI)教程
- 单板机 单片机 c语言,单板机 单片机 个人计算机有什么区别吗
- java 数组group by_java Group by分组算法
- Go语言字符串和正则表达式
- Python+pywin32操作Excel文件常用功能(268行代码+注释)
- 为 WE 打 Call!
- Python 基于项目自动生成 requirements.txt 文件
- 长沙北大青鸟:北大青鸟培训学士后课程让大学生重回就业春天
- 编译原理研究性学习专题 2——递归下降语法分析设计原理与实现
- 游戏研发学习路线(思维导图)
- android intent-filter作用,详解Android中Intent对象与Intent Filter过滤匹配过程
- 对异步FIFO的全面理解
- 有哪些操作简单能将PDF转成图片的工具?
- 【Windows】Windows如何使用注册表设置/清除开机自启动软件?
- 写在前面——说说我的故事
- 分布式持久内存文件系统Octopus(ATC-17 )分析(一)
- linux硬盘盘符更改,linux更改emc磁盘盘符
- Mac Charles抓包配置
- 护眼灯色温多少对眼睛好?推荐色温4000K暖白光的护眼灯
- 关于新版本的SpringBoot自定义配置静态资源路径的问题
热门文章
- CC3220学习安装环境安装烧写步骤
- 高考的日子,说点我经历的教育故事
- Java的一个常见小错误
- 【JavaScript】前端实现电子签名:
- UI课程(1.Control,2.Switch开关 ,3.slider滑动器,4.SegmentedControl分段)
- Android刮奖效果
- 2021-12-31,如何下载oracle的ocp证书?(岁末最新版)
- 叮咚买菜、每日优鲜在上游“打架”
- [转]浅谈apple设计中的黄金分割
- 【泛微ecology】Linux下 ecology日志截取