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抓包,通过字典爆破用户名与密码。
略.......
欢迎关注公众号