【面向绝对新手】什么是可疑访问?

介绍

您好。我是 Paru,系统解决方案部门的二年级基础设施工程师,将于 2024 年毕业。

首先,你能立刻想到什么是访问日志吗?
作为一名基础设施工程师,它是你在响应警报时每天都会看到的基本日志之一,但在我入行的第一年,我却对它感到非常不适应,甚至讨厌它。

因此,本文旨在那些还不熟悉访问日志并有诸如“我不知道访问日志中写了什么”、“我不知道如何调查访问我无法确定哪种访问构成攻击”等问题的人。

*本文是关于如何进行调查的,因此没有提及任何调查命令,但是页面底部的参考网站中列出了许多优秀的文章,希望您能去看看!

了解访问日志

访问日志的用途是什么?

在日常生活中,我们可能都遇到过网站加载缓慢或出现错误导致无法浏览的情况。
虽然服务器负载过高(例如访问量激增)并非造成这些问题的唯一原因,但查看访问日志可以帮助我们确定
访问是否是造成这些问题的根本原因访问日志输出对于找出问题根源至关重要。

我们来看一下访问日志。

我们来看一个例子。
例如,假设您访问一个网站(http://example.net)。
当您这样做时,服务器端的访问日志中将输出以下句子:

192.168.100.101 - - [1/Nov/2025:10:20:50 +0900] "GET /index.php HTTP/1.1" 200 1042 "http://example.com" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"

乍一看,它像是一段简单的代码,但实际上它只是按一定顺序记录了
何时、何人、何地以及他们来此的目的内容有点长,但我们会在下面进行详细解读。

  1. 192.168.100.101 ……原始客户端的 IP 地址(这是被访问的 IP 地址)
  2. -客户端标识符(通常未使用,因此为 -)
  3. - ...请求者的用户名(访问需要身份验证的页面的人员的姓名,通常为 - )
  4. [2025年11月1日 10:20:50 +0900] ...访问日期和时间(+0900 表示与 UTC 的时差为 9 小时)
  5. “GET ... HTTP 方法(有多种方法,例如 GET 通信、POST 通信等)”
  6. /index.php ...请求 URI (告诉服务器“我想要这个文件!”的路径)
  7. HTTP/1.1” ... HTTP 版本
  8. 200 ……状态码(200 表示请求成功!)
  9. 1042 ...响应字节数(服务器返回的数据大小,以字节为单位)
  10. “http://example.com” ……引用网址(即从此页面链接到的前一页的网址,也就是 http://example.net/index.php 之前的页面)。
  11. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" ...用户代理(浏览器和操作系统信息。可以看到我使用的是 Chrome 浏览器)

如何设置输出格式

Web 服务器输出的访问日志没有固定格式;您可以在配置文件中自由定义“要记录哪些信息以及记录顺序”
这些设置通常/etc,但具体的编写方式取决于您使用的中间件(Apache 或 Nginx)。
以下是一个编写示例。

Apache 版本

LogFormat "%{X-Forwarded-For}i %l %u [%t] \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Nginx 版本

log_format combined '$http_x_forwarded_for - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';

让我们简要讨论一下Apache 示例中的%{X-Forwarded-For}iNginx 示例中的$http_x_forwarded_for

此项未包含在初始设置中,但填写此项后,负载均衡器反向代理的环境中您也能够看到访问来源的 IP 地址
相反,如果不填写此设置,则只会记录上一阶段负载均衡器或反向代理的 IP 地址,从而无法进行详细的调查。

简而言之,您可以
根据配置文件中的编写方式自由自定义日志格式您可以通过更改写入顺序来更改输出顺序,还可以记录额外的特殊值(标头信息),就像本例中一样。

有关格式的详细说明,请参阅以下文章。

[apache]简单地说明如何查看访问日志! *2025年2月更新

[nginx] 讲解访问日志的查看、设置、位置等

查看访问

这是一种非常粗略的调查方法,因此在调查访问日志时可以参考此方法。
由于访问内容和调查方法差异很大,请仅将其作为示例之一。

前提:您的服务器 CPU LA(等待队列)正在上升!让我们来调查一下!

步骤 1:检查接入号码的趋势

首先,为了检查服务器负载是否是访问量不足的原因,我们来统计一下每分钟的访问次数。

10 [2025年10月29日 12:00 10
[2025年10月29日 12:01 11
[2025年10月29日 12:02
2529 [2025年10月29日 12:03 <-- ! ?
5107 [2025年10月29日 12:04 <--! !
2714 [2025年10月29日 12:05 <--! !
26 [2025年10月29日 12:06
30 [2025年10月29日 12:07

从 12:03 开始​​,短短三分钟内访问量突然激增,这非常奇怪
这似乎是 CPU 负载增加的原因。

步骤二:识别可疑活动

一旦确定访问量突然增加,下一步就是确定
访问者是谁以及他们在做什么接下来,您可以将日志范围缩小到访问量突然增加的时间段,并查找任何可疑之处。

① 访问源IP

检查是否存在来自特定 IP 地址的频繁访问。

# 访问次数 IP 地址
10143 192.0.2.115 <-- 异常高
128 192.0.2.22
62 192.0.2.88
17 192.0.2.54

如果你在IP地址查询网站上查看IP地址,发现即使网站面向日本用户,也有大量IP地址来自海外,这就很可疑了。这很可能是网络爬虫或攻击。

② 访问路径(请求 URI)

查看网站上哪些路径的流量最大。
通过缩小范围,锁定可疑的 IP 地址,更容易找到这些路径。

# IP 地址 192.0.2.115 的访问目标路径
105 /wp-login.php <-- 可疑
98 /xmlrpc.php <-- 可疑
42 /?author=1 <-- 可疑
27 /wp-admin/admin-ajax.php
15 /wp-config.php.bak <-- 可疑
15 /wp-admin/profile.php
14 /wp-content/plugins/file-manager/readme.txt

区分“可疑”和“不可疑”相当困难,所以我们逐一来看。
我们可以把网站一家商店,合法访问(点击网址)是前门,而可疑访问(试图进入WordPress或类似网站的管理面板)后门

wp-login.php 和 xmlrpc.php(可疑)
用途:未经授权的登录(暴力破解攻击)
示例:尝试使用所有用户名和密码来解锁商店“员工专用后门”的门把手

/?author=1(可疑)
目的:识别用户名
示例:在前门询问“ID号为1的员工在吗?”,试图窥探员工姓名(登录用户名)

wp-config.php.bak(可疑)
用途:窃取机密信息
示例:检查包含商店“安全代码”(例如数据库密码)的备忘录备份文件(.bak)是否已被删除。

有些路径有时会被用作合法功能:
admin-ajax.php(根据上下文判断是否可疑)——这是一个合法的 WordPress 功能(例如自动保存文章、动态处理等)。如果访问量异常高,则可能被用于攻击。wp
-admin/profile.php(根据访问源 IP 判断是否可疑)——已登录用户查看自己的个人资料。plugins
/.../readme.txt(可能是侦察)——插件扫描。

以上只是一个例子,但访问这种明显可疑的路径非常普遍。

③ 获取通信和发布通信

我们已经讨论了一些路径,但同样重要的你使用哪种沟通方式从这些路径中获取信息
我想谈谈常见的“获取信息沟通”和“发布信息沟通”。

GET 通信(图片:明信片)
用途:请求信息。(例如:显示页面,查看信息,使用 /?author=1)
特点:发送的信息附加在 URL 中(例如 ?author=1)。由于信息完全可见,因此无法发送重要信息。

POST 通信(图片:信封里的信件)
用途:请求他人接收信息(例如,登录、提交表单)
特点:待发送的信息(ID 和密码)可以隐藏在信封中发送。信息不会在 URL 中显示。

为什么这很重要?
在这个研究案例中,针对 /wp-login.php(后门)的攻击必须隐藏重要信息“ID 和密码”,因此它们总是使用 POST 请求。
如果您查看日志,发现GET 请求您可以得出结论:
“这很可能是一次扫描,而不是攻击 反之如果存在大量 POST 请求您可以得出结论: 这可能是一次暴力破解攻击!

③ 状态码

看看服务器如何响应。

# 访问次数 状态码
6821 404 <-- 大部分访问不存在的文件
153 500 <-- 服务器内部发生错误
112 403 <-- 访问被拒绝
35 200 <-- 正常访问

4xx (未找到)或5xx
则表明访问失败。4xx表示 Web 服务器仍能返回错误,而5xx表示服务器无法响应(即程序抛出错误),这会降低服务器速度并造成负载。

如果对可疑访问返回 200 OK(正常)状态码呢?

这里需要注意的是 200 OK(请求成功)。
成功仅仅意味着“服务器已成功返回请求的内容”,而不是“访问是安全的”。
用商店来类比, 404 表示“保险箱密码不在这里”,也就是说没有答案,而表示“保险箱密码已提供,请取走”。

如何解读登录攻击(wp-login.php)日志

POST /wp-login.php200 OK(登录失败)
含义:您的用户名或密码错误。系统将重新显示登录页面。
如果这种情况反复发生,则可以断定攻击者正在进行暴力破解攻击。

POST /wp-login.php302 Found(登录成功)
含义:身份验证成功!您将被重定向到后台管理面板 (/wp-admin/)。
如果攻击 IP 地址返回 302 状态码,则表明您的网站已被攻击者入侵,这是一个危险的信号。

因此,如果您在访问可疑路径时看到 200 OK 或 302 Found 响应,这攻击开始成功,因此您应该更加仔细地调查。

还有许多其他类型的状态码,请参阅下面的文章了解更多详情。

【需要记住的事情】HTTP状态码错误的简单解释,以供温习和温习。

【需要记住的事情】HTTP状态码错误的简单解释,以供温习和温习。

④ 用户代理

最后,看看你是用什么方式访问它的。

# 用户代理示例
"Mozilla/5.0 (compatible; DotBot/1.2; ...)"
"Mozilla/5.0 (... compatible; Google-Read-Aloud; ...)"

当您在日志中“bot”“crawler”也存在
恶意爬虫程序此外,如果日志中出现异常字符,或者访问权限明显偏向特定用户代理,则可能表明正在遭受攻击

信息量很大,可能会让人感到疲惫……
但粗略地说,根据以上信息,我们可以确定服务器负载是否由访问引起,以及哪些类型的访问可以被认为是“可疑的”。

如何处理可疑访问?

在实际处理这个问题时,你需要与客户达成协议,但这里有一些处理此类问题的典型例子。

① 屏蔽 IP 地址(最快的方法)

经过调查,我们发现异常多的访问来自特定的 IP 地址(例如 192.0.2.115),因此最快的解决方法是阻止来自该地址的访问。

屏蔽方法因环境而异。
在 Nginx 中,您可以在配置文件中添加 `deny 192.0.2.115;`;在 Apache 环境中,您可以使用 `.htaccess` 文件进行限制。如果您在前端部署了操作系统防火墙或 Web 应用防火墙 (WAF),也可以在那里进行屏蔽。

② 限制对特定路径的访问

攻击者会以“仅限员工访问的后门(例如wp-login.php 至关重要

例如,您可以在 Nginx 配置文件中添加一条设置,内容为“只有贵公司的 IP 地址才能访问
wp-login.php *请注意,具体写法会因 Nginx 版本而异!

location = /wp-login.php {
# 仅允许您的 IP 地址
allow 1.2.3.4;
# 拒绝所有其他地址
deny all;

# 不要忘记在 PHP 中
添加 fastcgi_params;
fastcgi_pass unix:/run/php-fpm/www.sock;
}

对于您不希望从未指定数量的 IP 地址访问的路径(例如,仅用于攻击的 xmlrpc.php),使用 deny all 可以有效地使其从一开始就完全不可见。

概括

你觉得怎么样?

我以前很讨厌访问日志,但研究了一年之后,我逐渐能够读懂它们了。我希望这篇文章
能对那些正在努力研究访问日志的人有所帮助。

感谢您读到最后🌷

参考网站:
如何查看 Linux 访问日志 | 简明易懂地讲解如何查找、查看以及
使用示例 | 解释用于简化日志阅读的“grep”和“awk”命令 |
[案例研究] WordPress 网站遭篡改后的恢复和应对措施 |
学习 HTTP 请求的基础知识:GET 和 POST 的区别 |
在管理面板上设置访问限制,作为 WordPress 安全措施

如果您觉得这篇文章有帮助,请点赞!
1
加载中...
1 票,平均:1.00 / 11
23
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

帕鲁

系统解决方案系第 24 届毕业生
我未来的梦想是租一个稍大一点的房间并养一只猫。