小白入门靶机-Pikachu之暴力破解

  • A+
所属分类:安全文章

00

前言


靶机项目地址:

https://github.com/zhuifengshaonianhanlu/pikachu

环境准备:Phpstudy


关于上面环境安装搭建的教程网上太多啦,大家第一次接触的话可以去学习一下搭建过程,毕竟漏洞环境搭建可是一门必修课噢。至于github下载项目太慢的话,可以到文末获取快速下载链接哦!


01

基于表单的暴力破解


小白入门靶机-Pikachu之暴力破解

源码分析:

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。


实战验证:

输入用户和密码提交并抓包,是没有任意加密的:

小白入门靶机-Pikachu之暴力破解

鼠标右键发送到intruder模块进行暴力破解:

小白入门靶机-Pikachu之暴力破解

找到位置,先清除所有选定:

小白入门靶机-Pikachu之暴力破解

然后选中我们需要值,再进行添加,最后选择焦束炸弹(Cluster bomb):

小白入门靶机-Pikachu之暴力破解

添加我们常用的一些用户字典:

小白入门靶机-Pikachu之暴力破解

添加我们常用的一些密码字典:

小白入门靶机-Pikachu之暴力破解

右上方选择执行攻击,等待攻击结束:

小白入门靶机-Pikachu之暴力破解

攻击完成后观察最右边的长度变化,以及响应的内容。最后爆破成功的返回长度是35052,得到正确的账号admin,密码123456。


02

验证码绕过(服务端)


小白入门靶机-Pikachu之暴力破解

源码分析

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’],这才导致了输入一遍验证码,爆破用户名和密码就可以爆破成功。

小白入门靶机-Pikachu之暴力破解

接下来我们看看验证码是怎么实现的,验证码由后端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’])一直相等。所以只要不刷新验证码,将正确验证码的值加入到爆破中即可。


实战验证:

小白入门靶机-Pikachu之暴力破解

只要页面不刷新并且不去点击刷新验证码,那么验证码的值一直都会是初始值,也就是上面的mgzetg,按照第一关的操作即可拿到正确的口令。

小白入门靶机-Pikachu之暴力破解


03

验证码绕过(客户端)


小白入门靶机-Pikachu之暴力破解

源码分析:

小白入门靶机-Pikachu之暴力破解

后端部分只是做了简单的表单验证,没有做任何的过滤措施,也就是第一题的判断逻辑。这里的验证码校验写在前端页面:

小白入门靶机-Pikachu之暴力破解

小白入门靶机-Pikachu之暴力破解


表单提交时前端先做验证,若validate()函数返回值为true,表单才会提交。验证条件即为验证码框里填写的字符串是否和createCode()函数产生的一样。把验证机制交给前端是不安全的,因为数据交互发生在后端。


实战验证

抓包后用第一关相同的操作即可获取正确的用户和密码。

小白入门靶机-Pikachu之暴力破解


04

token防爆破


小白入门靶机-Pikachu之暴力破解

老规矩,先来审一审源码写的到底是些啥东西

小白入门靶机-Pikachu之暴力破解

验证条件为 $_POST[‘token’]== $_SESSION[‘token’],我们看看这两个值是怎么产生的。

小白入门靶机-Pikachu之暴力破解

$_SESSION[‘token’]是加载页面就产生的,通过set_token()函数将$_SESSION[‘token’]赋值为当前的微妙时间+一个五位数的前缀。

小白入门靶机-Pikachu之暴力破解

而$_POST[‘token’]是嵌在前端隐藏的一个input里,$_POST[‘token’]值就等于$_SESSION[‘token’]。由以上可以知道,token是一直变化的,这为爆破提供了难度,但是不管怎样,token值既然已经返回到前端,就可以得到返回的token值进行爆破。


实战验证

随便输个账号密码然后抓包。token爆破还是比较适合运用于知道账号,爆用户的密码。这里我们先假设它的账号是admin吧。

小白入门靶机-Pikachu之暴力破解

抓到包之后将它发送到爆破那里去,注意这里爆破方式要选择 Pitch fork

小白入门靶机-Pikachu之暴力破解

着到option 那里将线程改一下,改成1,因为一个token对应一次爆破

小白入门靶机-Pikachu之暴力破解

小白入门靶机-Pikachu之暴力破解

小白入门靶机-Pikachu之暴力破解

再到grep-extract那里点击add,然后fetch response ,选中token的值burpsuite会帮你自动补齐

小白入门靶机-Pikachu之暴力破解

小白入门靶机-Pikachu之暴力破解

在payload这里,payload1我们选择弱口令top1000就好了,payload2我们选择Recursive grep,然后下面的request填上我们前一次获取到的token,开始爆破

小白入门靶机-Pikachu之暴力破解

我们可以看到,密码已经成功爆破出来了,正是123456。黄色框框也可以分析到,每一次后面的value值都跟下一次的payloads值一样,这样才能保证我们的token对应得上不会报错。


END



这是学渣成长之路的第十一篇文章,其实除了pikachu之外还有很多优秀的入门级靶机项目,比如“DVWA”、“sqli-labs”、“upload-labs”等等。希望这些文章能帮助到正在入门学习web渗透的小伙伴们。


需要靶机的小伙伴公众号回复“00002”

本文始发于微信公众号(学渣成长之路):小白入门靶机-Pikachu之暴力破解

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: