最近一段时间,公司的web遭受到sql注入和网络蜘蛛抓取数据的威胁,因为要对iis日志进行分析和查找,我想用linux 文本处理可能会快捷些,小弟shell脚本非常非常的菜,这里记录下部分的处理过程,以备后忘。关于爬虫的处理可以使用网上的终极方法或者给某段时间访问超过特定次数的ip加上动态验证码,我们暂时使用的方法是封掉并发超过50的ip,封掉一分钟内访问超过50的ip,根据我们的实际流量情况封掉日访问量超过10000的ip(排除搜索引擎)。可以将iis数据导入到linux中或者在windows上面自己装个linux的平台,如msys等:
 
1.查找iis日志中包含可能的sql注入字串(不区分大小写,一般的注入字串都是被加密的,我这里只说方法):
awk 'BEGIN {IGNORECASE=1 ;}$7~/update|cast|varchar/||$8~/%/{print }' ex090526_press210.log   > result.txt
2.查找某一个特定ip访问的静态文件
awk '{if($7~/jpg|gif|bmp|png/ && $11='222.73.173.11')print $0 }' ex090608.log |grep -v '222.730.1730.11
2.查找日访问量高于10000的ip (排查蜘蛛的可能)
awk '{print $11 }' ex090608.log |sort |uniq -c |sort -k1 -n -r |awk '{if($1>10000) print $2 }' > result.txt
3.因为公司做了静态的缓冲,所以封并发超过限定次数的ip地址等操作可以在squid上做,高手是这样写的(关于如何在系统上做并发的限制,本菜鸟尚在琢磨中,高手指点下啊):
 
#限制同一IP客户端的最大连接数
acl OverConnLimit maxconn 16
http_access deny OverConnLimit
#防止天涯盗链,转嫁给百度
acl tianya referer_regex -i tianya
http_access deny tianya
deny_info http://www.baidu.com/logs.gif tianya

#防止被人利用为HTTP代理,设置允许访问的IP地址
acl myip dst 192.168.1.1
http_access deny !myip ..

#防止百度机器人爬死服务器
acl AntiBaidu req_header User-Agent Baiduspider
http_access deny AntiBaidu
#允许本地管理
acl Manager proto cache_object
acl Localhost src 127.0.0.1 192.168.1.1
http_access allow Manager Localhost
http_access deny Manager
#仅仅允许80端口的代理
acl Safe_ports port 80 # http
http_access deny !Safe_ports
http_access allow all
4.据江湖传言,以下方法可以在iis本身上做限定,本鸟没有试验成功,原因是无论我怎么改,丫就是不执行,又不知道如何联系文章的作者,郁闷中。。。
 
5.关于如何在windows上封ip超过特定值的ip,待我试验下自己写的批处理后给出源码。
方法一:
今天有时间过来把这个问题整理下,因为是在windows平台上,所以要安装个linux的模拟环境,比如,wingw32等。还需要批量封ip的工具ipseccmd,下载地址:http://www.amdidc.cn/donghua/pc.rar
脚本1实现的功能是:定时访问当日的iis日志(格式:ex090618.log)截取每日访问量超过10000的ip地址,然后同搜索引擎的蜘蛛地址做对比,如果该ip不属于搜索引擎的范围,则直接把结果发送给待封的ip地址列表。。。。尽管还不是很合情理,但是目前没有实现动态验证也只能对付啦。其中ip2.txt中是搜索引擎的支柱地址,ip.txt中存放当日访问量超过10000的ip列表。代码2自然就是批量封ip的代码了。
 
代码1如下:(感谢cu高手指点)
#!/bin/bash
DATE=`date +%y%m%d`
FILE="ex${DATE}.log"
awk '{print $11}' ../../../$FILE |sort |uniq -c |sort -k1 -n -r |awk '{if( $1>10000)  print $2 " \t "}' > ip.txt
awk -F . 'NR==FNR{a[$1"."$2"."$3];next}!($1"."$2"."$3 in a)'  ip2.txt ip.txt > ../../../pc/result.txt
或者
#!/bin/bash
DATE=`date +%y%m%d`
FILE="ex${DATE}.log"
awk '{print $11}' ../../$FILE |sort |uniq -c |sort -k1 -n -r |awk '{if( $1>10000)  print $2 " \t "}' > ip.txt
awk -F'.' 'NR==FNR{a[$1"."$2"."$3]++;b[$1"."$2"."$3]=$4}NR>FNR{a[$1"."$2"."$3]++;}END{for(i in b)if(a[i]==1)print i"."b[i]}' ip.txt ip2.txt >../../../pc/result.txt
 
代码2:
注意这里面的result.txt就是代码1生成的文件 所以代码1中的result.txt 路径你需要根据自己的情况更改。首先是建立一个批处理文件内容如下:
@for /f %%i in (result.txt) do (ipseccmd -w REG -p "CCstop" -r "%%i" -f %%i/255.255.255.255=0/255.255.255.255:: -n BLOCK -x)
然后就是建立一个任务计划,每天定时进行封ip,关于ipseccmd的语法自己看看吧,the end
方法二:
这个方法是我现在用的,这个条件性约束很大,如果在你的局域网内有装了linux的机器的话或者本地安装虚拟机也行,可以使用samba挂载windows,然后在linux上面做脚本,这个简单多了,方法如下:
首先,把你windows上面的log日志文件夹共享,安全使用默认,然后在linux下面建立共挂载的文件夹,使用mount -t cifs -o username=rest,password=alice'!@#$' //192.168.0.55/logs   /home/www
 下面的脚本供参考,不明白的请交流:
#!/bin/bash
DATE=`date +%y%m%d -d "1 day ago"`
FILE="ex${DATE}.log"
logs=(222logs 210logs/W3SVC1967578155 210logs/W3SVC2132521828 203logs/W3SVC1545867998)
for ((i=0;i<${#logs[@]};i++))
do
awk '{print $11}' ${logs[$i]}/$FILE |sort |uniq -c |sort -k1 -n -r |awk '{if( $1>10000)  print $2 }' > ip.txt
awk -F . 'NR==FNR{a[$1"."$2"."$3];next}!($1"."$2"."$3 in a){print $0 "\r"}'  ip2.txt ip.txt > ${logs[$i]}/pc/ip.txt
done
这段代码只是实现功能,写的极笨拙,欢迎大家给我个简写版本的,哈哈,哪里不明白,回复即可
6.如何封在某一段时间访问量超过限制数值的ip