00
—
前言
靶机项目地址:
https://github.com/zhuifengshaonianhanlu/pikachu
环境准备:Phpstudy
关于上面环境安装搭建的教程网上太多啦,大家第一次接触的话可以去学习一下搭建过程,毕竟漏洞环境搭建可是一门必修课噢。至于github下载项目太慢的话,可以到文末获取快速下载链接哦!
01
—
基于表单的暴力破解
源码分析:
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>';
}
}
看看后端实现逻辑,接收前端post提交的username和password数值后,在数据库做以下查询
select * from users where username=? and password=md5(?)
也就是将输入的账号和md5加密后的密码跟数据库中所存在的数值进行查询。bind_param该函数绑定了SQL的参数,且告诉数据库参数的值。“ss”参数列处理其余参数的数据类型。若查询行数大于0,返回login success!否则username or password is not exists。
实战验证:
输入用户和密码提交并抓包,是没有任意加密的:
鼠标右键发送到intruder模块进行暴力破解:
找到位置,先清除所有选定:
然后选中我们需要值,再进行添加,最后选择焦束炸弹(Cluster bomb):
添加我们常用的一些用户字典:
添加我们常用的一些密码字典:
右上方选择执行攻击,等待攻击结束:
攻击完成后观察最右边的长度变化,以及响应的内容。最后爆破成功的返回长度是35052,得到正确的账号admin,密码123456。
02
—
验证码绕过(服务端)
源码分析:
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>';
}
}
}
}
}
}
用户名、密码、验证码都不为空的前提下,加入了验证码验证机制,代码通过判断strtolower($_POST[‘vcode’]和strtolower($_SESSION[‘vcode’])是否相等。验证完成后,并没有及时销毁 $_SESSION[‘vcode’],这才导致了输入一遍验证码,爆破用户名和密码就可以爆破成功。
接下来我们看看验证码是怎么实现的,验证码由后端showvcode.php文件产生,且onclick点击图片会自动刷新。
<?php
session_start();
include_once 'function.php';
//$_SESSION['vcode']=vcode(100,40,30,4);
$_SESSION['vcode']=vcodex();
//验证码绕过 on server 这里其实还是有一个问题,就是服务端将验证码字符串以明文COOKIE的方式给了前端,那验证码还有什么鸟意义。。。
setcookie('bf[vcode]',$_SESSION['vcode']);
$_SESSION[‘vcode’]的值是因vcodex()函数产生的。那vcodex()函数又是什么呢?带着这个疑问找到function.php,看一下里面的验证码实现。
function vcodex(){
$string = "abcdefghijklmnopqrstuvwxyz0123456789";
$str = "";
for($i=0;$i<6;$i++){
$pos = rand(0,35);
$str .= $string{$pos};
}
//session_start();
//$_SESSION['img_number'] = $str;
从vcodex()函数可以知道,其实验证码就是随机在小写的英文字母和数字0-9里面取六个数组成。至此其实思路已经很明朗了,验证码一直是$_SESSION[‘vcode’]第一次产生的值,导致strtolower($_POST[‘vcode’]) 和 strtolower( $_SESSION[‘vcode’])一直相等。所以只要不刷新验证码,将正确验证码的值加入到爆破中即可。
实战验证:
只要页面不刷新并且不去点击刷新验证码,那么验证码的值一直都会是初始值,也就是上面的mgzetg,按照第一关的操作即可拿到正确的口令。
03
—
验证码绕过(客户端)
源码分析:
后端部分只是做了简单的表单验证,没有做任何的过滤措施,也就是第一题的判断逻辑。这里的验证码校验写在前端页面:
表单提交时前端先做验证,若validate()函数返回值为true,表单才会提交。验证条件即为验证码框里填写的字符串是否和createCode()函数产生的一样。把验证机制交给前端是不安全的,因为数据交互发生在后端。
实战验证
抓包后用第一关相同的操作即可获取正确的用户和密码。
04
—
token防爆破
老规矩,先来审一审源码写的到底是些啥东西
验证条件为 $_POST[‘token’]== $_SESSION[‘token’],我们看看这两个值是怎么产生的。
$_SESSION[‘token’]是加载页面就产生的,通过set_token()函数将$_SESSION[‘token’]赋值为当前的微妙时间+一个五位数的前缀。
而$_POST[‘token’]是嵌在前端隐藏的一个input里,$_POST[‘token’]值就等于$_SESSION[‘token’]。由以上可以知道,token是一直变化的,这为爆破提供了难度,但是不管怎样,token值既然已经返回到前端,就可以得到返回的token值进行爆破。
实战验证
随便输个账号密码然后抓包。token爆破还是比较适合运用于知道账号,爆用户的密码。这里我们先假设它的账号是admin吧。
抓到包之后将它发送到爆破那里去,注意这里爆破方式要选择 Pitch fork
着到option 那里将线程改一下,改成1,因为一个token对应一次爆破。
再到grep-extract那里点击add,然后fetch response ,选中token的值burpsuite会帮你自动补齐
在payload这里,payload1我们选择弱口令top1000就好了,payload2我们选择Recursive grep,然后下面的request填上我们前一次获取到的token,开始爆破
我们可以看到,密码已经成功爆破出来了,正是123456。黄色框框也可以分析到,每一次后面的value值都跟下一次的payloads值一样,这样才能保证我们的token对应得上不会报错。
END
—
这是学渣成长之路的第十一篇文章,其实除了pikachu之外还有很多优秀的入门级靶机项目,比如“DVWA”、“sqli-labs”、“upload-labs”等等。希望这些文章能帮助到正在入门学习web渗透的小伙伴们。
需要靶机的小伙伴公众号回复“00002”
本文始发于微信公众号(学渣成长之路):小白入门靶机-Pikachu之暴力破解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论