代码审计——BruteForce

Low级别:

源码:

1.首先通过isset()函数判断是否接收到了GET型的Login的值,接收到了代表用户提交了数据.

isset()函数在实际开发中,isset()通常用于快速检查某个变量是否存在或为空,并且可以帮助避免一些未定义变量引起的错误。

2.接着通过$user和$pass接收了传过来的账号密码,并且对密码进行了md5加密

3.接着往下看查询语句,发现从接收$user和$pass参数到拼接进SQL语句的整个过程,没有做任何的防治措施
因此我们猜测这里可能存在SQL注入漏洞,并且漏洞点在账号这里,因为密码进行了md5加密,无法利用


4.因为是在表单里的SQL注入漏洞,我们可以尝试构造万能密码来绕过登陆验证
在账号处输入payload进行测试:admin' or '1' = '1
可以看到直接登陆成功了

 

5.我们接着看剩下的代码,如果提交数据和数据库查询的数据一致就输出一张图片和一段欢迎的文本,否则就提示错误,也没有做任何防止暴力破解的操作


Medium级别:

源码:


1.首先可以看到,和Low级别一样在判断是否提交数据时,依然只判断了一个Login值
接着可以看到,使用了mysqli_real_escape_string()函数对$user和$pass参数进行特殊字符转义 

受影响的字符有:\x00、\n、\r、\、'、"、\x1a

并且的$pass参数进行了进行了md5加密,这里我们就无法进行SQL注入了
除非当前页面满足宽字节注入的条件,可以通过宽字节注入绕过mysqli_real_escape_string()函数
2.接着将$user和$pass参数直接带入SQL语句进行执行如果在数据库中存在对应的账号密码就,输出登陆提示,并输出一张图片
如果不存在就执行Sleep(2)延迟两秒后输出,账号或密码错误的提示
整个过程没有任何防止暴力破解的措施,这里延迟两秒输出只会影响爆破的速度


High级别:

源码:
1.首先在数据是否提交时依然只验证了一个Login值
接着使用checkToken()函数验证Token值,本级别加入了Token的验证,可以防止无脑爆破的情况


2.接着在使用stripslashes()函数对$user和$pass参数进行去除反斜杠\的操作,再经过一道mysqli_real_escape_string()函数的过滤

stripslashes()函数是PHP中的一个内置字符串处理函数,用于去除反斜线“\”所添加的转义效果

<?php

$str = "I\'m a \"developer\".";

// 添加转义后的字符串:I\'m a "developer".

echo $str . "<br>";

// 通过stripslashes()函数去除反斜线后输出原始字符串

echo stripslashes($str);

// 输出:I'm a "developer".

?>

如上代码所示,首先定义了一个包含引号和反斜线的字符串,然后通过echo语句输出,会发现其中所有的引号和反斜线都被保留了下来,这种情况下不利于页面内容的展示和用户体验。

接着使用stripslashes()函数对字符串进行处理,得到原始字符串并输出。在原始字符串中,所有的转义字符都已经被还原成为了正常字符,从而更加符合显示的需求。

总之,stripslashes()函数是一种常用的字符串处理函数,它可以帮助开发人员快速去除反斜线转义所带来的影响,从而更好地满足数据显示和交互需求。

Impossible级别:

源码:
1.可以看到和其他三个级别不同的是,这里在判断数据是否提交时,使用了POST方法,防止了数据在传输过程中泄露的风险,并且验证了Login、username、password三个参数的值,比起之前的验证提交,更为严谨
接着使用checkToken()函数进行了Token的验证,有效防止了无脑爆破
并且使用stripslashes()和mysqli_real_escape_string()函数
对传入的$user和$pass参数进行过滤和转义,有效的防止了简单的SQL注入


2.接着做了一个登陆限制,当前用户登陆失败次数大于等于3次时就会锁定账户15分钟
有效的防止了暴力破解


3.接着使用PHP的PDO技术对传入的参数进行预编译和绑定参数操作,有效的防止了SQL注入
当然,在某些PDO未正确配置的情况下,并且满足宽字节注入的条件,依然可能存在宽字节注入,但是这里还有账户锁定要想利用的话也很困难,参考链接
从宽字节注入认识PDO的原理和正确使用 - FreeBuf网络安全行业门户


4.接着验证账户是否存在,如果存在则更新账户登陆失败次数为0,并且输出成功的提示和图片
如果登陆失败则延迟2到4秒后,输出登陆失败的提示,更新登陆失败次数+1,最后再将当前时间更新为最后登陆时间然后生成新的Token

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值