广告
返回顶部
首页 > 资讯 > 精选 >报表的SQL植入的概念
  • 343
分享到

报表的SQL植入的概念

2023-06-02 17:06:46 343人浏览 薄情痞子
摘要

这篇文章主要介绍“报表的sql植入的概念”,在日常操作中,相信很多人在报表的SQL植入的概念问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”报表的SQL植入的概念”的疑惑有所帮助!接下来,请跟着小编一起来学习吧

这篇文章主要介绍“报表的sql植入的概念”,在日常操作中,相信很多人在报表的SQL植入的概念问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”报表的SQL植入的概念”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

SQL 植入的概念

首先,认识一下什么是 sql 植入?

Sql 植入也常被叫做 SQL 注入,具体的做法是通过把 SQL 命令插入到 WEB 表单项或页面请求(Url)的查询字符串中提交,最终达到欺骗服务器执行恶意操作的目的。

常见案例包括通过植入 SQL 骗过登录验证。而之前很多影视网站泄露 VIP 会员密码的事件,很多就是通过 sql 植入到 WEB 表单暴出的,并且这类表单特别容易受到攻击。通过 SQL 植入,不仅可以非法获取账号信息,严重的还能够篡改、删除重要数据信息。

为什么存在 SQL 植入呢?

知道了 sql 植入的概念,我们也应该了解为什么会出现 SQL 植入,问题出现在哪个环节?

报表的SQL植入的概念

上图是一个最简单的三层架构的应用结构,包括业务展现层、 数据处理层、数据源。也可以理解成我们常说的前端、后台、后台数据源。

其中,数据源里有个叫数据库的东西,这是最常见的数据管理和存储方式,而关系型数据库那就更常见了,比如 oracle、db2、mysql 等。

开发的应用(数据处理层,也就是后台)为了和操作数据库(增删改查),必须和数据库之间有交流的接口,例如 jdbc 或 odbc,这对于技术人员或是 IT 销售人员也是耳熟能详的。

对于数据库的操作,尤其关系型的,普遍使用的就是 sql 语言。SQL 是一种高级的非过程化语言,只描述做什么而不需要告诉数据库怎么做。 SQL 脚本通过 api 以字符串方式传入数据库,数据库收到 sql 后只管执行然后将结果返回。对于数据库本身来说,它是不知道传来的 sql 是合法还是不合法的,而正是这种完全的信任,导致出现了 sql 植入的风险。

归根结底,SQL 植入利用了应用程序的漏洞,如果编写数据处理的代码时没有充分考虑 sql 植入风险,攻击者将很容易将 sql 命令植入后台数据库引擎执行。而这些不是按照设计者或开发者的意图去执行的 sql 命令都会被视为恶意代码。

如何攻击?

了解了 sql 植入攻击的基本原理,我们就来看看具体怎么攻击。多种多样的攻击方式中比较常见的包括:

特殊的输入参数

未处理特殊字符“–”、“#”

利用不合理的数据库配置

案例 1、特殊的输入参数

常见的如 uNIOn 或 or,这是 sql 内的关键字,一个用作多 sql 的归并,另一个则常用在 where 条件中。

以 Union 为例,如果攻击者在一条正常可执行的 sql 后,通过猜表名的方式拼入“union select … from user”,那么 user 表信息就完全暴露了。

Or 呢?可以使得 where 条件变的恒真,以“骗过登录验证”为例:

在程序中我们一般拼 sql 为:strSQL = “SELECT * FROM users WHERE userID = ’” + userID + “’ and pw = ’”+ passWord +“’;”

如果此时 userID 传入 1 or 1=1 ,passWord 传入 ‘1’ or 1=1, 完整的 strSQL 就变成了:“SELECT * FROM users WHERE userID=1 OR 1=1 and pw =’ 1’ OR 1=1;”

很显然,where 条件变为恒真,也就成功骗过了验证,登录进了系统。

案例 2、未处理特殊字符

以常用的注释符“–” 为例:一般的数据库均采用其作为注释符。另外,Mysql 还支持“#”注释。

接下来看注释符怎么骗过登录验证。

程序 sql 依然定义为:strSQL = “select * from users where userID=”+userID+“and password=”+psw

此时 userID 传入:’’ or 1=1 –

完整 sql 则拼为:select * from users where userID=’’ or 1=1 – and password = …

“–”之后的脚本作为注释不再执行,实际条件也成了恒真,成功骗过验证,侵入系统。

