关注我们

Web中间件之Nginx篇

LzersLzers 安全快讯 2018-04-12 654111 0

Web中间件学习篇

本篇主要从IIS、Apache、Nginx、Tomcat四种常见中间件的Nginx入手,介绍相关安全知识,遵循“中间件简介→如何搭建网站→安全配置分析→安全日志分析”的顺序进行学习,旨在梳理常见Web中间件的知识点,为Web安全学习打好基础。

Nginx简介

Nginx(发音同engine x)是一个网页服务器,它能反向代理HTTP, HTTPS, SMTP, POP3,IMAP的协议链接,以及一个负载均衡器和一个HTTP缓存。 Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。与旧版本(<=2.2)的Apache不同,nginx不采用每客户机一线程的设计模型,而是充分使用异步逻辑,削减了上下文调度开销,所以并发服务能力更强。 起初是供俄国大型的门户网站及搜索引擎Rambler(俄语:Рамблер)使用。此软件BSD-like协议下发行,可以在UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操作系统中运行。

Nginx站点搭建

Nginx站点的搭建其难点在于安装Nginx,不同于Apache可以直接使用yum或者apt-get的方式安装,Nginx不在系统标准源中,因此常见的安装方式主要有两个:编译安装和第三方yum源安装。由于编译安装Nginx需要安装的拓展比较多,此次我们使用第三方yum源方式安装Nginx,同时以此为基础,搭建Linux+Nginx+Mysql+Php的站点,分为以下几步:

  1. 配置第三方yum源;

  2. 安装Nginx;

  3. 安装Mysql、php、配置phpmyadmin;

  4. 部署php站点;

下面开始详细介绍如何搭建一个完整的Nginx站点:

环境介绍

操作系统:CentOS release 6.5 (Final)Nginx版本: nginx-1.6.2-23.el6.art.x86_64站点类型:php

搭建步骤

配置第三方yum源

由于CentOS标准yum源中不提供Nginx的安装包,所以需要第三方yum源来补充一下,而第三方源的选择同样需要谨慎,不仅要保证软件要兼容本系统同时版本较新,最重要的是要保证安全,否则安装的软件可能都带着后门。此次我们选择的是Atomic源

Atomic支持哪些软件可以到这个地址查看:http://www.atomicorp.com/channels/atomic/ 最常见的有php、mysql、nginx、openvas、memcached、php-zend-guard-loader等软件。

配置步骤如下:

wget <a href="http://www.atomicorp.com/installers/atomic">http://www.atomicorp.com/installers/atomic</a>sh ./atomicyum check-update

其中在sh ./atomic一步,一路yes即可,同时安装相关拓展和依赖

yum -y install ntp make openssl openssl-devel pcre pcre-devel libpnglibpng-devel libjpeg-6b libjpeg-devel-6b freetype freetype-devel gd gd-devel zlib zlib-develgcc gcc-c++ libXpm libXpm-devel ncurses ncurses-devel libmcrypt libmcrypt-devel libxml2libxml2-devel imake autoconf automake screen sysstat compat-libstdc++-33 curl curl-devel

如果之前有安装过mysql、apache、php,需要先全部卸载

yum remove httpdyum remove phpyum remove mysql

安装Nginx

配置了第三方yum源后,安装就方便了很多

yum install nginxservice nginx startchkconfig --levels 235 nginx on ////设置2、3、5级别开机启动

此时去访问localhost或者127.0.0.1或者本机访问本机ip就可以看见nginx界面

Web中间件之Nginx篇

安装Mysql、php、配置phpmyadmin

这些其实和apache是基本相同的

yum -y install mysql mysql-server mysql-devel //安装mysql和其相关拓展chkconfig mysqld on //设置其开机启动service mysqld start //启动mysqld服务/usr/bin/mysql_secure_installation //设置mysql的一些安全配置这一步还是很重要的,主要是设置mysql的root密码,是否需要删除匿名账号等等,根据实际需要设置

此时我们可以登录一下mysql

Web中间件之Nginx篇

还有更简单的配置文件路径的查看方法,会在日志篇进行详细说明

具体的配置步骤如下:

mv /etc/nginx/nginx.conf /etc/nginx/nginx.confbak//将配置文件改为备份文件 cp /etc/nginx/nginx.conf.default /etc/nginx/nginx.conf//由于原配置文件要自己去写因此可以使用默认的配置文件作为配置文件 //修改nginx配置文件,添加fastcgi支持vi /etc/nginx/nginx.confindex index.php index.html index.htm;//加入index.php,大约在45行左右 location ~ .php$ {root /usr/share/nginx/html;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;include fastcgi_params;}//将65行--71行处关于.php文件规则的注释符号删去

Web中间件之Nginx篇

//配置/etc/php.ini,在文件末尾添加cgi.fix_pathinfo = 1

Web中间件之Nginx篇

下一步就是安装phpmyadmin,这个其实是可选步骤,只是为了方便图形化管理mysql,下载官网:phpmyadmin下载官网

在官网下载了phpMyAdmin-4.0.10.20-all-languages.tar.gz

和Apache一样,由于安装的php版本为5.4.45,低于php5.5,因此安装低版本的phpMyAdmin

tar -xvzf phpMyAdmin-4.0.10.20-all-languages.tar.gzmv phpMyAdmin-4.0.10.20-all-languages /usr/share/nginx/html/phpmyadmincd /usr/share/nginx/html/phpmyadmincp libraries/config.default.php config.inc.php

然后修改一下相关配置vi config.inc.php,一般改这些

