pikachu靶场-暴力破解
接下来我们开始进入pikachu的学习了。
Pikachu下载地址
下载地址1:https://github.com/zhuifengshaonianhanlu/pikachu
下载地址2:https://pan.baidu.com/s/1JpJjLDQF5DXIuxbgmclRbA 提取码:ulm5
将其放入WWW文件下即可,在此我就不赘述了,网上的教程很多。
暴力破解
一、概述
Burte Force(暴力破解)概述
“暴力破解”是一攻击具手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。 为了提高效率,暴力破解一般会使用带有字典的工具来进行自动化操作。
理论上来说,大多数系统都是可以被暴力破解的,只要攻击者有足够强大的计算能力和时间,所以断定一个系统是否存在暴力破解漏洞,其条件也不是绝对的。 我们说一个web应用系统存在暴力破解漏洞,一般是指该web应用系统没有采用或者采用了比较弱的认证安全策略,导致其被暴力破解的“可能性”变的比较高。 这里的认证安全策略, 包括:
1.是否要求用户设置复杂的密码;
2.是否每次认证都使用安全的验证码(想想你买火车票时输的验证码~)或者手机otp;
3.是否对尝试登录的行为进行判断和限制(如:连续5次错误登录,进行账号锁定或IP地址锁定等);
4.是否采用了双因素认证;
...等等。
千万不要小看暴力破解漏洞,往往这种简单粗暴的攻击方式带来的效果是超出预期的!
你可以通过“BurteForce”对应的测试栏目,来进一步的了解该漏洞。
从来没有哪个时代的黑客像今天一样热衷于猜解密码 ---奥斯特洛夫斯基
二、基于表单的暴力破解
知识补充
- Sinper:一个变量设置一个payload进行攻击
- Battering ram:可以设置两个变量,把payload同时给两个变量
- Pitchfork:两个变量分别设置payload,然后按顺序一一对应进行破解
- Cluster bomb:两个变量分别设置payload,然后交叉列所有情况进行破解(常用)
①配置浏览器代理,使用burpsuite抓包,发送至Intruder(入侵者)模块
②如图所示设置攻击类型Attack type以及变量。
③在playloads中添加变量的字典,点击load加载,并开始破解。
④根据爆破返回出的长度确定正确用户名以及密码。 (admin-123456) 当然了,正确的用户名和密码有很多,这个只是我的字典爆出的,受字典影响,肯定不全。
三、验证码绕过(on server)服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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>' ; } } } } } } |
分析源码,在比较完验证码后,没有重置验证码,漏洞由此可见,在我们输入了正确的验证码之后,验证码并没有过期,一直有效,可以继续使用。
①同样我们通过burpsuite抓包,发送至intruder模块,将验证码改为正确的验证码(因为正确的验证码一直有效),这样的们就可以绕过验证码来爆破用户名和密码了。
过程相似,我不一一截图了,参考表单的步骤。
②开始爆破,根据返回包长度判断正确的密码。
③登录测试,登陆成功。
四、验证码绕过(on client)客户端
这关依旧有验证码,通过观察源码不难发现,此次验证码是在前端中的js代码进行验证,与上一关的服务器端验证不同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <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> |
①Burpsuite抓包发送至Intruder模块。
②添加字典开始爆破。
五、token防爆破
①利用burpsuite抓取数据包,我们发现登录时提交了username,password,token,submit四个参数,每次服务器返回的登录页面都会包含一个随机的token值,这样每次提交都要验证token值,表面上可以防止爆破,但是后端产生的token每次都会以明文形式传到前端,从而产生了漏洞。
②将抓取的数据包发送至Intruder模块
③将Attack type 设置为pitch fork,为password和token值添加payload标志。
④在options栏中找到Grep-Extract,点击Add,点击Refetch response,进行请求,选取提取的token字符串,上面会自动填入数据的起始和结束标识,将此值保存下来,后面会用到。另外,将线程更改为1.
⑤在payloads栏中,将1变量设置密码字典,将2变量(token)选择为Recursive grep,并在下面如图所示的地方填入保存的值。
⑥从Results中可以看到上一次访问得到的token作为了本次请求的参数。而且从响应信息上也可以看到,没有提示token错误。长度不一样的password即为密码。
注:recursive grep类型只能单线程attack。(刚才我就忘了设置导致不能攻击)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!