使用tcpdump抓mysql query的改进---加上ip功能

本文介绍了一种通过tcpdump捕获并解析SQL语句的方法,利用Perl进行字符串处理,实现了从网络流量中提取特定端口的SQL指令,包括SELECT、UPDATE等。

网络上有使用strings过滤tcpdump的代码, 缺点是不能同时现实客户端ip

 

sudo tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | perl -e '
while(<>) { chomp; next if /^[^ ]+[ ]*$/;
  if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q/n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ /t]+//; $q.=" $_";
  }
}'

 

 

 

改进下(因不使用pcap来处理原始包, 无法识别包分界问题, 想到tcpdump每次抓一个包的方法)

因为在sql语句组成字符上还有遗漏, 还需要晚上. 不过基本能工作

while [ true ];do sudo tcpdump -c 1 -s 0 -l -w - dst port 3306 2>/dev/null|perl -e 'BEGIN{$/=""; $/="";}
  read STDIN, $_, 16384;  $ips="";
 if(/^.{66}(.{8})/) { @ip=unpack('C8', $1); $ips=sprintf("%d.%d.%d.%d->%d.%d.%d.%d",$ip[0],$ip[1],$ip[2],$ip[3],$ip[4],$ip[5],$ip[6],$ip[7]); }
 if($_ =~/(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) { printf("/n%s:", $ips);}
 while ($_ =~ /([/s/w=/*,)/(]+)/gi) { print $& if(length($&) > 5);} ' ;done

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值