pikachu靶场第一关-密码爆破之基于表单的暴力破解(附代码审计)

Burte Force(暴力破解)概述

    “暴力破解”是一攻击具手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。 为了提高效率,暴力破解一般会使用带有字典的工具来进行自动化操作。

    理论上来说,大多数系统都是可以被暴力破解的,只要攻击者有足够强大的计算能力和时间,所以断定一个系统是否存在暴力破解漏洞,其条件也不是绝对的。 我们说一个web应用系统存在暴力破解漏洞,一般是指该web应用系统没有采用或者采用了比较弱的认证安全策略,导致其被暴力破解的“可能性”变的比较高。 这里的认证安全策略, 包括:

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

 千万不要小看暴力破解漏洞,往往这种简单粗暴的攻击方式带来的效果是超出预期的!

pass1:基于表单的暴力破解

关键源码如下:

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>';
    }

}

第一行:

isset($_POST['submit']) && $_POST['username'] && $_POST['password']

isset() 函数可以检测「变量是否存在」并非NULL。常用来判断变量是否被定义,以避免变量未定义而报错。

isset() 返回一个布尔类型的值。

isset($_POST['submit'])

这里的作用很简单,只是判断login按键是否输入,若是输入则返回true,未输入则返回false

&&是在编程中使用的一种符号。是逻辑(条件)与。

1&&1=1

1&&0=0

0&&0=0

该行函数的意思即为,当login按下,username和password中有值时,执行if();

$username = $_POST['username'];

将输入的username赋值给username函数;

 $password = $_POST['password'];

将输入的password赋值给password函数;

$sql = "select * from users where username=? and password=md5(?)";

定义sql函数为select * from users where username=? and password=md5(?)

意思是在users表中查找所有内容,找出里面username为?,以及password为进行md5加密后的?。

$line_pre = $link->prepare($sql);

【->】符号是“插入式解引用操作符”。换句话说,它用来调用由引用传递参数的子程序的方法

SQL预处理(Prepare),是一种特殊的 SQL 处理方式;预处理不会直接执行 SQL 语句,而是先将 SQL 语句编译,生成执行计划,然后通过 Execute 命令携带 SQL 参数执行 SQL 语句。

该行代码将sql函数进行编译后赋值给了line_pre函数。

$line_pre->bind_param('ss',$username,$password);
bind_param('ss',$username,$password)

该函数绑定了 SQL 的参数,且告诉数据库参数的值。 "ss" 参数列处理其余参数的数据类型。s 字符告诉数据库该参数为字符串。

i - integer(整型)
d - double(双精度浮点型)
s - string(字符串)
b - BLOB(布尔值)

代码执行后,line_pre的值变成了“select * from users where username=$username and password=md5($password)”

$line_pre->execute()

通过 Execute 命令携带 SQL 参数执行 SQL 语句

即执行select * from users where username=$username and password=md5($password)

 if($line_pre->execute())

调用if();

执行成功:

$line_pre->store_result();

store_result()存储查询结果到结果集中

if($line_pre->num_rows>0)

num_rows :结果集中的数量,用于判断是否查询到结果

 $html.= '<p> login success</p>';

查询到结果,则返回“login success”

 else{ $html.= '<p> username or password is not exists~</p>';}

未查询到结果,则返回“username or password is not exists~”

 else{ $html.= '<p>执行错误:'.$line_pre->errno.'错误信息:'.$line_pre->error.'</p>';}

这是通过 Execute 命令携带 SQL 参数执行 SQL 语句失败后执行的代码。

通关攻略:

burp抓包,通过字典爆破用户名与密码。

略.......

欢迎关注公众号

  • 26
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hacker苏序

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值