Web日志分析
网站日志格式类型¶
网站日志记录了服务器接收到的请求以及服务器的响应信息,是分析网站性能、用户行为、安全状况等的重要数据来源。常见的网站日志格式类型主要包括以下几种:
通用日志格式¶
这是最基础、最常用的日志格式,由 W3C 提出,被大多数 Web 服务器软件支持。
字段组成:
- 远程主机(Remote Host):发起请求的客户端主机名或 IP 地址。
- 远程用户名(Remote Logname):如果服务器启用了身份验证,这里会记录用户名;否则显示为“-”。
- 认证用户名(Auth User):与远程用户名类似,在认证过程中记录用户名。
- 请求日期和时间(Date and Time of Request):记录请求发生的日期和时间,格式通常为
[day/month/year:hour:minute:second zone]。 - 请求方法(Request):客户端使用的 HTTP 请求方法,如 GET、POST 等。
- 请求的资源(Requested Resource):客户端请求的网页或文件路径。
- 协议版本(Protocol Version):客户端使用的 HTTP 协议版本,如 HTTP/1.1。
- 状态码(Status Code):服务器返回给客户端的 HTTP 状态码,如 200 表示成功,404 表示未找到页面。
- 发送的字节数(Bytes Sent):服务器发送给客户端的字节数。
示例:
组合日志格式¶
在通用日志格式的基础上进行了扩展,增加了更多有用的信息,是目前最常用的日志格式之一。
字段组成:在通用日志格式的基础上增加了以下两个字段:
- 引用页(Referrer):记录用户是从哪个页面链接到当前请求的页面的。如果用户直接输入网址访问,则该字段为“-”。
- 用户代理(User Agent):记录客户端使用的浏览器、操作系统等信息。
示例:
192.168.1.1 - - [10/Oct/2023:13:55:36 +0800] "GET /index.html HTTP/1.1" 200 2326 "https://www.example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
W3C 扩展日志格式¶
由 W3C 制定的一种可扩展的日志格式,用户可以根据需要自定义日志字段。
特点:
- 灵活性高:用户可以自由选择要记录的字段,以满足不同的分析需求。
- 结构化:采用键值对的形式记录日志信息,便于计算机处理和分析。
常见字段:
date:请求的日期。time:请求的时间。c-ip:客户端 IP 地址。cs-username:客户端用户名。cs-method:HTTP 请求方法。cs-uri-stem:请求的资源路径。cs-uri-query:请求中的查询字符串。sc-status:HTTP 状态码。sc-bytes:服务器发送的字节数。cs(User-Agent):用户代理信息。cs(Referer):引用页。
示例:
#Software: Microsoft Internet Information Services 10.0
#Version: 1.0
#Date: 2023-10-10 13:55:36
#Fields: date time c-ip cs-method cs-uri-stem sc-status sc-bytes cs(User-Agent) cs(Referer)
2023-10-10 13:55:36 192.168.1.1 GET /index.html 200 2326 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 https://www.example.com/
NCSA 扩展日志格式¶
NCSA(National Center for Supercomputing Applications)提出的扩展日志格式,是组合日志格式的前身。
- 字段组成:与组合日志格式类似,但在字段的表示和顺序上可能略有不同,不同的服务器软件实现可能会有一些差异。
192.168.1.1 - - [10/Oct/2023:13:55:36 +0800] "GET /index.html HTTP/1.1" 200 2326 "https://www.example.com/" "Mozilla/5.0"
自定义日志格式¶
许多 Web 服务器软件(如 Apache、Nginx)允许用户自定义日志格式,以满足特定的业务需求。
- 实现方式:用户可以通过配置文件指定要记录的字段以及字段的顺序和格式。
- 示例(Apache 自定义日志格式):
在 Apache 的配置文件中,可以使用
LogFormat指令定义自定义日志格式,然后使用CustomLog指令指定日志文件的路径和使用的日志格式。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" my_custom_format
CustomLog "/var/log/apache2/my_custom.log" my_custom_format
上述配置定义了一个名为 my_custom_format 的自定义日志格式,其中 %D 是 Apache 特有的字段,表示处理请求所花费的时间(以微秒为单位)。
网站日志文件¶
网站日志文件的位置取决于所使用的Web服务器软件以及服务器配置。以下是一些常见的Web服务器及其默认日志文件位置:
Apache HTTP Server¶
访问日志:通常位于/var/log/apache2/access.log 或 /var/log/httpd/access_log
错误日志:通常位于/var/log/apache2/error.log 或 /var/log/httpd/error_log
请注意,根据不同的Linux发行版或Apache的安装方式,路径可能会有所不同。可以通过查看Apache的配置文件(通常是httpd.conf或者在/etc/apache2/目录下的相关配置文件)来确认具体的日志文件位置。
Nginx¶
访问日志:默认情况下,Nginx的访问日志位于/var/log/nginx/access.log
错误日志:错误日志一般位于/var/log/nginx/error.log
同样地,这些路径也可能因为不同的安装和配置而有所变化。可以在Nginx的主配置文件(通常是nginx.conf)中找到确切的日志文件路径设置。
Microsoft IIS¶
IIS的日志文件存储位置可以通过IIS管理器进行配置,默认情况下它们可能被存放在如下路径:
常用日志分析方法¶
网站访问频率分析¶
获取access_log文件并将其重命名为a.txt文件。
查看访问服务器的IP¶
1.使用 cut 命令提取 IP

