sql注入一种常见的网络攻击手段,以前没学php的时候只会一点mysql的语言,万能密码啥的绕过,防御只了解过pdo,手工注入更是弱爆,直接sqlmap注入,现在学了php后,有了一个全新的认识
油管大佬介绍了利用mysqli_real_escape_string这个函数来防御SQL注入:(https://youtu.be/nTgFPcYRkys)
函数介绍:(http://www.w3school.com.cn/php/func_mysql_real_escape_string.asp)
于是我专门实验了万能密码的绕过
先在我的数据库创建一张表:
撸上我的代码:
看到我没有对输入的参数进行任何的过滤
在user_id里随便输例如:test,在user_pwd里输入’ or 1=1 #
看到把所有的user_first都脱出来了
进行代码修整:
防御成功了(sqlmap亦可证明)
做了一个登录的页面,从数据库里查询出用户名对应的密码,然后去和用户输入的密码进行比较(mysqli_real_escape_string可防御):
用union select即可绕过:
1 | you input username is:1′ union select 1,2,3,4,5,6# |
2018/8/5 update:
去瞄了下dvwa的php源码,在medium级别中,mysqli_real_escape_string不是万能的,由于是数字型注入,服务器端的mysql_real_escape_string函数就形同虚设了,因为数字型注入并不需要借助引号。
比如说select * from users where user_id=$variable;
(注意,user_id是数字型的,可不需要加引号,如果是字符型的,比如说select * from users where user_uid=’$variable’,则必须加引号,在此是属于字符型注入)
$variable=1 or 1=1# 那么mysql_real_escape_string函数就形同虚设了
参考(http://www.freebuf.com/articles/web/120747.html)
在<白帽子讲web安全>170页中也讲到这个函数问题: