随着 Stack Overflow 的增长,我们开始仔细查看我们的 IIS 日志以识别有问题的 HTTP 客户端——比如流氓网络蜘蛛、设置大页面每秒刷新的用户、写得不好的一次性网络爬虫、狡猾的尝试增加页面计数的用户数不胜数,依此类推。
我提出了一些LogParser查询,它们可以帮助我们在指向 IIS 日志文件时识别大多数奇怪和异常情况。
URL 的最高带宽使用率
SELECT top 50 DISTINCT
SUBSTR(TO_LOWERCASE(cs-uri-stem), 0, 55) AS Url,
Count(*) AS Hits,
AVG(sc-bytes) AS AvgBytes,
SUM(sc-bytes) as ServedBytes
FROM {filename}
GROUP BY Url
HAVING Hits >= 20
ORDER BY ServedBytes DESC
url 命中 avgbyte 服务 ------------------------------------------------- - ---- -------- -------- /favicon.ico 16774 522 8756028 /content/img/search.png 15342 446 6842532
URL 的热门点击
SELECT TOP 100
cs-uri-stem as Url,
COUNT(cs-uri-stem) AS Hits
FROM {filename}
GROUP BY cs-uri-stem
ORDER BY COUNT(cs-uri-stem) DESC
网址命中 ------------------------------------------------- - ---- /content/img/sf/vote-arrow-down.png 14076 /content/img/sf/vote-arrow-up.png 14018
IP / User-Agent 的最高带宽和点击次数
SELECT TOP 30
c-ip as Client,
SUBSTR(cs(User-Agent), 0, 70) as Agent,
Sum(sc-bytes) AS TotalBytes,
Count(*) as Hits
FROM {filename}
group by c-ip, cs(User-Agent)
ORDER BY TotalBytes desc
客户端用户代理totbytes命中 ------------- ------------------------------------- -------- --------- ----- 66.249.68.47 Mozilla/5.0+(兼容;+Googlebot/2.1;135131089 16640 194.90.190.41 omgilibot/0.3++omgili.com 133805857 6447
按 IP / User-Agent 按小时划分的最高带宽
SELECT TOP 30
TO_STRING(time, 'h') as Hour,
c-ip as Client,
SUBSTR(cs(User-Agent), 0, 70) as Agent,
Sum(sc-bytes) AS TotalBytes,
count(*) as Hits
FROM {filename}
group by c-ip, cs(User-Agent), hour
ORDER BY sum(sc-bytes) desc
hr 客户端用户代理 totbytes 命中 -- ------------- ----------------------------------- ------ -------- ---- 9 194.90.190.41 omgilibot/0.3++omgili.com 30634860 1549 10 194.90.190.41 omgilibot/0.3++omgili.com 29070370 1503
按 IP / User-Agent 按小时计算的热门点击
SELECT TOP 30
TO_STRING(time, 'h') as Hour,
c-ip as Client,
SUBSTR(cs(User-Agent), 0, 70) as Agent,
count(*) as Hits,
Sum(sc-bytes) AS TotalBytes
FROM {filename}
group by c-ip, cs(User-Agent), hour
ORDER BY Hits desc
hr 客户端用户代理命中数字节 -- ------------- ----------------------------------- ------ ---- -------- 10 194.90.190.41 omgilibot/0.3++omgili.com 1503 29070370 12 66.249.68.47 Mozilla/5.0+(兼容;+Googlebot/2.1 1363 13186302
{filename} 当然是 IIS 日志文件的路径,例如
c:\working\sologs\u_ex090708.log
我为良好的 IIS LogParser 查询做了很多网络搜索,但发现的很少。上面的这 5 个,极大地帮助了我们识别严重的问题客户。但我想知道——我们缺少什么?
还有哪些其他方法可以对 IIS 日志进行切片和切块(最好使用 LogParser 查询)来挖掘它们的统计异常?你有在你的服务器上运行的任何好的 IIS LogParser 查询吗?
黑客活动或其他攻击的一个很好的指标是每小时的错误数。以下脚本返回返回超过 25 个错误代码的日期和时间。根据网站上的流量(以及您的 Web 应用程序的质量 ;-) 调整该值。
结果可能是这样的:
下一个查询检测到来自一个 IP 地址的单个 URL 的命中数异常高。在此示例中,我选择了 500,但您可能必须更改边缘情况的查询(例如,不包括 Google London 的 IP 地址 ;-)。)
您可以考虑过滤掉合法流量(并扩大范围)的一件事是
cs(Cookie)
在 IIS 日志中启用,添加一些使用 javascript 设置小 cookie 的代码,然后添加WHERE cs(Cookie)=''
.由于您的代码很少,每个用户都应该有一个 cookie,除非他们手动禁用 cookie(一小部分人可能会这样做)或者除非该用户实际上是不支持 Javascript 的机器人(例如,wget、httpclient等不支持Javascript)。
我怀疑如果用户有大量活动,但他们接受 cookie 并启用了 javascript,那么他们更有可能是合法用户,而如果您发现用户有大量活动但不支持 cookie/javascript ,他们更有可能是机器人。
抱歉,还不能评论,所以我不得不回答。
“按 URL 排列的最高带宽使用情况”查询存在一个小错误。虽然大多数时候你可以接受页面请求并乘以文件大小,但在这种情况下,由于你没有注意任何查询参数,你会遇到一些轻微的问题- 非常不准确的数字。
要获得更准确的值,只需执行SUM(sc-bytes)而不是MUL(Hits, AvgBytes) as ServedBytes。
Anders Lundström一直在撰写一系列关于常见 LogParser 查询的博客文章。
我一直在使用这些:
这家伙有大约十几个有用的查询:
http://logparserplus.com/Examples/Queries.aspx
您可能想要查找最长的请求(词干和/或查询),以及服务器接收到的字节数最多的请求。我还会尝试按接收到的字节数和 IP 分组的方法,以便您可以查看是否可能由一个 IP 重复的特定请求格式。
我还会计算一天中一小时一分钟的请求 IP 组的点击次数,或者将请求 IP 与一小时的分钟分组,以查找是否有任何可能是脚本的定期重复访问。这将是对按小时点击数脚本的一个小修改。
在任何非编程站点上,在日志中搜索 SQL 关键字也是一个好主意,诸如
SELECT
、UPDATE
、和其他奇怪的东西,如DROP
、ORing 将它们放在一起并按 IP 计数似乎很方便。对于包括这些在内的大多数网站,这些词很少会出现在 URI 的查询部分中,但在这里它们可能会合法地出现在 URI 词干和数据部分中。我喜欢反转任何点击的 IP,以查看谁在运行预制脚本。我倾向于看到、和。我不是要评判,但从今以后我倾向于阻止它们。在他们的辩护中,这些国家通常人口最多,尽管到目前为止我没有看到太多的说法,或做同样的事情。DELETE
FROM sys.tables
.ru
.br
.cz
.cn
.in
.fr
.us
.au
PS 我无法验证这些查询是否会正确运行。如果需要修复,请自由编辑。
这些都可以在这里找到(这是解析 IIS 日志文件的绝佳指南,顺便说一句):
您网站上的 20 个最新文件
logparser -i:FS "SELECT TOP 20 Path, CreationTime from c:\inetpub\wwwroot*.* ORDER BY CreationTime DESC" -rtp:-1
20 个最近修改的文件
logparser -i:FS "SELECT TOP 20 Path, LastWriteTime from c:\inetpub\wwwroot*.* ORDER BY LastWriteTime DESC" -rtp:-1
导致 200 个状态码的文件(以防木马被删除)
logparser "SELECT DISTINCT TO_LOWERCASE(cs-uri-stem) 作为 URL,Count( ) AS Hits FROM ex .log WHERE sc-status=200 GROUP BY URL ORDER BY URL"-rtp:-1
显示在一天内访问同一页面超过 50 次的任何 IP 地址
logparser "SELECT DISTINCT date, c-uri-stem, c-ip, Count( ) AS Hits FROM ex .log GROUP BY date, c-ip, c-uri-stem HAVING HAT>50 ORDER BY Hits Desc" -rtp: -1
我不知道如何使用 LogParser 来执行此操作,但查找获取 404 的“phpMyAdmin”(或其他常见漏洞)之类的请求字符串可能是识别脚本攻击的好方法。