大余
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

系列文章
简介
渗透测试-地基篇
该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录地基笔记中会有很多跳跃性思维的操作和方式方法,望大家能共同加油学到东西。
请注意:
本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。
名言:
你对这行的兴趣,决定你在这行的成就!
一、前言
中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的。
可想而知中间件连接着网络和系统接触着越来越多的关键数据,渐渐成为单位公共安全中最具有战略性的资产,中间件的安全稳定运行也直接决定着业务系统能否正常使用。并且平台的中间件中往往连接数据库,而数据库储存着等极其重要和敏感的信息。如果中间件被攻破,这些信息一旦被篡改或者泄露,轻则造成企业经济损失,重则影响企业形象,甚至行业、社会安全。可见,数据库安全至关重要。所以对数据库的保护是一项必须的,关键的,重要的工作任务。
通过前几期钓鱼、内网攻防篇章落幕后,引来了服务攻防篇章之数据库渗透篇,不管在外网还是内网环境,只要存在业务系统都存在数据库,在渗透测试对数据库的知识学习是必不可少的,接下来将介绍数据库的渗透基本操作,带小伙伴们了解和学习数据库如何渗透的!
今天会讲解到学习Nginx的优缺点、作用和优势对比,Nginx安装环境和底层文件学习,Nginx攻防详解、文件解析漏洞、目录遍历、空字节任意代码执行漏洞、CRLF注入漏洞、文件名逻辑漏洞等等,最后远程代码执行控制服务器等操作,如果连Nginx都不会安装操作提权等,怎么进行下一步的研究Nginx安全!怎么拿下对方服务器?
二、简介
先看看官网介绍的目前最新版本历史情况:
1、什么是nginx?
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的第一个公开版本0.1.0发布于2004年10月4日其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名2011年6月1日,nginx 1.0.4发布!
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like协议下发行,其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好!
中国大陆使用nginx网站用户有:
百度、京东、新浪、网易、腾讯、淘宝
2、nginx有哪些优点?
(1)适用于高并发
(2)可以做负载均衡服务器和HTTP服务器
(3)代码的特点
(4)可以作为代理服务器
3、nginx用来做什么?
1)静态HTTP服务
首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。
Nginx是一款轻量级的Webserver/反向代理server以及电子邮件代理server。并在一个BSD-like协议下发行。由俄罗斯的程序设计师lgor Sysoev所开发,供俄国大型的入口站点及搜索引擎Rambler使用。
其特点是占有内存少。并发能力强。其实nginx的并发能力确实在同类型的网页server中表现较好。
Nginx相较于Apache\lighttpd具有占有内存少。稳定性高等优势,而且依靠并发能力强。丰富的模块库以及友好灵活的配置而闻名。
Nginx本身也是一个静态资源的服务器当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路!
2)反向代理服务器
(1)什么是反向代理?
客户端本来可以直接通过HTTP协议访问某网站应用服务器,网站管理员可以在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器。
(2)client(用户A)向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将推断向何处(原始server)转交请求,并将获得的内容返回给client。而client始终任务它訪问的事原始serverB而不是serverZ。因为防火墙作用。仅仅同意serverZ进出,防火墙和反向代理共同作用保护了院子资源serverB。
既然服务器可以直接HTTP访问,为什么要在中间加上一个反向代理,不是多此一举吗?反向代理有什么作用?继续往下看,下面的负载均衡、虚拟主机等,都基于反向代理实现,当然反向代理的功能也不仅仅是这些。
3、负载均衡
当网站访问量非常大,网站站长开心赚钱的同时,也摊上事儿了。因为网站越来越慢,一台服务器已经不够用了。于是将同一个应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。同时带来的好处是,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。
Nginx可以通过反向代理来实现负载均衡。
负载均衡也是Nginx常用的一个功能!
负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等!!
从而共同完成工作任务,简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡,而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略!!
4、虚拟主机
有的网站访问量大,需要负载均衡。然而并不是所有网站都如此出色,有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。
例如将www.aaa.com和www.bbb.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。
5、正向代理
正向代理是一个位于clientA和原始server(serverB)之间的server(代理serverZ),为了从原始server取得内容,用户A向代理serverZ发送一个请求并指定目标(serverB)。然后代理serverZ向serverB转交请求并将获得的内容返回给client。client必需要进行一些特别的设置才干使用正向代理。
用途:在防火墙内的局域网client提供訪问Internet的途径。还能够使用缓冲特性降低网络使用率。
从安全性角度讲:
正向代理同意client通过它訪问随意站点而且隐藏client自身,因此你必须採取安全措施以确保仅为经过授权的client提供服务。
反向代理对外都是透明的。訪问者并不知道自己訪问的是一个代理。
三、nginx VS Apache
相同点:
1、都是HTTPserver软件
2、功能上都採用模块化结构设计
3、都支持通用的语言接口。如PHP、Perl、Python等
4、支持正向、反向代理、虚拟主机、URL重写、压缩传输、SSL加密传输
不同点:
1、Apache处理速度非常慢。占用非常多内存资源
2、功能上,Apache全部模块支持动静态编译,Nginx模块都是静态编译的
3、对Fcgi的支持:Apache支持的非常不好,Nginx支持非常好
4、处理连接方式:Nginx支持epoll,Apache不支持
5、空间使用上:Nginx安装包仅几百K
那么在当今的使用中,nginx占据的优势:
1、作为Webserver,Nginx处理静态文件、索引文件,自己主动索引的效率很高
2、作为代理server,Nginx能够实现无缓存的反向代理加速,提高站点执行速度
3、作为负载均衡server,Nginx既能够在内部直接支持Rails和PHP。也能够支持HTTP代理server对外进行服务,同一时候还支持简单的容错和利用算法进行负载均衡
4、在性能方面,Nginx是专门为性能优化而开发的。实现上非常注重效率。它采用内核Poll模型。能够支持很多其它的并发连接。最大能够支持对5万个并发连接数的响应,并且仅仅占用非常低的内存资源
5、在稳定性方面,Nginx採取了分阶段资源分配技术,使得CPU与内存的占用率很低。Nginx官方表示。Nginx保持1万个没有活动的连接,而这些连接仅仅占用2.5MB内存,因此,类似DOS这种攻击对Nginx来说基本上是没有不论什么作用的
6、在高可用性方面,Nginx支持热部署,启动速度特别迅速。因此能够在不间断服务的情况下。对软件版本号或者配置进行升级,即使执行数月也无需又一次启动,差点儿能够做到7x24小时不间断地执行
Nginx具有非常高的稳定性;支持热部署。代码质量非常高。代码非常规范,手法成熟。模块扩展也非常easy。
四、Nginx环境安装
继续和上一期教程一样,安装小皮:
成功开启Nginx+php5
Nginx不用小皮请看:
https://zhuanlan.zhihu.com/p/83890573
https://www.runoob.com/linux/nginx-install-setup.html
五、Nginx渗透
1、文件解析漏洞
对于任意文件名,在后面添加/xxx.php(xxx为任意字符)后,即可将文件作为php解析。
1.jpg后面加上/xxx.php,会将info.jpg 以php解析:
该漏洞是Nginx配置所导致,与Nginx版本无关,下面是常见的漏洞配置:
(在C:\phpStudy\nginx\conf\nginx.conf文件中)
server {
location ~ \.php$ {
root /work/www/test;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fpm.sock;
}
}
当攻击者访问/1.jpg/xxx.php时, Nginx将查看URL,看到它以.php结尾,并将路径传递给PHP fastcgi
处理程序。
Nginx传给php的路径为 C:/phpStudy/WWW/1.jpg/xxx.php,在phpinfo中可以查看_SERVER["ORIG_SCRIPT_FILENAME"]得到。
PHP根据URL映射,在服务器上寻找xxx.php文件,但是xxx.php不存在,又由于cgi.fix_pathinfo默认是开启的,因此PHP会继续检查路径中存在的文件,并将多余的部分当作PATH_INFO。接着PHP在文件系统中找到.jpg文件,而后以PHP的形式执行.jpg的内容,并将/xxx.php存储在 PATH_INFO后丢弃,因此我们在phpinfo中的$_SERVER['PATH_INFO']看的到值为空(no value),如果继续添加后缀则顺势显示后缀!
最后理清下思路:cgi.fix_pathinfo
php的一个选项:cgi.fix_pathinfo,该选项默认开启,值为1,用于修理路径的!
例如:当php遇到文件路径/dayu.jpg/xxx.php/dayu.sec
时,若/dayu.jpg/xxx.php/dayu.sec
不存在,则会去掉最后的/dayu.sec
,然后判断/dayu.jpg/xxx.php
是否存在,若存在则将/dayu.jpg/xxx.php
当作文件/dayu.jpg/xxx.php/dayu.sec
,若/dayu.jpg/xxx.php
仍不存在,则继续去掉xxx.php
,依此类推!
修复建议
1. 配置cgi.fix_pathinfo(php.ini中)为0并重启php-cgi程序!
2. 如果需要使用到cgi.fix_pathinfo这个特性(例如:Wordpress),那么可以禁止上传目录的执行脚本权限。
或将上传存储的内容与网站分离,即站库分离。
3. 高版本PHP提供了security.limit_extensions这个配置参数,设置security.limit_extensions = .php
2、目录遍历
Nginx 的目录遍历与 Apache 一样,属于配置方面的问题,错误的配置可到导致目录遍历与源码泄露。
复现
修改C:\phpStudy\nginx\conf\nginx.conf
,在如下图所示的位置添加autoindex on
!!
再次尝试访问,即可成功:
修复on改成off即可!
3、空字节任意代码执行漏洞
影响版本:
nginx 0.5.*
nginx 0.6.*
nginx 0.7 <= 0.7.65
nginx 0.8 <= 0.8.37
Ngnix在遇到%00空字节时与后端FastCGI处理不一致,导致可以在图片中嵌入PHP代码然后通过访问xxx.jpg%00.php来执行其中的代码!
这里提供个打包好的Windows环境 Nginx 0.7.65+php 5.3.2,解压后,在Nginx目录下执行startup.bat:
然后在nginx-0.7.65/html/目录下创建1.jpg,内容为
<?php phpinfo();?>
访问1.jpg,并抓包修改为info.jpg..php:
在Hex选修卡中将jpg后面的点,更改为00:
成功绕过!
repeater一次,forword一次:
该漏洞不受cgi.fix_pathinfo影响,当其为0时,依旧解析。
测试高版本 nginx/1.11.5:
可看到不存在该漏洞!
4、CRLF注入漏洞
漏洞产生:
Nginx会将$uri
进行解码,导致传入%0a%0d
即可引入换行符,造成CRLF注入漏洞。错误的配置文件
原本的目的是为了让http的请求跳转到https上的,意思就是
配置实现了强制跳转的功能,当用户访问nginx服务器时由于此配置的存在会被强制跳转到以https协议访问之前访问的链接!
http://www.baidu.com
https://www.baidu.com
location / {
return 302 https://$host$uri;
}
1、配置中的$url是我们可以控制的,这样我们就可以在$url处填入CRLF,然后对服务器进行访问实现头部注入。
2、服务器会返回一个302跳转给用户,所以我们注入的头部参数又会返回到客户这边。
漏洞危害
劫持合法用户会话,利用管理员身份进行恶意操作,篡改页面内容、进一步渗透网站等等!!
利用CRLF Injection设置一个SESSION,造成一个“会话固定漏洞”!
原理:
Nginx会将$uri进行解码,导致传入%0a%0d即可引入换行符,造成CRLF注入漏洞!!
$uri跳转HTTPS,$uri就会产生%0a%0d换行符,换行符就一定存在CRLF注入漏洞
漏洞复现
http://127.0.0.1/%0ASet-cookie:JSPSESSID%3D36
CRLF+XSS配合:
%0D%0A%0D%0A%3Cimg%20src=1%20onerror=alert(/xss/)%3E
没弹框!为什么没弹窗?
浏览器Filter对XSS特征进行了过滤,并且浏览器进行了跳转如何阻止浏览器跳转!
原理了解:
https://www.leavesongs.com/PENETRATION/bottle-crlf-cve-2016-9964.html
https://www.leavesongs.com/PENETRATION/Sina-CRLF-Injection.html
老版本浏览器:
深入配合渗透:
CRLF深入!
攻击者去操作:
1. 攻击者先打开一个网站http://www.baidu.com,然后服务器会回复他一个session id。比如SID=abcdefg。Attacker把这个id记下了。
2. Attacker给被攻击者发送一个电子邮件,他假装是什么推销什么,诱导被攻击者点击链接http://unsafe/?SID=abcdefg,SID后面是Attacker自己的session id。
3. 被攻击者被吸引了,点击了http://unsafe/?SID=abcdefg,像往常一样,输入了自己的帐号和口令从而登录到银行网站。
4. 因为服务器的session id不改变,现在攻击者点击http://unsafe/?SID=abcdefg后,他就拥有了Alice的身份。可以为所欲为了。
5、文件名逻辑漏洞(CVE-2013-4547)
影响版本:
Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
在Windows环境下,后来发现要文件名的后面存在空格,而Windows是不允许存在此类文件的,因此这里复现,使用Vulhub的docker进行复现。而apache复现用了vulhub,直接使用即可!
sudo docker-compose build
sudo docker-compose up -d
docker ps
成功启动!
访问http://192.168.253.7:8080/info.jpg,抓包上传:
在1.jpg加入一个空格:
继续抓包info.jpg...php
修改为192.168.253.7:8080/uploadfiles/2.jpg...php,在Hex选修卡中将jpg后面的两个点2e改成20,00:
成功绕过!!
源码解析:
这个漏洞其实和代码执行没有太大关系,其主要原因是错误地解析了请求的URI,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。
Nginx匹配到.php结尾的请求,就发送给fastcgi进行解析,该源码如下:
cat nginx.conf查看该文件可以发现:
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/html;
}
正常情况下(关闭pathinfo的情况下),只有.php后缀的文件才会被发送给fastcgi解析。
而存在CVE-2013-4547的情况下,我们请求1.gif[0x20][0x00].php,这个URI可以匹配上正则.php$,可以进入这个Location块;但进入后,Nginx却错误地认为请求的文件是1.gif[0x20],就设置其为SCRIPT_FILENAME的值发送给fastcgi。
fastcgi根据SCRIPT_FILENAME的值进行解析,最后造成了解析漏洞。
所以,我们只需要上传一个空格结尾的文件,即可使PHP解析之。
修复:
1. 将$去掉即可
2. 升级版本
六、总结
今天学到了Nginx的优缺点、作用和优势对比,Nginx安装环境和底层文件学习,Nginx攻防详解、文件解析漏洞、目录遍历、空字节任意代码执行漏洞、CRLF注入漏洞、文件名逻辑漏洞,最后远程代码执行控制服务器等操作,以及整改加固建议的方式方法,学到了非常多的小技巧和干货,希望小伙伴能实际操作复现一遍!
服务攻防之数据库Mysql(上)-> 服务攻防之数据库Mysql(下)-> 服务攻防之数据库MSSQL(上)-> 服务攻防之数据库MSSQL(中)-> 服务攻防之数据库MSSQL(下)-> 服务攻防之数据库Oracle(上)-> 服务攻防之数据库Oracle(下)-> 服务攻防之数据库Redis(上)-> 服务攻防之数据库Redis(下)-> 服务攻防之数据库Mongodb(上)-> 服务攻防之数据库Mongodb(下)-> 服务攻防之中间件IIS(上)-> 服务攻防之中间件IIS(下)-> 服务攻防之中间件Apache(总)......
接下来在《服务攻防之中间件Nginx》会接触到如何进行nginx的优势,nginx搭建安装,nginx攻防详解等渗透操作,如何提权渗透等方法,请看下篇服务攻防之中间件nginx篇下章!
希望大家提高安全意识,没有网络安全就没有国家安全!
今天基础牢固就到这里,虽然基础,但是必须牢记于心。
作者:大余
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)

