SQL注入原理及漏洞利用(入门级)
一、什么是SQL注入漏洞?
攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令,进而实现对后台数据库乃至整个应用系统的入侵。
SQL注入原理
服务端没有过滤用户输入的恶意数据,直接把用户输入的数据当做SQL语句执行,从而影响数据库安全和平台安全。
SQL注入过程
SQL注入带来的危害
绕过登录验证:使用万能密码登录网站后台等
获取敏感数据:获取网站管理员帐号、密码等
文件系统操作:列目录,读取、写入文件等
注册表操作:读取、写入、删除注册表等
执行系统命令:远程执行命令
二、 SQL查询语句
mysql的information_schema数据库表结构如下(schema、schemata :提要)
查数据库名
select schema_name from information_schema.schemata;
查表名
select table_name from information_schema.tables where table_schema='security';
查列名
select column_name from information_schema.columns where table_name= 'users' and table_schema='security';
查数据
select username,password from security.users;
三、SQL注入分类
按照注入点类型分类
数字型(整型)注入
字符型注入
搜索型注入
按照注入技术(执行效果)分类
基于布尔的盲注
基于时间的盲注
基于报错的注入
联合查询注入
堆查询注入
数字型(整型)注入
输入的参数为整数,如ID、年龄、页码等,如果存在注入型漏洞,则为数字型(整型)注入
http://www.testweb.com/user.php?id=8
实际查询代码原型诸如: select ... from ... where id=$id ...
数字型注入测试方法
字符型注入
输入的参数为字符串
与数字型注入的区别在于:字符型注入一般要使用单引号来闭合
http://www.testweb.com/test.php?user=admin
实际查询代码原型诸如:select ... from ... where id='$id' ...
字符型注入测试方法
搜索型注入
这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”,有的不显示链接地址,而是直接通过搜索框表单提交。
此类注入点提交的 SQL 语句,其原型大致为:
select * from 表名 where 字段 like '%关键字%'
当我们提交注入参数为keyword='and[查询条件] and '%'=',则向数据库提交的SQL语句为:
select * from 表名 where 字段 like '%' and [查询条件] and '%'='%
基于布尔的盲注
即可以根据返回页面判断条件真假的注入。
基于时间的盲注
即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
基于报错的注入
即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
联合查询注入
可以使用union的情况下的注入。
堆查询注入
同时执行多条语句的注入。
四、SQL注入漏洞形成原因
◼动态字符串构建引起
不正确的处理转义字符(宽字节注入)
不正确的处理错误(报错泄露信息)
不正确的处理联合查询
不正确的处理多次提交(二次注入)
◼ 后台存在的问题
后台无过滤或者编码用户数据
数据库可以拼接用户传递的恶意代码
◼错误处理不当
详细的内部错误消息显示给用户或攻击者
错误信息可以直接给攻击者提供下一步攻击帮助
◼不安全的数据库配置
默认账户:
SQL Ser ver“sa”作为数据库系统管理员账户;
MySQL使用“root”和“anonymous”用户账户;
Oracle则在创建数据库时通常默认会创建SYS、SYSTEMS DBSNMP和OUTLN账户。
权限:
问题:系统和数据库管理员在安装数据库服务器时允许以roots SYSTEM或Administrator特权系统用户账户身份执行操作。
正确方法:应该始终以普通用户身份运行服务器上的服务,降低用户权限,将用户权限只限于本服务。