最近有人问我“是什么原因导致我们的 access.log 中出现这样的行?”
59.56.109.181 - - [22/Feb/2010:16:03:35 -0800] “获取http://www.google.com/HTTP/1.1” 200 295“-” “Mozilla/5.0(兼容;MSIE 5.01;Win2000)”
我立即回答说,这是有人在探索一些有点狡猾的东西。
但:
- 怎么办?推测... 一个简短的 perl 或 python 脚本可以轻松连接并请求具有无效主机的 URL。
- 漏洞?人们这样做是为了什么?他们学到了什么?我们应该修补它吗?
- 我是否需要戴一顶锡箔帽来阻止他们读懂我的心思?
- 对我来说真正的问题是:这难道不应该是 404 响应,而不是 200 响应吗?
这是在标准 LAMP 服务器(Ubuntu)上。
答案1
也许你想读http://wiki.apache.org/httpd/ProxyAbuse
特别是这一点:“我的服务器已正确配置为不使用代理,那么为什么 Apache 返回 200(成功)状态代码?”,它会问你的问题“这不应该是一个 404 响应,而不是 200!?”
如果 apache 配置没问题,它只会发送根页面。这是因为您获得的状态代码是 200。
答案2
我认为如果有人尝试将服务器用作代理,就会发生这种情况。这会使 http://... URL 变得“正常”(而不是您期望从常规服务器请求中获得的路径部分)。
至于 200 状态代码,那...呃...好吧,我的服务器也是这样。它似乎忽略了http://主机名部分并使用剩余路径从本地服务器返回结果。您可能必须仔细研究 RFC 才能弄清楚为什么这样做有意义;我不知道答案。
答案3
假设你没有使用你的服务器作为代理,这些可能是代理滥用在面向互联网的网络服务器上经常看到。
收到状态代码 200 的请求可能返回了您的索引页。您可以使用以下方法检查telnet
或者curl
。
假设:
您的服务器名称是
site.example.org
;第三方正在尝试连接
news.example.net
和search.example.com
;您的
/index.html
文件包含:<!DOCTYPE html> <html> <head><title>It works!</title></head> <body><h1>It works!</h1></body> </html>
使用卷曲,您可以像这样重建收到的请求:
$ curl site.example.org --request-target http://news.example.net/
<!DOCTYPE html>
<html>
<head><title>It works!</title></head>
<body><h1>It works!</h1></body>
</html>
使用远程登录,您可以像这样重建收到的请求:
$ telnet site.example.org 80
> GET http://news.example.com/ HTTP/1.1
> Host: news.example.com
>
HTTP/1.1 200 OK
...
Content-Type: text/html
...
<!DOCTYPE html>
<html>
<head><title>It works!</title></head>
<body><h1>It works!</h1></body>
</html>
如果您收到index.html
结果,则表示您的服务器未配置为代理,您不必担心这些请求。
如果您确实收到了内容,news.example.com
或者news.example.net
您的 Web 服务器配置为代理。您可以通过注释proxy on;
Nginx 配置中的任何行或在mod_proxy
Apache 配置上禁用来停用此功能。
关于此的一些有趣的参考资料: