ITPub博客

首页 > 数据库 > Oracle > PLSQL Language Referenc-PL/SQL动态SQL-SQL注入-SQL注入技术-语句修改

PLSQL Language Referenc-PL/SQL动态SQL-SQL注入-SQL注入技术-语句修改

原创 Oracle 作者: luisedalian 时间:2014-03-28 01:08:37 0 删除 编辑

SQL注入

SQL注入是在SQL语句中对使用客户端提供数据的应用程序的一种恶意的探测,

目的是获取对数据库的非授权的访问来查看或操纵限制的数据。

--HR方案下创建SQL注入练习环境

DROP TABLE secret_records;

CREATE TABLE secret_records

(

    user_name     VARCHAR2(9),

    service_type VARCHAR2(12),

    value          VARCHAR2(30),

    date_created DATE

);

 

INSERT INTO secret_records VALUES ('Andy', 'Waiter', 'Serve dinner at Cafe Pete', SYSDATE);

INSERT INTO secret_records VALUES ('Chuck', 'Merger', 'Buy company XYZ', SYSDATE);

SQL注入技术

SQL注入技术只利用了一个缺陷:输入的字符串没有进行有效的验证,并且被连接到动态SQL语句中。

语句修改

语句修改意味着故意修改动态SQL语句,这样语句就可以以一种开发者非计划中的方式运行。

通常会通过修改where子句、select子句、插入union all子句来获得未授权的数据。

典型例子是通过使where子句始终为真为越过口令验证。

-- 11g12_07_09.prc 创建一个容易受语句修改攻击的存储过程

CREATE OR REPLACE PROCEDURE get_record (user_name IN VARCHAR2, service_type IN VARCHAR2, rec OUT VARCHAR2)

IS

    query VARCHAR2(4000);

BEGIN

  -- 下面的语句容易受SQL修改的攻击,因为它使用连接来建立where子句

    query := 'SELECT value FROM secret_records WHERE user_name='''

            || user_name

            || ''' AND service_type='''

            || service_type

            || '''';

    DBMS_OUTPUT.PUT_LINE('查询: ' || query);

    EXECUTE IMMEDIATE query INTO rec ;

    DBMS_OUTPUT.PUT_LINE('记录: ' || rec );

END;

 

-- 11g12_07_09.tst

DECLARE   

    record_value VARCHAR2(4000);   

BEGIN

    -- 没用使用SQL注入

    get_record('Andy', 'Waiter', record_value);   

    -- 使用SQL注入

    get_record('Anybody '' OR service_type=''Merger''--', 'Anything', record_value);

   

END;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1131205/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    1986
  • 访问量
    5675894