$cfg['PmaAbsoluteUri'] = '';这里填写 phpMyAdmin 的访问网址。 $cfg['Servers'][$i]['host'] = 'localhost'; // MySQL hostname or IP address $cfg['Servers'][$i]['port'] = ''; // MySQL port - leave blank for default port $cfg['Servers'][$i]['user'] = 'root'; // 填写 MySQL 访问 phpMyAdmin 使用的 MySQL 用户名,默认为 root。 $cfg['Servers'][$i]['password'] = ''; // 填写对应上述 MySQL 用户名的密码。 $cfg['blowfish_secret'] = '1qaz2wsx3edc';//随意,长度不要太短

实际过程中其实我也只是修改了password一处为我的mysql密码,blowfish_secret其实也可以修改,否则登录后会给个警告,但是不影响使用最后重启一下nginx和php-fpm服务

service nginx restartservice php-fpm restart

打开浏览器访问http://localhost/phpmyadmin 或者 http://ip/phpmyadmin

Web中间件之Nginx篇

Nginx日志分析

和apache非常类似,nginx的主要日志也是access.logerror.log,那么该如何确认详细的路径?

执行以下命令即可

nginx -V

Web中间件之Nginx篇

看起来比apache详细多了,而且还解释了各个字段的含义。但是…所有和日志有关的内容全被注释了…所以日志是怎么记录的?难道虽然被注释了,但是还是生效的?打开/var/log/nginx/access.log看一下

Web中间件之Nginx篇

也就是说:nginx默认使用了和apache相同的组合日志格式(Combined Log Format),但是它省略了,这个就比较坑了

其实一般情况下nginx日志记录格式会如上图所示,不会注释,但是可能是我安装的方式使用第三方yum源,有些配置被修改了

如果想自定义日志的不同字段,可以参考这篇文章:nginx系列-04-nginx日志配置

同时error.log的格式在nginx.conf中若未定义,同样使用apache对于错误日志的记录级别,该句亦省略

error_log /var/log/nginx/error.log warn;

Web中间件之Nginx篇

可以看见访问日志和错误日志均会按照天压缩成.gz文件,这个在nginx.conf中并未定义,是在哪里设置的?

其实类似这种log分片压缩成不同文件的,往往由logrotate完成

logratate根据不同应用生成多个log配置文件,路径在/etc/logrotate.d/目录下

Web中间件之Nginx篇

一切使用默认配置即可,稍等片刻即可完成扫描

Web中间件之Nginx篇

典型的GET型sql注入攻击,目的是获取数据库中所有的表

xss攻击

也非常简单,直接在access日志中搜索关键字“script”

Web中间件之Nginx篇

配合前面的echo -e ,基本可以判断这是一处测试RCE漏洞的payload,于是乎想看看这个payload的原文

echo -e \x22\x5C0141\x5C0143\x5C0165\x5C0156\x5C0145\x5C0164\x5C0151\x5C0170\x5C0163\x5C0150\x5C0145\x5C0154\x5C0154\x5C0163\x5C0150\x5C0157\x5C0143\x5C0153\x22

\x是典型的16进制,\x22是双引号"的16进制,\5C是反斜杠\的16进制,所以转换一下上述字符串就是

echo -e”\0141\0143\0165\0156\0145\0164\0151\0170\0163\0150\0145\0154\0154\0163\0150\0157\0143\0153″

\0又是典型的8进制,所以接下来的问题是把8进制转换为对应字符串即可,直接转有点麻烦先转换为16进制吧

echo -e “6163756e657469787368656c6c73686f636b”

越来越短了,看见希望了,最后就是16进制转字符串,得到

echo -e “acunetixshellshock”

果然是awvs在测试shellshock(破壳漏洞),在测试命令执行,从最后漏洞扫描结果看,在我的服务器确实没找到这个漏洞,但是服务器真的没有这个漏洞吗?毕竟我是CentOS 6.5,自己跑下POC好了

env x='() { :;}; echo vulnerable' bash -c "echo this is a test "

如果输出vulnerable就说明有该漏洞,且该漏洞常见于bash版本低于4.2的主机,看一下结果

Web中间件之Nginx篇

典型的目录遍历查看/etc/passwd文件的,顺便一提由于变量会加上php后缀,所以我们要用%00来截断后缀这样才能正常显示文件内容

关于目录遍历漏洞,推荐一篇文章

浅析PHP程序中的目录遍历漏洞

尝试修改php.ini配置

还是error.log,这个payload就有点胆大妄为了,在尝试直接修改php.ini配置

Web中间件之Nginx篇

顺便一提access_log的路径为logs/access.log,完整路径为nginx根路径+logs/access.log,在我本机为/usr/share/nginx/logs/access.log,需要创建一下/usr/share/nginx/logs/目录,并改一下属主和权限

mkdir /usr/share/nginx/logschown -R nginx:root /usr/share/nginx/logschmod 644 /usr/share/nginx/logs

此时访问任意界面,POST传入相应数据,可以发现,POST请求体被记录在案啦

Web中间件之Nginx篇

第一列中既有root,又有nginx,Nginx在以Linux service脚本启动时,通过start-stop-domain启动,会以root权限运行master进程。

然后master进程读取/etc/nginx/nginx.conf文件中的user配置选项,默认这里的user=nginx,也就是用nginx用户启动worker process。且nginx.conf中会定义worker process的数量


版权声明

本文仅代表作者观点,不代表黑白网立场。
如文章侵犯了您的权利,请通过邮箱联系我们删除。
详情查看:版权纠纷
E-Mail:server@heibai.org

喜欢0评论已闭