Low
服务器只是验证了参数Login是否被设置,没有任何的防爆破机制,且对参数username、password没有作任何过滤,存在明显的sql注入漏洞。
方法一:bp爆破
直接对爆破密码获得password长度不同凡响,再手工验证登陆成功。
方法二:手工sql注入
admin’ or ’1′=’1
admin’ #
Medium
mysql_escape_string函数会对字符串中的特殊符号进行转义,基本上可以抵御sql注入攻击。可是,依然没有加入有效的防爆破机制(sleep(2)实在算不上)。
和以前同样,bp爆破。
High
加入了Token,能够抵御CSRF攻击,同时也增长了爆破的难度,经过抓包能够看到,登陆验证时提交了四个参数:username、password、Login以及user_token。
每次服务器返回的登录页面中都会包含一个随机的user_token的值,用户每次登陆时都要将 user_token一块儿提交。服务器收到请求后,会优先作token的检查,再进行sql查询。
根据代码能够得知
1.isset函数用来检测变量是否设置,而且不是 NULL。
2.用户能够彻底控制该参数,传参时给Login赋值便可知足条件继续执行。
3. 校验token,每次都须要更新token。
3.用户名部分使用,stripslashes(str)函数去除用户名中出现的反斜线。而后再使用mysqli_real_escape_string(str)函数用户名的特殊符号(\x00,\n,\r,\,‘,“,\x1a)(ascii码0,换行,回车,回退)进行转义,彻底抵抗SQL注入。
4.用户输入的密码将进行md5散列后传递到SQL语句中。
5. 若是密码输错了,则延时0-3秒以后才能再次提交。
网上找到两种方式,一种是用py脚本跑,还有一种也是用burp。
impossible
能够看到Impossible级别的代码加入了可靠的防爆破机制,当检测到频繁的错误登陆后,系统会将帐户锁定,爆破也就没法继续。
同时采用了更为安全的PDO(PHP Data Object)机制防护sql注入,这是由于不能使用PDO扩展自己执行任何数据库操做,而sql注入的关键就是经过破坏sql语句结构执行恶意的sql命令。
关于PDO:http://www.cnblogs.com/pinocchioatbeijing/archive/2012/03/20/2407869.html