SQL注入是当前针对数据库安全进行外部攻击的一种常见手段。现有主流应用大多基于B/S架构开发,SQL注入的攻击方式正是利用web层和通讯层的缺陷对数据库进行外部恶意攻击。将SQL命令巧妙的插入通讯的交互过程中,如:Web表单的递交、域名输入、页面请求等。通过硬性植入的查询语句攻击数据库,以期利用服务器自身缺陷执行恶意的SQL命令,从而入侵数据库。因此通过SQL注入攻击方式产生的安全事件也在增多,对系统的危害性极大。

通过SQL注入可以远程获取并利用应用里的数据,并且获取未经hashed加密的用户秘钥以及信用卡信息,甚至有以管理员身份登陆进这些应用的可能。下面通过一组常见的SQL注入攻击方式,进行说明:

首先,我们假设数据库中有JOB表,模拟进行攻击,查询表中数据量。

然后,应用中调用恶意的攻击性url向JOB表植入SQL语句:

http://www.moxcn.com:port/webapp/Default.aspx?jobid=1’or 1=(selectcount(*) from job)—

那么,攻击时等效的SQL语句如下:

SELECT job_id, job_desc, min_lvl, max_lvl

FROMjobs

WHERE job_id=’1’or 1=(select count(*) from jobs) –‘

如果SQL注入的假设错误,web页面如图一:

图一

如果SQL注入的假设成功,web界面如图二:

图二

攻击说明:如果SQL注入的假设成功,即证明了数据库中该表的表名是jobs,从而我们也就可以对该表进行增删改操作,从而对数据库安全造成极其严重的危害。

SQL注入的8种攻击行为

安全界有句名言“未知攻,焉知防”,想要预防SQL注入,需要进一步剖析SQL注入都有哪些常见攻击方式。

  1. 猜测数据库名,备份数据库
  2. 猜解字段名称
  3. 遍历系统的目录结构,分析结构并发现WEB虚拟目录,植入木马
  4. 查询当前用户的数据库权限
  5. 设置新的数据库帐户提权得到数据库管理员账户权限
  6. 利用存储过程获取操作系统管理员账户
  7. 客户端脚本攻击:通过正常的输入提交方式将恶意脚本提交到数据库中,当其他用户浏览此内容时就会受到恶意脚本的攻击。
  8. 客户端脚本攻击:通过SQL注入方式将恶意脚本提交到数据库中,直接使用SQL语法UPDATE数据库,并将注入SQL经过“HEX编码”,然后通过exec执行“动态”SQL的特性运行脚本。

综上可知,SQL注入对数据库的攻击方式日趋繁多,危害也日益严重,因此如何做好SQL注入的防护工作也就变成考量数据库安全产品的一道标杆。

SQL注入的5种防护方式

常规的SQL注入防护方式,包括以下几个方面

  1. 通过正则表达校验用户输入
  2. 通过参数化存储过程进行数据查询存取
  3. 参数化SQL语句
  4. 为数据库添加新架构
  5. 利用LINQ to SQL查询

针对以上SQL 5种注入防护方式,可以在一定程度上避免SQL注入对数据库所带来的入侵危害,但这些操作同步会使数据库操作复杂化,在一定程度上提高了企业运维成本,同时降低数据库操作性能。因此,一种专门针对数据库防护类产品——数据库防火墙诞生,可以针对SQL注入攻击行为进行主动有效的防护。

数据库防火墙如何防御SQL注入

数据库防火墙作为专业的数据库安全防护工具,而针对SQL注入等数据库攻击行为的防护能力如何,是衡量一款数据库防火墙产品优略的关键要素。

目前国内数据库安全的专业厂商安华金和,自主研发推出数据库防火墙(DBFirewall)产品基于对数据库协议的精准解析,对SQL注入行为的分析更加精确,极大程度上避免了对SQL注入攻击行为的漏防与误防。

SQL注入的概念来自于Web系统,数据库防火墙在防止SQL注入时,针对已经形成且即将到达数据库的完整SQL,监测是否有非法的操作,并有效阻止针对于数据库的非法入侵行为。

图三:DBFirewallSQL注入攻击防护引擎

DBFirewall对于SQL注入行为的识别,可以分为以下三种:

  1. 通过发送意外数据来触发异常,利用获取数据的GET操作,变更信息的POST操作,结合数据库异常信息,从而判断注入是否发生。

