之前在Sec-News中推荐了一个开源程序 https://github.com/yandex/gixy ,作用是来检测Nginx配置文件中存在的问题。正好Pwnhub上周的比赛也出现了一道题,包含由Nginx配置错误导致的漏洞。
所以我挑选我觉得比较有趣,而且很有可能犯错误的三个典型案例,来说说Nginx配置文件的安全。
另外,本文所涉及的三个案例,均已上线到Vulhub(https://github.com/phith0n/vulhub/tree/master/nginx/insecure-configuration ),阅读本文的同时可以自己动手测试。
$uri
导致的CRLF注入漏洞
下面两种情景十分常见:
-
用户访问
http://example.com/aabbcc
,自动跳转到https://example.com/aabbcc
-
用户访问
http://example.com/aabbcc
,自动跳转到http://www.example.com/aabbcc
比如我的博客,访问http://www.leavesongs.com/other/tinger.html
,将会301跳转到https://www.leavesongs.com/other/tinger.html
。随着现在https的普及,很多站点都强制使用https访问,这样的跳转非常常见。
第二个场景主要是为了统一用户访问的域名,更加有益于SEO优化。
在跳转的过程中,我们需要保证用户访问的页面不变,所以需要从Nginx获取用户请求的文件路径。查看Nginx文档,可以发现有三个表示uri的变量:
-
$uri
-
$document_uri
-
$request_uri
解释一下,1和2表示的是解码以后的请求路径,不带参数;3表示的是完整的URI(没有解码)。那么,如果运维配置了下列的代码:
因为$uri
是解码以后的请求路径,所以可能就会包含换行符,也就造成了一个CRLF注入漏洞。(关于CRLF注入漏洞,可以参考我的老文章https://www.leavesongs.com/PENETRATION/Sina-CRLF-Injection.html )
这个CRLF注入漏洞可以导致会话固定漏洞、设置Cookie引发的CSRF漏洞或者XSS漏洞。其中,我们通过注入两个\r\n
即可控制HTTP体进行XSS,但因为浏览器认为这是一个300跳转,所以并不会显示我们注入的内容。
这个情况下,我们可以利用一些技巧:比如使用CSP头来iframe的地址,这样浏览器就不会跳转,进而执行我们插入的HTML:
关于上述利用方法,可以参考我的另一篇文章《Bottle HTTP 头注入漏洞探究》。
如何修复这个CRLF漏洞?正确的做法应该是如下:
另外,由$uri
导致的CRLF注入漏洞不仅可能出现在上述两个场景中,理论上,只要是可以设置HTTP头的场景都会出现这个问题。
目录穿越漏洞
这个常见于Nginx做反向代理的情况,动态的部分被proxy_pass传递给后端端口,而静态文件需要Nginx来处理。
假设静态文件存储在/home/目录下,而该目录在url中名字为files,那么就需要用alias设置目录的别名:
此时,访问http://example.com/files/readme.txt
,就可以获取/home/readme.txt
文件。
但我们注意到,url上/files
没有加后缀/
,而alias设置的/home/
是有后缀/
的,这个/
就导致我们可以从/home/
目录穿越到他的上层目录:
进而我们获得了一个任意文件下载漏洞。
这个有趣的漏洞出现在了Pwnhub上一期比赛《寻找 SNH48》中,@Ricter师傅的题目。
如何解决这个漏洞?只需要保证location和alias的值都有后缀/
或都没有这个后缀。
Http Header被覆盖的问题
众所周知,Nginx的配置文件分为Server、Location、If等一些配置块,并且存在包含关系,和编程语言比较类似。如果在外层配置的一些选项,是可以被继承到内层的。
但这里的继承也有一些特性,比如add_header,子块中配置后将会覆盖父块中的add_header添加的所有HTTP头,造成一些安全隐患。
如下列代码,Server块添加了CSP头:
但/test2的location中又添加了X-Content-Type-Options头,导致父块中的add_header全部失效:
此时,test2的csp就完全失效了,我们成功触发XSS:
总结
Nginx配置文件造成的漏洞绝不止这三种,比如之前特别火的解析漏洞(https://github.com/phith0n/vulhub/tree/master/nginx_parsing_vulnerability),也和Nginx的配置有一定关系。
解决这类漏洞,最根本的方法是仔细阅读官方文档,文档里说明了很多配置文件错误和正确的用法。最忌去百度网上的一些解决方法,很多错误就是一传十十传百,最后流传开来的。
另外,本文开头提到的工具gixy,我们也可以利用起来,网站上线前进行一下扫描,也许就能发现一些可能存在的问题。
参考文章:
- http://blog.volema.com/nginx-insecurities.html
- https://github.com/phith0n/vulhub/tree/master/nginx/insecure-configuration
- https://hackerone.com/reports/25275
文章作者:离别歌
- 上一篇:web安全之如何全面发现系统后台
- 下一篇:看我如何从漏洞公告入手黑掉一台打印机
猜你还喜欢
- 06-09深入理解JAVA反序列化漏洞
- 08-12cmseasy前台无需登录直接获取敏感数据的SQL注入(有POC证明)
- 11-28CVE-2017-11882漏洞复现和利用
- 11-10利用Thinkphp 5缓存漏洞实现前台Getshell
- 08-04php安全代码审计小结
- 01-02PHPCMS后台”空降”管理员CSRF漏洞分析
- 01-02某CMS注入分析及注入点总结
- 11-30PHP 函数漏洞总结
- 11-30PHP渗透中的奇淫技巧--检查相等时的漏洞
- 11-15某开源框架从注入到Getshell
- 随机文章
-
- PHP代码审计实战思路浅析
- WebExec漏洞原理与分析浅谈
- 使用DDL注入绕过Windows 10受控文件夹访问保护
- PwnedOrNot:用于查找邮件账户密码是否被泄漏的Python脚本
- 一把双刃剑?网络安全中AI该如何立足
- 现实版的黑客大战,这可能是中国黑客做过最燃的事情了
- GitHub关键字扫描开源工具推荐
- 十种进程注入技术介绍:常见注入技术及趋势调查
- 一种新型的Web缓存欺骗攻击技术
- 如何使用serviceFu这款功能强大的远程收集服务帐户凭据工具
- 缓冲区溢出漏洞(CVE-2018-4407)可导致内核崩溃,苹果多款操作系统均受影响
- SQL注入的两个小Trick与总结
- sqlmap 检测剖析
- PHP自动化白盒审计技术与实现
- 记一次对WebScan的Bypass
- 萌新学逆向:Crackme入门之基础操作分析
- 自动化反弹Shell防御技术
- 大多数路由器都存在固件缺陷使用户面临风险
- 老树开新花 | 利用Excel 4.0宏躲避杀软检测的攻击技术分析
- 物联网设备固件分析之小试牛刀
- 热门文章
-
- 八年专业安全团队承接渗透入侵维护服务
- Emlog黑客站模板“Milw0rm”发布
- Stuxnet纪录片-零日 Zero.Days (2016)【中文字幕】
- SQLMAP的注入命令以及使用方法
- 白帽故事汇:网络安全战士从来不是「男生」的专利
- 编辑器漏洞手册
- web安全之如何全面发现系统后台
- 常见Web源码泄露总结
- 渗透测试培训(第五期)
- 深入理解JAVA反序列化漏洞
- cmseasy前台无需登录直接获取敏感数据的SQL注入(有POC证明)
- 网站后台登陆万能密码
- 黑麒麟2016渗透培训系列教程
- 破解emlog收费模板“Begin”
- 那些强悍的PHP一句话后门
- Android平台渗透测试套件zANTI v2.5发布(含详细说明)
- 渗透工具BackTrack与KaliLinux全套视频教程
- Python列为黑客应该学的四种编程语言之一 初学者该怎么学
- CVE-2017-11882漏洞复现和利用
- 恶意程序报告在线查询工具
文章存档
- 2021年3月(4)
- 2020年12月(4)
- 2020年11月(5)
- 2020年10月(8)
- 2020年9月(8)
- 2020年8月(20)
- 2020年7月(47)
- 2020年6月(70)
- 2020年5月(41)
- 2020年4月(21)
- 2020年3月(120)
- 2020年2月(26)
- 2019年12月(12)
- 2019年11月(13)
- 2019年10月(17)
- 2019年9月(15)
- 2019年8月(13)
- 2019年7月(15)
- 2019年6月(15)
- 2019年5月(19)
- 2019年4月(23)
- 2019年3月(19)
- 2019年2月(11)
- 2019年1月(29)
- 2018年12月(24)
- 2018年11月(56)
- 2018年10月(79)
- 2018年9月(20)
- 2018年8月(17)
- 2018年7月(16)
- 2018年6月(7)
- 2018年5月(10)
- 2018年3月(6)
- 2018年2月(2)
- 2018年1月(11)
- 2017年11月(18)
- 2017年10月(6)
- 2017年9月(8)
- 2017年8月(7)
- 2017年7月(7)
- 2017年6月(15)
- 2017年5月(30)
- 2017年4月(7)
- 2017年3月(1)
- 2017年2月(4)
- 2017年1月(1)
- 2016年12月(3)
- 2016年11月(7)
- 2016年10月(6)
- 2016年9月(6)
- 2016年8月(102)
- 2016年7月(24)
- 2013年7月(1)
- 文章标签
-