- bert001
- 口若悬河,啥都知道
泄露数据库格式不一,长相奇葩,因需将用户名、密码、邮箱、哈希等信息按表分列入库,故整理数据是很耗时间的一步
选择了Debian x64+Mysql+Mysqlcft+Sphinx+Nginx+PHP
轻量的sqlite数据库,但查询速度及空间消耗过大,对请求时sqlite处理效率较差
mangodb,但mangodb在分布计算中有更好的优势而在社工库搭建中优势并不明显
在mysql和postgresql中,选择历久弥新的mysql
为方便社工库移植,使用VM建一个虚拟机,所有数据库均在虚拟机中,LNMP环境对外只提供PHP查询接口
实际测试中,CentOS6.4虚拟机中因断电损失过多数据,并不如预想中稳定,且对CoreSeek版本较老的mmseg中文分词编译会出现各种各样的问题,难以解决。32位的操作系统在sphinx单个索引大小上会有限制,几次折腾后还是迁回了Debian7 X64
一般使用bash脚本完成。DEMO:
普通格式:
#!/bin/bash sed '/^[ \t]\{0,\}$/d' $1 | sed 's/[\t ]/\t/g' | sed 's/\r//g' |sed '/^\s*$/d' | awk -F"\t" '{print "NULL|||"$1"|||"$2"||||||"$1"|||xxxx|||" }' | iconv -c -f gb18030 -t UTF-8 | sort | uniq he
UCmember格式:
#!/bin/bash sed 's/[\r\n ]//g' $1 | tr -d '\n' | sed "s/INSERTINTO\`bbs\_uc\_members\`VALUES(//g" | sed "s/','/\t/g" | sed "s/,'/\t/g" | sed "s/',/\t/g" |sed "s/');/\n/g" | awk -F"\t" '{ print "NULL|||"$2"||||||"$3"|||"$9"|||"$4"|||"$7"|||xxxx+xxxx+evil++"}' | sed "/+evil++||||||||||||/d"PW_MEMBER格式:
#!/bin/bash sed 's/[\r\n ]//g' $1 | tr -d '\n' | sed "s/INSERTINTO\`pw_members\`VALUES('/\n/g" | sed "s/','/\t/g" | awk -F"\t" '{ print $1"|||"$2"||||||"$3"|||"$5"|||xxxx|||"}' | sed "/+evil++||||||||||||/d"文件内格式不同的处理脚本eg:
#!/bin/bash sed 's/\r//g' $1 | sed "s/'/[fenhao]/g" | sed 's/[ \t]\{1,\}/\t/g' | sed 's/----/\t/g' | awk -F "\t" '{ if ($2~/@163.com/) { if ($3~/^$/) {print "NULL|||"$1"|||"$2$3"||||||"} else {print "NULL|||"$1"|||"$3"||||||"} } else {print "NULL|||"$1"|||"$2"||||||"} }' | iconv -c -f gb18030 -t UTF-8 | sort | uniq批量按行导入:
#!/bin/bash sed '/^[ \t]\{0,\}$/d' $1 | sed 's/\r//g' | sed '/^\s*$/d' | awk '{print "NULL|||"$0"|||xxxx|||" }'对于数据库设计也尤为重要。测试后、按表存储、单表记录数不超过3000W,否则建全文索引时间过长。
CREATE TABLE `evil_xxxx_1` ( `id` INT( 10 ) NOT NULL AUTO_INCREMENT, `username` VARCHAR( 64 ) , `password` VARCHAR( 64 ) , `passhash` VARCHAR( 64 ) , `email` VARCHAR( 64 ) ); CREATE TABLE `evil_ucmember_1` ( `id` INT( 10 ) NOT NULL AUTO_INCREMENT, `username` VARCHAR( 64 ) , `password` VARCHAR( 64 ) , `passhash` VARCHAR( 64 ) , `salt` VARCHAR( 16 ) , `email` VARCHAR( 64 ) , `ip` VARCHAR( 32 ) , `site` VARCHAR( 64 ) , PRIMARY KEY (id) ); CREATE TABLE `evil_multinfo_1` ( `id` INT( 10 ) NOT NULL AUTO_INCREMENT, `info` VARCHAR( 1024 ) , `site` VARCHAR( 64 ) , PRIMARY KEY (id) );分表的一个方案:
INSERT INTO evil_xx_1(evil_xx_1.id,evil_xx_1.username,evil_xx_1.password,evil_xx_1.passhash) SELECT evil_xx.id,evil_xx.username,evil_xx.password,evil_xx.passhash FROM evil_xx where user.id <= 30000000;命令查询
show table status;//查看数据库状态 desc table; //查看表结构 set names 'utf8';//设置编码,数据表统一编码UTF-8 drop index index_name on table_name; //删除索引 alter table table_name add primary key(id);//添加主键 alter table table_name drop PRIMARY KEY;//去掉主键 truncate table table_name;//清空表中数据 alter table 表名 rename to 新表名;//重命名表 alter table table_name change Name Name varchar(16);//重命名列及格式 alter table table_name add column xxxx varchar(64) after aaaa;//添加列 alter table 表名 drop column 列名;//删除列 set @t=0; update table_name set id=(@t:=@t+1);//重建ID
load data infile '/tmp/xxxx.sql' into table `evil_xxxx` fields terminated by '|||' lines terminated by '\n';
速度相对较快
中文全文索引主要依赖mysqlctf和sphinx,测试发现,sphinx对于分词索引速度较快,但分词的原因导致诸如搜索humor却搜索不到humorous的情况,而mysqlctf索引速度相对较慢且无进度信息,但索引大小可控,一般全文索引1G数据库信息对应MYI大小为5-9G
关于Coreseek的编译使用,官方有较多文档
Sphinx配置文件(全文检索包括分词及最小分词5字母)
source evil_xxx { type = mysql sql_host = localhost sql_user = ooo sql_pass = xxx sql_db = db sql_port = 3306 sql_query_pre = SET NAMES utf8 sql_query = SELECT id,username,password,passhash,email FROM xxxx sql_query_info = SELECT * FROM xxxx WHERE id=$id } index evil_xxx { source = evil_xxx path = /usr/local/coreseek/var/data/evil_xxx docinfo = extern mlock = 0 morphology = none min_word_len = 1 html_strip = 0 charset_dictpath = /usr/local/mmseg3/etc/ charset_type = zh_cn.utf-8 ngram_len = 0 min_infix_len = 5 enable_star = 1//允许模糊搜索 }
检索时调用官方API即可
关于MYSQLCFT建立索引的方法
首先是安装插件
wget http://mysqlcft.googlecode.com/files/mysqlcft-1.0.0-x86_64-bin.tar.gz tar zxvf mysqlcft-1.0.0-x86_64-bin.tar.gz mkdir -p /usr/local/mysqlcft/lib/mysql/plugin/ cp mysqlcft.so /usr/local/mysqlcft/lib/mysql/plugin/
登陆mysql后
INSTALL PLUGIN mysqlcft SONAME 'mysqlcft.so'; SHOW PLUGINS;
安装OK后建立索引
ALTER IGNORE TABLE 数据库名.表名 ADD FULLTEXT INDEX 全文联合索引名 (字段名1,字段名2) WITH PARSER mysqlcft;
如
ALTER IGNORE TABLE db.evil_xxxx ADD FULLTEXT INDEX fullindex(username,password,passhash,email) WITH PARSER mysqlcft;
在搜索时
SELECT * FROM evil_xxxx WHERE MATCH(username,password,passhash,email) AGAINST ('searchinfo' IN BOOLEAN MODE);
重建索引
REPAIR TABLE 数据库名.表名 QUICK;
本文固定地址:社工数据搜索引擎搭建, 本文转载自 黑海洋博客 ,由 实验吧 整理发布。
想更多了解实验吧,搜索关键词:实验吧、MOOE、U-SaaS、在线实验、实验云、虚拟仿真实验室、虚拟仿真实训系统,
或加入实验吧粉丝群:301520254,找对好朋(ji)友很重要!!!