该用户如何更改他的服务器 [REMOTE_ADDR]?
How did this user change his server [REMOTE_ADDR]?
过去几天我收到了数百条错误消息,看起来有人试图侵入我网站的受限部分。我们使用的一种安全机制是根据每个 IP 的点击次数进行阻止(即,如果一个 IP 每周点击此页面的次数超过 x 次)。
错误消息包括服务器转储,我可以看到黑客正试图通过更改他的 IP 地址进入。
我只是想知道...他到底是怎么做到的?!
在此处包括相关的服务器变量:
_SERVER dump:
Array
(
[CLIENTIP] => 10.0.1.92
[HTTP_X_REQUESTED_WITH] => XMLHttpRequest
[HTTP_X_FORWARDED_FOR] => -1' OR 2+819-819-1=0+0+0+1 --, 104.196.143.54
[HTTP_X_FORWARDED_PORT] => 443
[HTTP_X_FORWARDED_PROTO] => https
[REMOTE_ADDR] => -1' OR 2+819-819-1=0+0+0+1 --
//etc
)
如果仔细观察,用户插入了一个 X-Forwarded-For header(HTTP_X_FORWARDED_FOR
)。这个 header 来自外部时永远不会被信任,特别是不要将其复制到 REMOTE_ADDR
(通常包含直接连接到您的服务器的主机的 IP 地址)。
因此请确保您的服务器将 header 丢弃并且不会将其复制到任何其他字段。我不知道你的设置,但看起来你正在景观中的某个地方使用代理(在你的控制下)。 CLIENT_IP
似乎是代理 IP(但推测 w/o 知道您的确切设置)。
这个代理(或者更确切地说是最外层的系统——我称之为 前端——接受来自互联网的连接)应该负责 丢弃header 并用其直接客户的地址再次添加它——因为
- 这不能被攻击者伪造(因为他们需要将真实 IP 传递给您的服务器才能接收响应),并且
- 在从前端服务器经过 1.. 跳后,您将希望在后端记录该地址。
tl;dr: 攻击者传递了 header,通常在受信任的设置中用于传递有关 "request path" 的信息。这个 header 被你的系统接受了,看起来请求来自一些奇怪的 "IP".
此外,他们还尝试了 SQL 注入,可用于在数据库中执行任意语句(如果您没有正确分隔命令和参数)。 -1' OR 2+819-819-1=0+0+0+1
在某些情况下会导致查询返回所有结果,因为它归结为 -1' OR 1=1
,如果您的查询如下所示,这总是正确的:… WHERE foo = '-1' OR 1=1
。
过去几天我收到了数百条错误消息,看起来有人试图侵入我网站的受限部分。我们使用的一种安全机制是根据每个 IP 的点击次数进行阻止(即,如果一个 IP 每周点击此页面的次数超过 x 次)。
错误消息包括服务器转储,我可以看到黑客正试图通过更改他的 IP 地址进入。 我只是想知道...他到底是怎么做到的?!
在此处包括相关的服务器变量:
_SERVER dump:
Array
(
[CLIENTIP] => 10.0.1.92
[HTTP_X_REQUESTED_WITH] => XMLHttpRequest
[HTTP_X_FORWARDED_FOR] => -1' OR 2+819-819-1=0+0+0+1 --, 104.196.143.54
[HTTP_X_FORWARDED_PORT] => 443
[HTTP_X_FORWARDED_PROTO] => https
[REMOTE_ADDR] => -1' OR 2+819-819-1=0+0+0+1 --
//etc
)
如果仔细观察,用户插入了一个 X-Forwarded-For header(HTTP_X_FORWARDED_FOR
)。这个 header 来自外部时永远不会被信任,特别是不要将其复制到 REMOTE_ADDR
(通常包含直接连接到您的服务器的主机的 IP 地址)。
因此请确保您的服务器将 header 丢弃并且不会将其复制到任何其他字段。我不知道你的设置,但看起来你正在景观中的某个地方使用代理(在你的控制下)。 CLIENT_IP
似乎是代理 IP(但推测 w/o 知道您的确切设置)。
这个代理(或者更确切地说是最外层的系统——我称之为 前端——接受来自互联网的连接)应该负责 丢弃header 并用其直接客户的地址再次添加它——因为
- 这不能被攻击者伪造(因为他们需要将真实 IP 传递给您的服务器才能接收响应),并且
- 在从前端服务器经过 1.. 跳后,您将希望在后端记录该地址。
tl;dr: 攻击者传递了 header,通常在受信任的设置中用于传递有关 "request path" 的信息。这个 header 被你的系统接受了,看起来请求来自一些奇怪的 "IP".
此外,他们还尝试了 SQL 注入,可用于在数据库中执行任意语句(如果您没有正确分隔命令和参数)。 -1' OR 2+819-819-1=0+0+0+1
在某些情况下会导致查询返回所有结果,因为它归结为 -1' OR 1=1
,如果您的查询如下所示,这总是正确的:… WHERE foo = '-1' OR 1=1
。