对于 mysql 数据库,把“–”改为“#”同样可以实现注入。

案例 3、利用不合理的数据库配置

常见的是权限配置不合理、过高,就会有 update 和 delele 甚至 drop 表的风险。

因此建议,“永远”不要使用管理员权限连接数据库,而应该为每个应用使用单独的、权限有限的数据库连接。    

报表和 SQL 植入有啥关系?

由于大多数报表工具都会提供参数功能,根据用户输入的查询条件来筛选合适的数据,因此就给 SQL 植入提供了可乘之机。

报表的SQL植入的概念

例如,如果希望查询指定时间段的数据,可以把时间段作为参数传递给报表,报表在从数据库中取数时将这些参数拼接到取数 SQL 的 WHERE 条件上,就可以根据不同参数取出不同数据来进行呈现了。这种方式要求事先把查询条件做死,也就是固定了对应的条件字段。 比如下面这种传统做法:

sql:select * from t where date>=? and date<=?

这个 SQL 定义的数据集专用于按时间段查询,如果想用地区查询就不行了,需要再做一个 area=? 的查询条件或报表。显然非常麻烦……

如果报表工具只支持这种普通用法,自然不够灵活,可能就会限制报表工具的功能,于是“通用查询”这个大招儿就出现了。

报表工具提供了一种特殊的字符串型参数,允许应用其直接替换 SQL 的某一部分,比如 WHERE 子句。界面端则根据用户的输入拼出合法的 SQL 条件串,作为参数传递给报表替换现有 SQL 的 WHERE 子句,这样就可以在同一张报表上实现不同形式的查询条件了。比如数据集的 SQL 可以写成:

SELECT … FROM T WHERE ${Mac}

其中 ${mac} 就是将来会被参数 mac 替换的内容。按时间段查询时,可以把 mac 拼成 date>… AND data <=…,按地区查询时则拼成 area=…;当然还可以混合多条件查询拼成 data>… AND date<=… AND area=…;而无条件时则拼成一个永远为真的条件 1=1。

是的,这非常灵活了。