2.使用 awk 命令提取 IP(更简洁)
cat a.txt | awk '{print $1}' | sort -u
# 说明:
# cut -d " " -f 1:以空格为分隔符,提取每行的第一个字段(假设第一个字段是 IP 地址)。
# awk '{print $1}':默认以空格为分隔符,提取每行的第一个字段。
# sort -u:对提取出的 IP 地址进行排序并去重,得到所有唯一的访问者 IP。

筛选出攻击者 IP(高频率访问 IP)¶
1.统计每个 IP 的访问次数
cat a.txt | awk '{print $1}' | sort | uniq -c | sort -nr
cat a.txt | awk '{print $1}' | sort | uniq -c
# 说明:
# awk '{print $1}':提取 IP 地址。
# sort:对 IP 地址进行排序,以便 uniq -c 能够正确统计相邻的相同 IP 的数量。
# uniq -c:统计每个 IP 出现的次数。
# sort -nr:按照访问次数从高到低进行排序,方便快速发现高频率访问的 IP。

2.通过阈值进行筛选
可以设置一个阈值,比如访问次数超过 100 次的 IP 才被认为是可疑的攻击者 IP。

筛选攻击者行为¶
1.查看攻击者所有请求

使用 grep 命令筛选出包含指定 IP 地址(111.200.195.77)的所有日志行。
2.提取攻击者请求的响应信息
cat a.txt | grep '111.200.195.77' | awk -F "] " '{print $2}'
# 说明:以 "] " 为分隔符,提取每行中 "] " 后面的内容,即请求的响应信息

3.查看攻击者是否成功(检查 HTTP 状态码)
cat a.txt | grep '111.200.195.77' | awk -F "] " '{print $2}' | grep 200
# 说明:在提取出的响应信息中,进一步筛选出包含 HTTP 状态码 200 的行,判断攻击者的请求是否成功。

