SQL注入之简要详解(漏洞原因、漏洞危害、漏洞利用、漏洞防范、安全修复等)
SQL注入的漏洞原因
程序在开发过程中,由于不重视代码的书写规范,对Sql关键字没有进行严格的过滤,导致用户可以通过POST或者GET请求提交Sql语句到数据库中,从而构建特定的恶意语句来查询数据库中的信息。SQL注入的原理是通过把SQL命令插入到Web表单递交或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL语句。
总的来说,SQL注入已经存在很长一段时间了,为什么没有被有效的防范,其中一个原因就是,很多程序在编写过程中,并没有重视代码的安全,从而导致SQL注入的发生。至今SQL注入仍然是一个头疼的问题,它的危害远不止可以查询数据库信息那么简单,还可以Getshell。
漏洞危害
1、盗取用户的隐私数据、商业机密,导致企业和客户的信息泄露。
2、攻击者可以利用数据库的命令进行”增删改查”,篡改数据库中的信息。
3、修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
4、攻击者可以在数据库中添加管理员账号,导致后台被非法登录。
SQL注入的修复建议:
最关键的一点就是,我们应该提高开发人员的安全意识,许多针对web的攻击,都是由于开发人员安全意识薄弱造成的。其次,我们可以通过各种技术手段,防御SQL注入,例如用户权限管理、参数传值、使用安全参数、漏洞扫描、多层验证、数据库信息加密等等。
还有另一种方式,在服务器上添加WAF(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF),WAF可以有效的防御SQL注入带来的危害。这里说一句凡是都是有两面性的,并不是说有WAF就可以万事无忧了,现在市面上的很多WAF还是有一些存在被绕过的风险,想要避免SQL注入的危害,还是得从我们自身上去下功夫,提高安全意识。
漏洞利用
SQL注入的漏洞利用呢,需要从很多方面去讲,比如,通过网站url中的传参、登录框、Header头、cookie等等。
这里我就讲讲最常见的GET和POST请求的注入方式,分别是:url中的传参、登录框
url中的传参
很多网站的url页面中,会出现id或者uid的字样,它们属于GET请求,我们可以通过修改url栏中的id值去判断这个网站是否存在SQL注入,但是能修改id值的地方也不完全都会存在漏洞,想要找到一个SQL注入的漏洞需要的是耐心。
登录框
一般人会觉得登录框和SQL注入有关系吗?有关系,我们登录时会执行POST请求,与GET请求不同,传给服务器的值不会在URL中出现,而是在请求体里,当服务器拿到请求体的数据,再执行SQL语句,可以查询是否存在用户输入的用户名和密码。
漏洞防范
1、设置黑白名单:将常用请求设置为白名单,一些攻击频繁的行为限制其为黑名单,可以通过WAF来进行实现,市面上的WAF可以针对攻击类型把对方ip进行封禁处理,也可以对常用ip进行加白处置。
2、限制url的查询长度和类型:由于在SQL注入过程中需要构造较长的SQL语句,同时有些不常用的查询类型我们可以进行限制使用,凡是不符合该类请求的都归结于非法请求予以限制。
3、数据库用户的权限配置:根据程序要求为特定的表设置特定的权限,实现权限分离,对某表只需具备select权限即可,这样即使程序存在问题,攻击者也无法对表进行update或insert等写入操作。
4、限制目录权限:服务器管理员还应在IIS中为每个网站设置好执行权限,Web目录应至少遵循”可写目录不可执行,可执行目录不可写”的原则,在此基础上,对各目录进行必要的权限细化。
安全修复
主要分为:应用层防御、系统层防御、数据库层防御三种
应用层防御
1、应用层防御的目标
(1)SQL注入的本质是用户输入的数据被当做数据库代码去执行。
(2)SQL注入应用层防御的目标是修复SQL所有可能存在的漏洞,做好事前的防范,定期对网站进行漏洞扫描,安装WAF可以有效的防治SQL注入带来的危害。
2、过滤SQL注入基本字符
’ 或者 “ :字符串闭合
– 或者 # :单行注释
// :多行注释
+:加号,URL中替换空格拼接字符
concat :字符拼接
% :通配符
?Param1=foo&Param2=bar :url参数
select :url打印常量等
@variable :本地变量
@@variable:全局变量
sleep 10:睡眠10秒
URL传参的整体加密:对特定的url传参进行加密,让url中的请求不会被攻击者利用。
系统层防御
1、系统层防御的目标
(1)SQL注入的本质原因不是由系统层的问题
(2)系统层的防御是辅助的作用,是预防SQL注入与系统层交互提权,预防SQL注入权限的进一步扩大,使得SQL注入在系统层无所作为。
2、系统层防御的方法
(1)iptables限制只允许特定的服务器ip和端口登录。
(2)使用web应用防火墙对SQL注入拒绝访问。
(3)数据库安全中间件,如greenSQL等。
数据库层防御
1、数据库层防御目标
(1)SQL注入的本质原因并不是数据层的问题
(2)数据库层防御的目标是辅助性的,预防SQL注入在数据层交互提权,防止SQL注入成功后权限和数据泄露进一步扩大。
2、SQL权限的最小化原则
(1)程序连接的权限分配以最小化为原则。
(2)如大多数据程序连接都是以select,insert,update和delete权限,那么就只给这些权限。对于读取系统层文件所需要的File权限就没有,这样,系统层交互提权的路径就被堵上了,使得SQL注入不能直接危害到我们的服务器。