数据库敏感信息扫描工具——“泰式摸骨”

作者:Sec-Labs | 发布时间:

泰式摸骨

项目地址

https://github.com/SecurityPaper/thai_bone

项目目的

快速发现数据库内涉及隐私数据。为数据脱敏做准备工作。

核心代码

本项目主要由Go语言编写,其核心main.go代码如下

package main

import (
	"fmt"
	"os"
	"regexp"
	"strconv"
	"strings"
	"unicode"

	_ "github.com/go-sql-driver/mysql"
	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func isHan(r rune) bool {

	return unicode.Is(unicode.Han, r)

}
func main() {
	viper.SetConfigName("config") //获取配置文件
	viper.AddConfigPath(".")      //添加配置文件所在的路径
	err := viper.ReadInConfig()
	if err != nil {
		fmt.Printf("打开文件失败: %s\n", err)
		os.Exit(1)
	}
	//获取配置文件
	DbHost := viper.GetString("mysql.host")
	DbUsername := viper.GetString("mysql.username")
	DbPassword := viper.GetString("mysql.password")
	DbName := viper.GetString("mysql.dbname")
	DbCharset := viper.GetString("mysql.charset")
	Dbport := viper.GetString("mysql.port")
	mysqlpath := strings.Join([]string{DbUsername, ":", DbPassword, "@tcp(", DbHost, ":", Dbport, ")/", DbName, "?charset=", DbCharset}, "") //链接配置文件拼接

	ruler := viper.GetStringMap("config.ruler")

	data := []map[string]interface{}{}                          //初始化数据表
	db, err := gorm.Open(mysql.Open(mysqlpath), &gorm.Config{}) //链接数据库

	tableName := []map[string]interface{}{}
	db.Raw("show tables").Scan(&tableName)

	for _, v := range tableName { //循环从数据库取出的表map
		for _, s := range v { //循环表map得到键值对
			sstring := s.(string) //转换数据库名称为字符串
			fmt.Println("正在查询表:", sstring)
			db.Table(sstring).Limit(1).Find(&data) //查找数据map
			for _, dataFor := range data {         //循环返回数据map
				for dateListName, dataForOne := range dataFor { //循环单条数据
					for rulerName, rulerFor := range ruler { //循环出整个规则列表
						// fmt.Println("type:", reflect.TypeOf(dataForOne))
						var dataForOneString string
						switch dataForOne.(type) {
						case string:
							// fmt.Println("is string", dataForOneType)
							dataForOneString = dataForOne.(string)
						case int:
							// fmt.Println("is int ", dataForOneType)
							dataForOneString = dataForOne.(string)
						case float64:
							// fmt.Println("is float64 ", dataForOneType)
							dataForOneString = strconv.FormatFloat(dataForOne.(float64), 'f', -1, 64)
						case int32:
							// fmt.Println("is int32 ", dataForOneType)
							dataForOneString = string(dataForOne.(int32))
						case int64:
							// fmt.Println("is int64 ", dataForOneType)
							dataForOneString = string(dataForOne.(int64))
						}
						// fmt.Println(rulerName, rulerFor.(string), dataForOneString, dateListName)
						matchDigit, _ := regexp.MatchString(rulerFor.(string), dataForOneString)
						// fmt.Println(matchDigit, dataForOneString, rulerFor.(string))
						if matchDigit {
							// fmt.Println(matchDigit)
							fmt.Println("敏感信息:", rulerName, "  表名称:", sstring, "   字段名称:", dateListName, "  数据样例:", dataForOne)
						}
					}
					// fmt.Printf("%+v\n", dataForOne)
				}
			}
			data = nil
		}
	}
}

 

安装

下载release对应系统的二进制包

解压缩

tar zxfv xxx.tar.gz

wget -O config.yaml https://raw.githubusercontent.com/SecurityPaper/thai_bone/v1.1/config-example.yaml

nano config.yaml 修改数据库链接地址和账号密码

./thai_bone直接运行即可

标签:工具分享