醉梦半醒的博客

sql注入与防御1(mysqli_real_escape_string)

字数统计: 452阅读时长: 1 min
2018/08/03 Share

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即可绕过:

<!– payload:
you input username is:1′ union select 1,2,3,4,5,6#
you input password is:6
correct password is:6
Login success! –>

 

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页中也讲到这个函数问题:

CATALOG