Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:一个名字必须以一个字母(Unicode字母)或下划线开头,后门可以跟任意数量的字母、数字或下划线。大写字母和小写字母是不同的,相当于严格区分大小写
控制睡眠时间
package main
import (
"flag"
"fmt"
"time"
)
var (
period time.Duration
)
func init() {
flag.DurationVar(&period, "period", 1*time.Second, "sleep period")
}
func main() {
flag.Parse()
fmt.Printf("sleeping for %v ...", period)
time.Sleep(period)
fmt.Println()
}
iota :无论加不加iota,iota都会自动从上到下由0~n,如果某一值等于iota,会自动填入当前iota的值,若下方的值未定义,则会当前iota+1并填入下方的变量中作为值
package main
import "fmt"
func main() {
const (
a = iota //0
b //1
c //2
d = "ha" //独立值,iota += 1
e //"ha" iota += 1
f = 100 //iota +=1
g //100 iota +=1
h = iota //7,恢复计数
i //8
)
fmt.Println(a, b, c, d, e, f, g, h, i)
}
go
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。 | (A & B) 结果为 12, 二进制为 0000 1100 |
| | 按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或 | (A | B) 结果为 61, 二进制为 0011 1101 |
^ | 按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 | (A ^ B) 结果为 49, 二进制为 0011 0001 |
<< | 左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 | A << 2 结果为 240 ,二进制为 1111 0000 |
>> | 右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。 | A >> 2 结果为 15 ,二进制为 0000 1111 |
if 、fmt.Scan(&a)接收值判断
package main
import "fmt"
var (
a int
b int
)
func main() {
fmt.Println("请输入密码:")
fmt.Scan(&a)
if a == 123456 {
fmt.Println("请再次输入密码:")
fmt.Scan(&b)
if b == a {
fmt.Println("重置密码成功")
} else {
fmt.Println("两次输入的密码不相同")
}
} else {
println("傻鸟")
}
}
switch用法
package main
import (
"flag"
"fmt"
)
var (
grade string
score int
)
func init() {
flag.IntVar(&score, "s", 0, "Enter your score!!!")
}
func main() {
flag.Parse()
fmt.Println("来自60分高手的评价 :")
switch {
case score < 0:
grade = "滚蛋,傻鸟"
case score == 0:
grade = "输入你的分数呀,等啥呢?"
case score < 60:
grade = "傻鸟,都没及格"
case score == 60:
grade = "及格万岁"
case score <= 70:
if score == 61 {
fmt.Printf("tql,找我领10元")
break
}
grade = "不错不错"
case score <= 80:
grade = "还行"
case score <= 90:
grade = "凑合吧"
case score <= 100:
grade = "哦"
default:
grade = "滚蛋,傻鸟"
}
println(grade)
}
select(id=1不知道去哪里了)
package main
import (
"flag"
"fmt"
"strconv"
)
var (
num1 = 1
dir string
url string
)
func init() {
flag.StringVar(&dir, "dir", "default", "Enter the dir")
flag.StringVar(&url, "url", "http://127.0.0.1/", "Enter the url")
}
func main() {
flag.Parse()
ch1 := make(chan string)
for i := 1; i < 10; i++ {
num1 = num1 + 1
go func() {
str1 := strconv.Itoa(num1)
ch1 <- str1
}()
select {
case num2 := <-ch1:
urls := url + dir + "?id=" + num2
println(urls)
default:
fmt.Println("I am hacker")
}
}
}
range
package main
import "fmt"
var (
num1 []int
x, y int
)
func main() {
for i := 1; i <= 100; i++ {
num1 = append(num1, i)
}
fmt.Println(num1)
for _, x = range num1 {
fmt.Println(x)
}
}
逐行读取文件并拼接路径
package main
import (
"bufio"
"flag"
"fmt"
"io"
"os"
)
var (
urlfile string
dir string
)
func init() {
flag.StringVar(&urlfile, "u", "url.txt", "Enter the url_file_path eg : url.txt")
flag.StringVar(&dir, "d", "/index.php", "Enter the dir eg : /index.php")
}
func main() {
flag.Parse()
url, err := os.Open(urlfile)
if err != nil {
panic(err)
}
defer url.Close()
urlline := bufio.NewReader(url)
for {
content, _, err := urlline.ReadLine()
if err == io.EOF {
break
}
content1 := fmt.Sprintf("%s%s", string(content), dir)
fmt.Println(content1)
}
}
自己写的简单的poc
package main
import (
"bufio"
"crypto/tls"
"flag"
"fmt"
"io"
"io/ioutil"
"log"
"net"
"net/http"
"os"
"strings"
"time"
)
var (
urlfile string
dir string
)
func init() {
flag.StringVar(&urlfile, "f", "url.txt", "Enter the url_file_path eg : url.txt")
flag.StringVar(&dir, "d", "/", "Enter the dir eg : /index.php")
}
func main() {
flag.Parse()
url, err := os.Open(urlfile)
if err != nil {
panic(err)
}
defer url.Close()
urlline := bufio.NewReader(url)
for {
content, _, err := urlline.ReadLine()
if err == io.EOF {
break
}
content1 := fmt.Sprintf("%s%s", string(content), dir)
fmt.Println(content1)
statuscode := get_http(content1)
fmt.Println(statuscode)
}
}
func get_http(url string) int {
transport := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
DialContext: (&net.Dialer{
Timeout: 5 * time.Second,
KeepAlive: 30 * time.Second,
}).DialContext,
}
client := &http.Client{
Transport: transport,
}
response, err := client.Get(url)
//response, err := http.Get(url)
//ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
//defer cancel()
//req, err := http.NewRequest("GET", url, nil)
//catchError(err)
//response, err := http.DefaultClient.Do(req.WithContext(ctx))
//response.Header.Set("Cookie", "user=admin")
catchError(err)
switch {
case response.StatusCode < 200:
fmt.Println("信息,服务器收到请求,需要请求者继续执行操作")
case response.StatusCode < 300:
fmt.Println("成功,操作被成功接收并处理")
case response.StatusCode < 400:
fmt.Println("重定向,需要进一步的操作以完成请求")
case response.StatusCode < 500:
fmt.Println("客户端错误,请求包含语法错误或无法完成请求")
case response.StatusCode < 600:
fmt.Println("服务器错误,服务器在处理请求的过程中发生了错误")
}
defer func() {
response.Body.Close()
}()
res, err := ioutil.ReadAll(response.Body)
catchError(err)
if strings.Contains(string(res), "htmoffice") {
fmt.Println("致远 OA A8 htmlofficeservlet getshell 漏洞")
}
return response.StatusCode
}
func catchError(err error) {
defer func() {
if er := recover(); er != nil {
er1 := fmt.Sprintf("无法访问该页面:%v", er)
fmt.Println(er1)
}
}()
if err != nil {
log.Fatal(err)
}
}