特征字符分析¶
根据攻击者利用的漏洞特征,进行判断攻击者使用的是哪一种攻击。
SQL 注入攻击¶
1.攻击原理
攻击者通过在应用程序的输入字段中插入恶意的 SQL 代码,试图欺骗数据库服务器执行非授权的 SQL 语句,从而获取、修改或删除数据库中的数据。
2.日志特征
(1)异常的输入参数:日志中会出现包含特殊字符(如单引号、分号等)和 SQL 关键字(如 SELECT、INSERT、UPDATE、DELETE 等)的请求参数。例如:
sql1.php?name=admin'(字符型注入测试)sql2.php?id=1 and 1=1(数字型注入测试)sql2.php?id=1 and sleep(5)(时间盲注测试)
(2)请求频率异常:攻击者可能会对同一个页面进行多次请求,尝试不同的注入参数。
(3)数据库错误信息:如果应用程序没有正确处理数据库错误,日志中可能会记录数据库返回的错误信息,如 SQL 语法错误、权限错误等。
3.特征字符分析
(1)报错注入特征字符:'、and、or、sleep()、floor()、extractvalue()、updatexml() 等。例如,请求中包含 sql1.php?name=admin' and '1'='1 可能是布尔盲注的尝试。
(2)联合查询注入特征字符:union select、order by。例如,请求中包含 union select 1,2,3 from users 可能是联合查询注入。
(3)数据库类型判断特征字符:不同数据库有特定的判断语句,如 and (select count (*) from sysobjects)>0 用于判断 SQLSERVER 数据库。
4.提取包含sql注入特征的access_log日志
grep -iE "'|(and|or|select|insert|update|delete|drop|union|order by)[[:space:]/]|sleep\(|benchmark\(|floor\(.*rand|updatexml|extractvalue" access_log > sql_injection_candidates.txt
XSS 跨站脚本攻击¶
1.攻击原理
跨站脚本(XSS)攻击是指攻击者在网页中注入恶意脚本代码,当其他用户访问该网页时,恶意脚本会在用户的浏览器中执行,从而窃取用户的敏感信息或控制用户的浏览器。
2.日志特征
异常的输入内容:日志中会出现包含 JavaScript 代码、HTML 标签等特殊内容的请求参数。例如:
请求来源可疑:攻击者可能会通过一些特定的网站或工具发起 XSS 攻击请求,日志中可能会记录这些可疑的来源。
用户行为异常:如果攻击成功,可能会导致用户的浏览器出现异常行为,如频繁的页面跳转、弹出窗口等,这些行为可能会在日志中有所体现。
3.特征字符分析
(1)标签特征字符: 是明显的 XSS 攻击代码。
(2)触发事件特征字符:oninput、onload、oncut、onclick、onerror、onmouseover 等。例如,<img src=x onerror=alert('XSS')> 利用了 onerror 事件触发 XSS 攻击。
(3)恶意代码特征字符:prompt、confirm、alert、javascript、eval、expression、window.location 等。例如,javascript:alert('XSS') 是常见的 XSS 攻击代码
4.分析命令
grep -iE '(<(script|img|svg|body|input|a|iframe)[^>]*>|on(error|load|click|mouseover|input|cut)|prompt\(|confirm\(|eval\(|expression\(|window\.location|javascript:|data:)' access_log
恶意文件上传¶
1.攻击原理
攻击者通过上传恶意文件到网站服务器,从而获取服务器的控制权限或执行恶意代码。
2.日志特征
(1)上传请求特征
日志中会出现包含 upload、file 等字样的请求,且请求方法通常为 POST。例如:
POST /upload.php HTTP/1.1POST /file.php HTTP/1.1
(2)文件类型异常:攻击者可能会上传一些非法的文件类型,如 .php、.asp、.jsp 等可执行文件。
(3)后续操作可疑:在文件上传后,日志中可能会出现一些可疑的访问请求,如访问上传的文件路径、执行文件中的代码等。
3.特征字符分析
(1)上传页面特征字符:请求中包含 upload、file 等字样,如 upload.php、file.php。
(2)文件参数特征字符:请求参数中包含 file、filename 等字样,如 file=test.php。
(3)文件内容特征字符:如果日志中记录了文件内容,可能会出现一些恶意代码,如 <?php eval($_POST['cmd']);?>(一句话木马)。
4.分析命令
grep -iE 'POST /.*(upload|file)|\.(php|asp|jsp)(\W|$)|(eval\(|system\(|exec\(|base64_decode).*\$\w+'\''\]\)' access.log > upload_attack_candidates.txt
# 参数说明:
# -i:忽略大小写(如 .PHP、Upload 也能匹配)
# 合并三类核心特征检测:
# 上传请求特征:匹配包含 POST /upload.php、POST /file 等路径的请求
# POST /.*(upload|file)
# 非法文件类型:检测 .php、.asp、.jsp 等可执行文件扩展名(支持参数中的 filename=test.php 或路径中的 /uploads/test.php)
# \.(php|asp|jsp)(\W|$) # \W 匹配非单词字符(如空格、引号),$ 匹配字符串结束
# 恶意代码特征:匹配 eval($_POST[...])、system()、exec()、base64_decode() 等危险函数
# (eval\(|system\(|exec\(|base64_decode).*\$\w+['\]]\) # 匹配动态变量如 $_POST['cmd']
一句话木马¶
1.攻击原理
一句话木马是一种简短的恶意代码,通常只有一行,攻击者通过将其上传到网站服务器,从而获取服务器的控制权限。
2.日志特征
(1)可疑文件名:日志中可能会出现一些名字可疑的文件,如带日期字样的页面(20250429.php)、一串随机值的页面(a3b2c1.php)等,且文件扩展名通常为 .php、.asp、.aspx、.jsp 等。
(2)POST 请求特征:一句话木马通常通过 POST 请求进行操作,日志中可能会出现大量的 POST 请求记录。
(3)返回数据特征:攻击者在使用一句话木马时,服务器可能会返回一些特定的数据,如执行系统命令的结果、文件内容等。
3.特征字符分析
(1)木马代码特征字符:一句话木马的代码通常比较简短,如 <?php eval($_POST['cmd']);?>,其中 eval、$_POST 是关键特征字符。
(2)请求参数特征字符:在使用一句话木马时,攻击者通常会通过 POST 请求传递参数,如 cmd=system('dir'),其中 cmd 是常见的参数名。
(3)一句话木马是一种精简的恶意代码(通常只有一行),通过远程执行任意命令或脚本,使攻击者获得服务器控制权限。
典型代码示例:
PHP:<?php eval($_POST['cmd']); ?>
ASP:<%eval request("cmd")%>
JSP:<%Runtime.getRuntime().exec(request.getParameter("cmd"));%>
4.分析命令
(1)日志特征检测
grep -iE 'POST /.*\.(php|asp|jsp)\?.*(&cmd=|&pass=|\b(eval|assert|system|exec|passthru|base64_decode)\()' access_log > webshell_candidates.txt
# -i:忽略大小写(如 .PHP、CMD=、EVAL( 也能匹配)
# 合并四类特征:
# 可疑文件路径:匹配 .php、.asp、.jsp 文件路径(如 /uploads/shell.php)
# POST /.*\.(php|asp|jsp)
# 危险参数名:检测 cmd、pass 等敏感参数(如 ?cmd=whoami)
# (&cmd=|&pass=)
# 危险函数调用:匹配 eval()、assert()、system()、exec()、passthru()、base64_decode() 等函数
# \b(eval|assert|system|exec|passthru|base64_decode)\(