But,带来了灵活性的同时也带来了 sql 植入的风险……可能的植入风险及基于 sql 的规避方法请研读此文章: 报表工具的 SQL 植入风险 ](Http://c.raqsoft.com.cn/article/1535513599294)。(报表与 sql 植入的关系,也引自此文。)

报表工具规避 SQL 植入

上面的内容以及所链接的文章介绍了通过 sql 本身的一些限制来防止 sql 注入,那么报表工具能不能也提供一些方法呢?比如著名的润乾报表。

答案肯定是有的。

目前,报表工具一般都会提供敏感词检查,当传进来的替换子句中包含某些特定词时将被拒绝,比如很少有人会用 select,from union 这些 SQL 关键字作为字段名,那么,我们可以首先判断一下替换子句中是否包含有 select,from 这些词,如果有就可以认为受到攻击并拒绝执行。这样做肯定会牺牲一点灵活性,例如有时传进来的子句万一真的会含有这些关键字,不过这种情况相对少见,在获得了较好的安全性的同时,损失的灵活性可以接受。

下面我们就看一下,润乾报表里具体怎么用这种方法?

两种方式:

raqsoftConfig.xml 配置需要检查的敏感词列表

该方法是由产品提供的方法,配置好敏感词列表后,报表计算时首先会对每个参数值逐一检查,一旦发现检查不通过的情况,报表不再继续执行,并返回错误信息。

配置如

报表的SQL植入的概念

属性名:disallowedParmWordList,value 为禁用敏感词列表,多个之间用逗号分隔,英文字母不区分大小写。

这个方式用起来很简单,直接改配置,实施或维护人员就能简单操作。

如访问 Url:http://localhost:6868/demo/reportjsp/showReport.jsp?rpx=a.rpx&ar g2= 华北 union select * from users,其中红色部分为通过参数 arg2 植入的 sql

此时会报错,报表数据集(sql)不会再执行。

报表的SQL植入的概念

自定义参数检查类

对应方法 1,更为灵活。

(1)对所有参数值检查,代替方法 1

(2)针对某些指定的参数进行检查

(3)错误信息可自定义

public class … implements IParamChecker {

    // 校验不通过返回 false,提供 paramName 以便用户只检查某种形式的参数

    public boolean check(String s, String s1) {

        //s 为报表–参数内,定义的参数名;s1 为报表接收到的对应 s 的参数值

        return false;

    }

    // 检验不通过是可获取详细信息

    public String getCause() {

        return “错误信息”;

    }

}

接口为 IParamChecker,两个方法:check()为检查实现,getCause() 负责返回错误信息。

下面是介绍使用方法的简单代码示例:

(1)实现自定义类

A、对所有参数值检查

public class ResistSQLInject implements IParamChecker {

    private String cause = "";

    private List wordList = new ArrayList();

    public boolean check(String paramName, String inputValue) {

        if(inputValue == null || inputValue.length() == 0){// 如果参数值为空,则无需检查

            return true;

        }

        if(wordList == null){ // 如果检测关键字列表是空,则不作检查

            return true;

        }

for(int i = 0; i < wordList.size(); i++){

            inputValue = inputValue.toLowerCase();// 这里做,是为了不区分大小写

            if(inputValue.indexOf(wordList.get(i).toLowerCase())>= 0){       

                return false;

            }

        }

        return true;

    }  

    public String getCause() {

        String tmp = this.cause;

        this.cause = "";

        return tmp;

    }

}

B、针对某些参数检查

 private String cause = "";

    private List wordList = new ArrayList();

    

    public boolean check(String paramName, String inputValue) {

        //wordList.add(“select”);

        if(wordList == null){ // 如果检测关键字列表是空,则不作检查

            return true;

        }

        if(paramName==“userID”){

            if(inputValue == null || inputValue.length() == 0){// 如果参数值为空,则无需检查

                return true;

            }

            for(int i = 0; i < wordList.size(); i++){

                inputValue = inputValue.toLowerCase();// 这里做,是为了不区分大小写

                if(inputValue.indexOf(wordList.get(i).toLowerCase())>= 0){

                    StringBuffer sb = new StringBuffer();

                    sb.append(“校验未通过,”).append(paramName).append(“参数中含有以下词汇:”).append(wordList.get(i))

                            .append(“\n 位置:”).append(inputValue.indexOf(wordList.get(i).toLowerCase()));

                    this.cause = sb.toString();

                    return false;

                }

            }

        }

        return true;

    }

C、自定义错误信息

public boolean check(String paramName, String inputValue) {

        //wordList.add(“select”);

        if(wordList == null){ // 如果检测关键字列表是空,则不作检查

            return true;

        }

        if(inputValue == null || inputValue.length() == 0){// 如果参数值为空,则无需检查

            return true;

        }

        for(int i = 0; i < wordList.size(); i++){

            inputValue = inputValue.toLowerCase();// 这里做,是为了不区分大小写

            if(inputValue.indexOf(wordList.get(i).toLowerCase())>= 0){

StringBuffer sb = new StringBuffer();

                sb.append(“参数:”).append(paramName).append(“检查未通过,”).append(“含有以下敏感词汇:”).append(wordList.get(i))

                        .append(“。\n 谨记:\n”).append(“道路千万条 \n 规范第一条 \n 数据不规范 \n 亲人两行泪”);

                this.cause = sb.toString();

                return false;

            }

        }

        return true;

    }

(2)配置自定义类

xml(raqsoftConfig.xml):

paramCheckClass 设置参数值校验的类路径

报表的SQL植入的概念

自定义错误信息的效果:

访问 URL:http://localhost:6868/demo/reportJsp/showReport.jsp?rpx=a.rpx&arg2= 华北union select * from users

报表的SQL植入的概念

到此,关于“报表的SQL植入的概念”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 报表的SQL植入的概念

本文链接: https://www.lsjlt.com/news/230664.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 报表的SQL植入的概念
    这篇文章主要介绍“报表的SQL植入的概念”,在日常操作中,相信很多人在报表的SQL植入的概念问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”报表的SQL植入的概念”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-02
  • 报表检测出 sql 植入风险怎么解决
    报表检测到 sql 植入风险,一般是报表工具提供了通用查询的功能,也就意味着 sql(sql 类数据集)是可以通过参数动态拼接的。如 where 子句: Select … from T where ${w} ...
    99+
    2021-08-02
    报表检测出 sql 植入风险怎么解决
  • 报表检测出sql植入风险该怎么解决
    这期内容当中小编将会给大家带来有关报表检测出sql植入风险该怎么解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Select … from T where ${w}正常使用下 w 可...
    99+
    2023-06-03
  • Java的输入输出流的概念
    本篇内容主要讲解“Java的输入输出流的概念”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java的输入输出流的概念”吧!Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出...
    99+
    2023-06-17
  • SQL之Mysql事务的概念与应用
    代码分享:https://github.com/mtdgclub/PDO 具体查看根目录下的pdoAffair.php文件代码 2. 事务的四大特性 原子性:事务必须是一个不可分割的整体,要么做完,要么不做。 一致性:事务...
    99+
    2014-05-05
    SQL之Mysql事务的概念与应用
  • oracle表分区的概念及操作
    oracle表分区详解 1.表空间及分区表的概念 表空间:   是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间。 分区表: 当表...
    99+
    2022-11-12
  • 什么是SQLServer表的基本概念
    什么是SQLServer表的基本概念,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。SQLServer表的基本概念  表是包含数...
    99+
    2022-10-19
  • SQL Server中的子查询和表链接概念及使用是什么
    SQL Server中的子查询和表链接概念及使用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.子查询概念 ...
    99+
    2022-10-19
  • Angular中依赖注入的概念分析
    这篇文章主要为大家展示了“Angular中依赖注入的概念分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Angular中依赖注入的概念分析”这篇文章吧。依赖注...
    99+
    2022-10-19
  • JS函数表达式的基本概念
    本篇内容主要讲解“JS函数表达式的基本概念”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS函数表达式的基本概念”吧!函数表达式的基本概念name属性和函数提升...
    99+
    2022-10-19
  • 数据库入门必知的基本概念
    数据库的基本概念: 动态网站开发离不开数据存储,数据存储离不开数据库,数据库技术是计算机技术中的重要部分,在软件开发等领域起着至关重要的作用。所谓数据库,可以理解为用来存储信息的仓库。而信息就是要存储下来的...
    99+
    2022-10-18
  • Python 中的输入函数:概念和示例
    Python 是世界上最流行的编程语言之一,广泛应用于各种应用程序中。Python 中的一个基本概念是 ​​input()​​ 函数,它允许用户通过提供输入值与程序进行交互。让我们看看 ​​input()​​ 函数是如何工作的,以及如何在 ...
    99+
    2023-05-14
    Python
  • Java由浅入深分析多态的概念
    目录1.多态的概念2.向上转型2.1概念2.2常见的向上转型的形式3.重写3.1重写的注意事项在结束继承内容之后便是多态,这同样也是面向对象程序的特性 有一点需要说明:为方便演示,所...
    99+
    2022-11-13
  • SQL与NoSQL数据库二者的概念与区别
    这篇文章主要介绍“SQL与NoSQL数据库二者的概念与区别”,在日常操作中,相信很多人在SQL与NoSQL数据库二者的概念与区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2022-10-18
  • MySQL表空间碎片的概念是什么
    这篇文章主要介绍MySQL表空间碎片的概念是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!背景经常使用 MySQL 的话,会发现 MySQL 数据文件的磁盘空间一般会不停的增长,而且有时候删了数据或者插入一批数据...
    99+
    2023-06-14
  • C++深入探究继承的概念与使用
    目录1、概念及定义1.1 概念1.2 定义2、class与struct的区别3、赋值兼容规则4、继承中的作用域问题5、派生类(子类)的默认成员函数5.1 构造函数5.2 拷贝构造函数...
    99+
    2022-11-13
  • 深入 JavaScript需要掌握的概念有哪些
    本篇文章为大家展示了深入 JavaScript需要掌握的概念有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。你可能会经常听到一些人在抱怨 JS 很奇怪,有时甚至...
    99+
    2022-10-19
  • 浅谈mysql中各种表空间(tablespaces)的概念
    mysql中,会涉及到各种表空间的概念,虽然,很多方面这些概念和Oracle有相似性,但也有很多不同的地方,初学者很容易被这些概念弄的晕头转向,从而,混淆这些概念的区别和理解,下面,就简要介绍和说明一下这些...
    99+
    2022-10-18
  • python模块的概念是什么及怎么导入
    这篇文章主要介绍了python模块的概念是什么及怎么导入的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python模块的概念是什么及怎么导入文章都会有所收获,下面我们一起来看看吧。概念在Python中,每个Py...
    99+
    2023-06-30
  • 程序员必须清楚的高级SQL概念有哪些
    本篇内容介绍了“程序员必须清楚的高级SQL概念有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.常见表表达式(CTEs)如果您想要查询...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作