Nginx 是最常见的 Web 服务器。本文介绍五个常见的配置错误,它们会降低网站的安全性。Nginx 错误配置如果不能及时修正,它会让你的网站陷入网络攻击的风险。
作为互联网上最常用的 Web 服务器之一,Nginx 因轻巧、模块化并且有对用户友好的配置格式而广受欢迎。Detectify 使用 Google BigQuery 分析了从 GitHub 下载的近 50000 个不重复的 Nginx 配置文件。
本文主要关注以下常见的 Nginx 错误配置:
merge_slashes
设置为 offserver {
root /etc/nginx;
location /hello.txt {
try_files $uri $uri/ =404;
proxy_pass http://127.0.0.1:8080/;
}
}
root 指令指定 Nginx 的根文件夹。在上面的示例中,根文件夹是/etc/nginx
,这意味着我们可以访问该文件夹中的文件。上面的配置没有针对/ (location / {...})
的位置,只有/hello.txt
的位置。因此,root 指令会被设置为全局,这意味着对/
的请求会将你带到本地路径/etc/nginx
。
像GET /nginx.conf
这样简单的请求都能显示存储在 /etc/nginx/nginx.conf
中 Nginx 配置文件的内容。如果将根设置为/etc
,则对/nginx/nginx.conf
的GET
请求将显示配置文件。在某些情况下,访问者可能会访问其他配置文件、访问日志甚至 HTTP 基本身份验证的加密凭据。
在我们收集的近 50000 个 Nginx 配置文件中,最常见的根路径如下:
经常配置错误的 Nginx 根路径
server {
listen 80 default_server;
server_name _;
location /static {
alias /usr/share/nginx/static/;
}
location /api {
proxy_pass http://apiserver/v1/;
}
}
这个配置错误指的是由于缺少一个斜杠,所以有可能沿路径上移一步。OrangeTsai 在 Blackhat 演讲“Breaking Parser Logic!”中让这项技术广为人知。
https://i.blackhat.com/us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out-2.pdf
在这个演讲中,他展示了如何结合一条缺少尾斜杠的location
指令与一条alias
指令,来读取 Web 应用程序的源代码。鲜为人知的是,它还可以与其他指令(例如proxy_pass
)一起使用。我们来分解一下究竟发生了什么事情,以及为什么它能起作用。
location /api {
proxy_pass http://apiserver/v1/;
}
如果一个 Nginx 服务器运行能在 server 访问的以下配置,则可以假定访问者只能访问http://apiserver/v1/
下的路径。
http://server/api/user -> http://apiserver/v1//user
当请求http://server/api/user
时,Nginx 将首先规范化 URL。然后,它会查看前缀 /api
是否与 URL 匹配,本例中是匹配的。
然后,服务器从 URL 中删除该前缀,保留/user
路径。再将此路径添加到proxy_pass
URL 中,从而得到最终 URL http://apiserver/v1//user
。
请注意,这个 URL 中存在双斜杠,因为 location 指令不以单斜杠结尾,并且proxy_pass
URL 路径以单斜杠结尾。大多数 Web 服务器会将http://apiserver/v1//user
标准化为http://apiserver/v1/user
,这意味着即使配置错误,所有内容仍将按预期运行,并且可能不会引起注意。请求http://server/api../
可以利用这种错误配置,这将导致 Nginx 请求 URL http://apiserver/v1/../
,其标准化为http://apiserver/
。这可能产生的影响取决于利用这种错误配置可以达到的效果。例如,这可能导致 Apache 服务器状态通过 URL http://server/api../server-status
公开,或者可能让不希望公开访问的路径可访问。
Nginx 服务器配置错误的一个迹象是,当 URL 中的一个斜杠被删除时,服务器仍会返回相同的响应。例如,如果http://server/api/user
和http://server/apiuser
返回相同的响应,则服务器可能容易受到攻击。这将导致发送以下请求:
http://server/api/user -> http://apiserver/v1//user
http://server/apiuser -> http://apiserver/v1/user
一些框架、脚本和 Nginx 配置会不安全地使用 Nginx 存储的变量。这可能会导致诸如 XSS、绕过 HttpOnly 保护、信息泄露,甚至在某些情况下的 RCE 之类的问题。
像下面这样的配置:
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
主要问题是 Nginx 会将所有 URL 发送到以.php
结尾的 PHP 解释器,即使该文件在磁盘上不存在。这是 Nginx 创建的“陷阱和常见错误”文档中提到的,在许多 Nginx 配置中都常见的错误。
https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#passing-uncontrolled-requests-to-php?fileGuid=xVX6hcx8WXCYPVGd
如果这个 PHP 脚本试图基于SCRIPT_NAME
定义一个基本 URL,则将发生 XSS。
<?php
if(basename($_SERVER['SCRIPT_NAME']) ==
basename($_SERVER['SCRIPT_FILENAME']))
echo dirname($_SERVER['SCRIPT_NAME']);
?>
GET /index.php/<script>alert(1)</script>/index.php
SCRIPT_NAME = /index.php/<script>alert(1)</script>/index.php
与 Nginx 变量有关的另一个错误配置是使用$uri
或$document_uri
代替$request_uri
。$uri
和$document_uri
包含标准化的 URI,而 Nginx 中的normalization
包括对 URI 解码的 URL。Volema 发现,在 Nginx 配置中创建重定向时经常会使用$uri
,结果导致 CRLF 注入。
一个易受攻击的 Nginx 配置的示例如下:
location / {
return 302 https://example.com$uri;
}
HTTP 请求的换行符为\r(回车)和\n(换行)。对换行符进行 URL 编码将导致以下字符表示形式%0d%0a
。如果将这些字符包含在对配置错误的服务器的一个请求中(例如http://localhost/%0d%0aDetectify:%20clrf
),则该服务器将使用一个名为Detectify
的新标头进行响应,因为 $uri 变量包含 URL 解码的换行符。
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.19.3
Content-Type: text/html
Content-Length: 145
Connection: keep-alive
Location: https://example.com/
Detectify: clrf
在某些情况下,用户提供的数据可以视为 Nginx 变量。目前尚不清楚为什么会发生这种情况,但如这份 H1 报告所示,这种情况并不罕见或不容易测试。如果搜索错误消息,我们可以看到它是在 SSI 过滤器模块中找到的,表明这是由 SSI 引起的。
https://hackerone.com/reports/370094?fileGuid=xVX6hcx8WXCYPVGd
一种测试方法是设置一个引用标头值:
$ curl -H ‘Referer: bar’ http://localhost/foo$http_referer | grep ‘foobar’
我们扫描了这种错误配置,发现了几个实例,用户可以在其中打印 Nginx 变量的值。我们发现易受攻击实例的数量有所下降,这可能表明这个漏洞已经做了修补。
使用 Nginx 的proxy_pass
,可以拦截后端创建的错误和 HTTP 标头。如果你要隐藏内部错误消息和标头以便 Nginx 处理,这个方法会非常有用。如果后端回答一个错误,Nginx 将自动提供一个自定义错误页面。但如果 Nginx 无法理解这是一个 HTTP 响应怎么办?
如果一个客户端向 Nginx 发送了一个无效的 HTTP 请求,则该请求将按原样转发到后端,后端将使用其原始内容来应答。然后,Nginx 将无法理解无效的 HTTP 响应,而将其转发给客户端。想象一个这样的 uWSGI 应用程序:
def application(environ, start_response):
start_response('500 Error', [('Content-Type',
'text/html'),('Secret-Header','secret-info')])
return [b"Secret info, should not be visible!"]
并在 Nginx 中使用以下指令:
http {
error_page 500 /html/error.html;
proxy_intercept_errors on;
proxy_hide_header Secret-Header;
}
如果后端的响应状态大于 300,proxy_intercept_errors 将提供一个自定义响应。在上面的 uWSGI 应用程序中,我们将发送一个500 Error
,Nginx 将拦截该错误。
proxy_hide_header 可以自解释;它将从客户端隐藏任何指定的 HTTP 标头。
如果我们发送一个普通的 GET 请求,则 Nginx 将返回:
HTTP/1.1 500 Internal Server Error
Server: nginx/1.10.3
Content-Type: text/html
Content-Length: 34
Connection: close
但是,如果我们发送一个无效的 HTTP 请求,例如:
GET /? XTTP/1.1
Host: 127.0.0.1
Connection: close
我们将收到以下答复:
XTTP/1.1 500 Error
Content-Type: text/html
Secret-Header: secret-info
Secret info, should not be visible!
默认情况下,merge_slashes 指令设置为“on”,这是一种将两个或多个正斜杠压缩为一个的机制,因此///
将变为/
。如果 Nginx 用作反向代理,并且被代理的应用程序容易受到本地文件包含内容的影响,则在请求中使用额外的斜杠可能会留出恶意利用空间。
http://nginx.org/en/docs/http/ngx_http_core_module.html#merge_slashes?fileGuid=xVX6hcx8WXCYPVGd
我们发现 33 个 Nginx 配置文件的merge_slashes
设置为“off”。
我们创建了一个 GitHub 存储库,你可以在其中使用 Docker 来设置你自己的易受攻击的 Nginx 测试服务器,以及本文中讨论的一些错误配置,然后尝试自己找到它们。
https://github.com/detectify/vulnerable-nginx?fileGuid=xVX6hcx8WXCYPVGd
Nginx 是一个非常强大的 Web 服务器平台,很好理解为什么它会被广泛使用。但是,灵活的配置意味着你更容易犯错误,而这些错误可能会对安全性产生影响。请不要使用这些常见的错误配置,以免攻击者轻易地入侵你的网站。
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/hXZJCthua5VwBftP_hO6pA
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。