例如:

www.abc/show.php?category=bikes

www.abc/show.php?category=bik’’es

如果以上两句的执行结果相同,则可能存在SQL注入。

  1. 利用应用程序试探。如果应用程序没有对数据库服务器返回的错误信息进行处理,那么数据库的错误信息将直接反馈到前台,通过这些错误信息,不但可以识别出SQL注入的漏洞所在,甚至可能逐步探测出数据库表信息。
  2. 根据应用响应时间判断

通过上述几种方式可以初步判断SQL注入行为的产生,但是为了提高准确性,安华金和数据库防火墙具有独特的设计流程,通过构建一条有效的SQL语句,帮助用户确认SQL注入行为:

1) SQL语句中区分数值类型和字符串类型

2) 验证注入SQL代码时,是否是通过注释剩下的查询来成功结束该语句。

3) 当web应用程序未显示任何错误时,数据库注入时间延迟。

可以检测服务器响应来确定注入

安华金和数据库防火墙基于对SQL注入的各种攻击行为,进行有针对性的数据库防护,从而形成更加完备的防护体系。下面列举几种常见的SQL注入攻击行为做分析说明,并具体描述一下DBFirewall是如何进行防护的。

1)SQL注入识别数据库

攻击方法一:通过获取数据库异常信息,数据库版本信息的方式进行SQL注入攻击

防御方法:利用DBFW的配置错误替换规则,对常见的错误信息进行替换

攻击方法二:获取版本信息

SELECT banner FROMv$version或

SELECT banner FROMv$version WHERE rownum=1

防控方法:采用风险评估中的系统表控制规则,或者通过访问控制权限中,对不同的用户控制对系统表的访问权限。

2)利用UNION语句提取数据

如果应用返回第一个(原始)查询得到的数据,那么通过在第一个查询后面注入一个UNION运算符,并添加另外艺哥任意查询,便可以读取到数据库用户访问过的任何一张表。

攻击方法:多次使用各种数据类型替换null,直到系统不再报错为止,例如

selectusername,passwordfrom admin union select ‘test’,’test’ from dual

如果测试成功,可以替换为:

selectusername,passwordfrom admin union select user, ’test’ from dual

获得系统信息

防控方法:开启DBFW的风险评估union评测,以及系统表的评测

3)利用条件语句

攻击方法一:基于时间

对于oracle来说,可以使用sleep,或者UTL_HTTP、HTTPURITYPE向一个死的IP地址发送一个HTTP请求来实现相同的效果。如果指定一个不存在监听者的IP地址,那么下列查询将一直等待连接知道超时:

selectutl_http.request(‘http://10.0.0.1’)from dual

select HTTPURITYPE(‘http://10.0.0.1’).getclob()from dual

防控方法:开启风险评估里的暴力破解函数。

攻击方法二:基于字符串转换

对于传入参数是字符串的,可以用char函数转化其中一个字符,根基返回的结果可以实现SQL注入。

例如:

select * from productswhere brand=’ac’+char(108+(case when system_user=’sa’ then else 0 end))+’e’

防控方法:将char作为暴力破解函数。

4)提权行为

在Oracle中,通过Web应用的SQL注入来提升权限非常困难。大多数权限提升方法均需要PL/SQL注入,而这种注入很少见。如果找到一种PL/SQL注入漏洞,可以通过注入PL/SQL代码来提升权限或在数据库服务器上启动操作。

不需要PL/SQL注入的例子是:使用在Oracle的mod_plSQL组件中发现的一个漏洞。

防控方法:使用访问控制或者风险评估,加入用户权限控制或高危操作

除了上述几种常见的SQL注入行为之外,DBFW内置可防护的SQL注入攻击行为还包括:窃取hash口令、利用操作系统攻击等。并且可以根据:风险级别、告警通知、SQL命令、命令特征、风险函数、表达式、类型、操作人、操作等几项元素自定义SQL注入防护规则。

数据库防火墙如何防范SQL注入行为的更多相关文章

  1. 利用“参数赋值”防范SQL注入漏洞攻击

    <<年轻,无权享受>————送给每一个看到此文的同僚们 在这无精打采的炎夏 我躺在阳台上房东的旧沙发 回想几个月来遇到的问题 我不禁内心开始慌张喘着粗气 还有大把时间去打拼 没有到只 ...

  2. 防范sql注入值得注意地方

    sql注入是大家基本都清楚,一般来说用参数化就能解决注入的问题,也是最好的解决方式. 有次技术群里问到一个问题,如下图 很显然tableName是外部传递过来的,暂时不考虑具体的业务环境,但如果以se ...

  3. 防范 SQL 注入攻击

     防范 SQL 注入攻击 我们执行的 SQL语句中包含变量,执行的时候会直接把变量内容替换进去.而如果攻击者在输入框中输入一些危险的字符(通常包含 SQL 注释符 --,以及其他预先精心设置的内容), ...

  4. MySQL防范SQL注入风险

    MySQL防范SQL注入风险 0.导读 在MySQL里,如何识别并且避免发生SQL注入风险 1.关于SQL注入 互联网很危险,信息及数据安全很重要,SQL注入是最常见的入侵手段之一,其技术门槛低.成本 ...

  5. 常用数据库2 sqlite及SQL注入

    知识内容: 1.sqlite数据库介绍 2.sqlite数据库操作 3.SQL注入 一.sqlite数据库介绍 1.sqlite数据库 sqlite数据库:轻量级的数据库,一般开发中使用sqlite数 ...

  6. 【数据库】软件安全测试之SQL注入

    这些年我们发现越来越多的公司开始注重安全测试了,为什么?因为安全测试可以在某种程度上可以排查掉你项目的一些安全漏洞,这样你的系统上线后才会相对安全,才有可能尽量避免来自外部的攻击.每一年互联网都会发生 ...

  7. MySQL数据库(六)-- SQL注入攻击、视图、事物、存储过程、流程控制

    一.SQL注入攻击 1.什么是SQL注入攻击 一些了解sql语法的用户,可以输入一些关键字 或合法sql,来导致原始的sql逻辑发生变化,从而跳过登录验证 或者 删除数据库 import pymysq ...

  8. MySQL数据库(六) —— SQL注入攻击、视图、事物、存储过程、流程控制

    SQL注入攻击.视图.事物.存储过程.流程控制 一.SQL注入攻击 1.什么是SQL注入攻击 import pymysql conn = pymysql.Connect( user="roo ...

  9. 分享一个php的防火墙,拦截SQL注入和xss

    一个基于php的防火墙程序,拦截sql注入和xss攻击等 安装 composer require xielei/waf 使用说明 $waf = new \Xielei\Waf\Waf(); $waf- ...

随机推荐

  1. Oracle与SQL SERVER编程差异分析(入门)

    网上有关Oracle与SQL SERVER性能差异的文章很多,结论往往是让你根据数据量与预算来选择数据库.但实际项目中,特别是使用 .Net 开发的系统,支持以上两种数据库或者更多已经成为Boss的普 ...

  2. 观察者模式--java jdk中提供的支持

    一.简介 观察者设计模式有如下四个角色 抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者.抽象主题提供一个接口,可以增加和删除观察者角色.一般用一个抽象 ...

  3. 烂泥:KVM利用LVM快照快速部署虚拟机

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 上一篇文章介绍了有关KVM利用LVM快照备份和恢复虚拟机的功能,这篇文章我们来介绍,如何利用LVM快照功能为KVM快速部署虚拟机. 部署虚拟机需要以下几 ...

  4. hdu 2196 Computer 树形dp模板题

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  5. 两台SQL Server数据同步解决方案

    复制的概念 复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式.使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可 ...

  6. Geoserver发布Oracle数据

    在Geoserver安装包中,默认是不能发布Oracle数据库里的数据的,只能发布postgis.shp等数据,详细如截图: 如果想发布oracle数据,得安装相应版本的关于oracle数据源的插件, ...

  7. NOIP2008 普及组T1 ISBN号码 解题报告-S.B.S.

    题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一 ...

  8. codevs 2822 爱在心中

    codevs 2822 爱在心中  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description “每个人都拥有一个梦,即使彼此不相同, ...

  9. leetcode-Spiral Matrix II 螺旋矩阵2之python大法好,四行就搞定,你敢信?

    Spiral Matrix II 螺旋矩阵 Given an integer n, generate a square matrix filled with elements from 1 to n2 ...

  10. python中的getattr函数

    getattr(object, name[, default]) -> value Get a named attribute from an object; getattr(x, 'y') i ...