SQL注入攻击,简称注入攻击、SQL注入,就是在web程序中非法执行了SQL语句,从而可以获取、修改、删除数据库里的敏感信息,有可能获取网站管理员账号密码,从而获取网站管理权限,进而在网站主机上上传后门、木马获取整个主机权限。
SQL注入发生的位置包括:
1、表单提交,主要是POST请求,也包括GET请求;
2、URL参数提交,主要为GET请求参数;
3、Cookie参数提交;
4、HTTP请求头部的一些可修改的值,比如Referer、User_Agent等;
以上我们可以通过抓包工具抓取的数据包,来直观的显示注入发生的位置:
主要防御方法:
1、所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。当前几乎所有的数据库系统都提供了参数化SQL语句执行接口,使用此接口可以非常有效的防止SQL注入攻击。
2、对进入数据库的特殊字符(’”<>&*;等)进行转义处理,或编码转换。
3、确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。
4、数据长度应该严格规定,能在一定程度上防止比较长的SQL注入语句无法正确执行。
5、网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过。
6、严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。
7、避免网站显示SQL错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
8、在网站发布之前建议使用一些专业的SQL注入检测工具进行检测,及时修补这些SQL注入漏洞。
实战SQL注入攻击:
下图是用sqlmap测试出来存在SQL注入漏洞网站反馈的敏感信息:
存在注入的参数为:ID,方法:GET,注入类型:基于布尔的盲注,还有payload:ID=22 AND 2907=2907,数据库类型:Microsoft Access
破解出数据库所有4个表名信息
破解出admin表里的所有6个字段名信息
破解出username和password2个字段的内容信息,username:admin,password:红线隐藏
可见,SQL注入漏洞导致攻击者获取了管理员admin的登录信息,从而获取了管理员权限,可进一步获取网站其他敏感信息。
没有网络安全,就没有国家安全。