SQL注入简介
SQL 注入(SQL Injection)是一种常见的网络安全漏洞攻击手段,攻击者通过在应用程序的输入字段中插入恶意的 SQL 代码,从而改变原本 SQL 语句的结构和逻辑,以此来绕过应用程序的安全验证机制,非法获取、修改或删除数据库中的数据,甚至控制数据库服务器。
SQL注入主要原因是程序员在开发用户和数据库的程序时没有对用户输入的字符串进行过滤、转义、限制或处理不严谨,导致攻击者可以通过精心构造的字符串去非法获取到数据库中的数据。
SQL注入原理
SQL注入漏洞的产生需要满足以下两个条件:
参数用户可控:前端传给后端的参数内容是用户可以控制的。
参数带入数据库查询:传入的参数拼接到SQL语句,且带入参数库查询。
SQL注入示例
用户进行登录是会进行登陆验证,我们有一个user表进行用户信息的匹配验证,在用户不进行任何防护措施的情况下很容易被SQL注入。
-- 这是正常用户登录时的验证sql
select count(1) from user where userName = '***' and passwd= '***';
-- sql注入攻击者的sql,其输入的用户账号为`' or '1'='1'--`
select count(1) from user where userName = '' or '1'='1'--' and passwd= '***';由上述sql语句可知攻击者运用web程序的漏洞绕过登录验证, 直接登录了进去。
SQL
SQL注入最重要的就是我们了解并会使用SQL语句,并了解各种不同类型数据库的具体差异。例如关系型数据库(MySQL、SQL Server、MSSQL、Oracle)和非关系型数据库(例如MongoDB)的注入方式就大相径庭。而同一类型数据库的数据库也略有不同,例如SQL Server中可以使用select 1,2,3来测试当前表的列数,而Oracle必须使用select 1,2,3 from dual。
同时前端页面的提交方式都会影响SQL的注入方式和难度,例如对于GET提交方式,注入者可能直接在URL中插入恶意SQL语句。而对于POST提交方式,注入者则可能需要通过抓包工具来修改POST数据,进而插入恶意SQL语句。
注入类型
这只是一个很简单的案例,sql注入分很多种方式,其中大致分为有回显注入和无回显注入,有回显注入就是能看到注入的结果,无回显注入就是看不到注入结果。
有回显注入分为基于UNION联合查询的注入、报错注入、堆叠注入等。
无回显注入分为布尔盲注、时间盲注(延时盲注)等。
WAF绕过
WAF英文名叫Web Application Firewall,翻译过来就是网页应用防火墙,类似Windows上面的防火墙,只不过是针对Web应用的,而WAF绕过顾名思义就是通过某些技术手段,规避防火墙的安全检测,从而达到访问或攻击被保护资源的目的。
绕过方式具体分为更改提交方式和数据变异等方式。
加密与解密
数据库中很多重要信息为了保证安全性都会使用各种加密算法进行加密,我们也要了解各种加密算法的加密方式和原理,有助于我们更好的攻破对方的防护网。同时了解加密原理也有助于我们理解WAF的工作机制。
防御措施
采用参数化查询先进行预编译语句
对用户输入信息进行输入验证
数据库用户只赋予必要权限
使用ORM框架来编写SQL操作部分的代码
使用WAF来检测和阻止SQL注入攻击
定期进行安全检查和安全测试
结语
我们学习SQL注入是为了保障数据库的安全,了解攻击者的各种攻击方式,从而更好的应对和防范潜在的安全威胁。