(2)文件内容静态检测(危险函数扫描)
grep -rliE "(eval|assert|system|exec|passthru|base64_decode)\s*\(.*(\$_POST|\$_GET|\$_REQUEST)" /var/www/html/ > webshell_files.txt
# -rli:递归搜索文件内容,忽略大小写,仅输出文件名
# 匹配动态参数:检测 eval($_POST[...])、system($_GET[...]) 等典型 WebShell 代码
5.扩展命令分析
(1)高频访问 IP 分析
# 统计访问可疑文件的 IP 频率(如 shell.php)
awk '/\.(php|asp|jsp)\?/ {print $1}' access_log | sort | uniq -c | sort -nr | head -10

(2)动态行为监控
(3)编码绕过检测
(4) 响应内容分析
# 查找响应中包含系统命令结果(如 uid=0(root))
awk '$9 == 200 {print $0}' access_log | grep -E "uid=|root|Permission denied"

6.误报过滤
(1) 排除白名单路径
(2) 排除合法参数名
7.防御与响应
(1)自动封禁高危 IP
grep -iE 'webshell_candidate_pattern' access.log | awk '{print $1}' | xargs -I{} iptables -A INPUT -s {} -j DROP
(2)增强日志记录
# Nginx 配置示例(记录 POST 请求体)
log_format enhanced '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$request_body"';
access_log /var/log/nginx/access.log enhanced;
8.综合案例
场景:攻击者上传 20250429.php,通过 ?cmd=id 执行命令。
(1)检测可疑请求
(2)定位文件并静态扫描
(3)封禁攻击者 IP
Web扫描¶
一般来说,访问的目标比较离散,并且来源地址相对固定,同时访问的结果大多数也都是失败的,并且在参数中有比较明显的扫描器特征字段
1.常见扫描器在url上的特征
● AWVS 10.5或11
acunetix-wvs-test-for-some-inexistent-file
by_wvs
acunetix_wvs_security_test
acunetix
acunetix_wvs
acunetix_test
wvs_test
● Netsparker
●Appscan
● Webinspect
● Rsas
● Nessus
● Sqlmap
2.分析命令
(1)直接匹配已知扫描器标识
grep -iE '(acunetix|by_wvs|netsparker|appscan|HP404|nsfocus|nessus|sqlmap|wvs_test)' access.log > scanner_candidates.txt
(2)检测通用扫描器特征
# 匹配自动化工具特征(如 "Scanner"、"Spider"、"Crawler")
grep -iE '(scanner|spider|crawler|bot|checker|security|scan)' access.log | grep -vE '(google|bing|yandex)' > generic_scanners.txt
3.扩展分析命令
(1)统计来源 IP 的失败请求(4xx/5xx)频率
(2)精准定位 URL 路径或参数
(3) 检测 URL 编码特征
# 匹配编码后的扫描器关键字(如 %61%63%75%6e%65%74%69%78 对应 acunetix)
grep -iE '%61%63%75%6e%65%74%69%78|%73%71%6c%6d%61%70' access.log
(4)关联时间窗口分析
# 检测短时间内大量请求的 IP(时间窗口 1 分钟)
awk -v window=60 '{ip=$1; timestamp=$4; next} $1 == ip && $4 <= timestamp + window {count[ip]++} END {for (ip in count) print ip, count[ip]}' access.log | sort -k2 -nr
(5)误报过滤
排除业务白名单路径:
排除合法安全扫描 IP:
(6)敏感文件或目录探测
# 检测对敏感路径的探测(如 .git、.env、备份文件)
grep -iE '/(\.git/|\.env|\.bak|\.old|/phpinfo\.php|/admin/|/wp-admin/)' access.log > sensitive_path_requests.txt
(7)路径遍历攻击特征
# 检测路径遍历字符(../ 或 URL 编码的 %2e%2e%2f)
grep -iE '(\.\./|%2e%2e%2f|%252e%252e/)' access.log > path_traversal_attempts.txt
其他¶
日志格式处理¶
确保日志文件的格式是已知且固定的,如果日志格式不统一,可能需要先对日志进行预处理,使其符合分析的要求。
可以使用 sed 或 awk 等命令对日志进行格式转换和清洗,例如去除多余的空格、统一时间格式等。
结合其他特征分析¶
除了访问频率,还可以结合其他特征来识别攻击者,例如:
-
请求方法:攻击者可能会使用一些不常见的请求方法,如 HEAD、OPTIONS 等进行探测。
-
请求的资源路径:攻击者可能会尝试访问一些不存在的页面或敏感的目录。
-
用户代理(User Agent):一些攻击工具可能会使用特定的用户代理字符串。
网站可视化分析工具¶
- Graylog
官网: https://www.graylog.org/
GitHub: https://github.com/Graylog2/graylog2-server
安装指南: 可以在官方网站上找到详细的安装指南,支持多种操作系统包括Linux、Windows等。
- Logstash (ELK Stack)
官网: https://www.elastic.co/logstash
下载页面: https://www.elastic.co/downloads/logstash
GitHub: https://github.com/elastic/logstash
- Elasticsearch
官网: https://www.elastic.co/elasticsearch/
下载页面: https://www.elastic.co/downloads/elasticsearch
GitHub: https://github.com/elastic/elasticsearch
- Kibana
官网: https://www.elastic.co/kibana/
下载页面: https://www.elastic.co/downloads/kibana
GitHub: https://github.com/elastic/kibana
- Fluentd
官网: https://www.fluentd.org/
下载页面: https://docs.fluentd.org/installation
GitHub: https://github.com/fluent/fluentd
- GoAccess
官网: https://goaccess.io/
下载页面: https://goaccess.io/download
GitHub: https://github.com/allinurl/goaccess
- AWStats
官网: https://awstats.sourceforge.io/
SourceForge 下载页: https://sourceforge.net/projects/awstats/files/awstats/
- Webalizer
官网: http://www.webalizer.org/
SourceForge 下载页: https://sourceforge.net/projects/webalizer/files/webalizer/
- Analog
官网: https://www.analog.cx/
下载页面: https://www.analog.cx/downloads.html