Web安全攻防学习笔记(二)

第二章 搭建漏洞环境及实战

参考 https://www.ms08067.com/


2.1 在Linux系统中安装LANMP

1、分别安装Apache,Nginx,Mysql,PHP。

2、一键安装LANMP,实现了多个安装包版本打平。

  • Zend Guard:PHP加密工具,经过加密的文件必须经过Zend才能解密返回正常页面。
  • PureFTPd:FTP空间服务。
  • phpMyAdmin:利用Web页面管理Mysql数据库服务。

Centos兼容比较好,一般用于做服务器,如果是Kali和Ubuntu等系统安装失败可以尝试切换shell为bash。

什么是bash ?

Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等。

GNU/Linux 操作系统中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符号链接,但鉴于 bash 过于复杂,有人把 bash 从 NetBSD 移植到 Linux 并更名为 dash (Debian Almquist Shell),并建议将 /bin/sh 指向它,以获得更快的脚本执行速度。Dash Shell 比 Bash Shell 小的多,符合POSIX标准。

Debian和Ubuntu中,/bin/sh默认已经指向dash,这是一个不同于bash的shell,它主要是为了执行脚本而出现,而不是交互,它速度更快,但功能相比bash要少很多,语法严格遵守POSIX标准。

如果执行失败可以切换成bash再试试。

2.2 在Windows系统中安装WAMP

WAMP是windows中的Apache、Mysql和PHP环境,比如WampServer。

问题一:缺失MSVCR110.dll,去https://www.zhaodll.com/dll/ 下载,分别移动到C:\Windows\System32和C:\Windows\SysWOW64目录下。

问题二:Apache启动失败,先卸载Apache,重新安装Apache服务并启动。

Apache作为PHP的Server,也可以利用Nginx作为Server。

PHP的allow_url_include开关(禁止引用URL文件,预设关闭。主要涉及文件包含漏洞)和allow_url_fopen开关(允许打开URL文件,预设启用):

禁止allow_url_include解决了远端引用(Include)的问题, 同时又让我们还可以在一般的情形下使用fopen去打开远端的档案, 而不必再牵连上打开include函数所带来的风险。

allow_url_include只影响include()require()。

php是apache的一个外挂程序,必须依靠web服务器才可以运行。当客户端浏览器触发事件--->php程序提交到apache服务器---->apache服务器根据php程序的特点判断是php程序,并从内存或者硬盘中提取访问所需要的应用程序,将其提交给php引擎程序--->php引擎程序解析并读取数据库生成相应的页面--->php引擎将html页面返回给web服务器,web服务器再将页面返回给客户端。 

cgi和fastcgi两个协议。CGI:common gateway interface,是web server与后台编程语言交互的一种协议。有了这个协议,开发者可以使用任何语言处理 Web Server 发来的请求,动态的生成内容。但 CGI 有一个致命的缺点,那就是每处理一个请求都需要 fork 一个全新的进程,随着 Web 的兴起,高并发越来越成为常态,这样低效的方式明显不能满足需求。就这样,FastCGI 诞生了,CGI 很快就退出了历史的舞台。FastCGI,顾名思义为更快的 CGI,它允许在一个进程内处理多个请求,而不是一个请求处理完毕就直接结束进程,性能上有了很大的提高。

PHP-CGI是PHP自带的FASTCGI管理器,但有很多的缺点。FPM同样也是fastcgi的实现,相比php-cgi有很多的优点。到了PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,只需要在./configure时,加上--enable-fpm。

FPM 是一个 PHP 进程管理器,包含 master 进程和 worker 进程两种进程:master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个 (具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

从 FPM 接收到请求,到处理完毕,其具体的流程如下:

  1. FPM 的 master 进程接收到请求;
  2. master 进程根据配置指派特定的 worker 进程进行请求处理,如果没有可用进程,返回错误,这也是我们配合 Nginx 遇到502 Bad Gateway错误比较多的原因
  3. worker 进程处理请求,如果超时,返回504错误 网关超时(Gateway timeout)
  4. 请求处理结束,返回结果。

Nginx 不仅仅是一个Web 服务器,也是一个功能强大的Proxy 服务器,除了进行http 请求的代理,也可以进行许多其他协议请求的代理,包括本文与fpm 相关的fastcgi 协议。为了能使Nginx 理解fastcgi 协议,Nginx 提供了fastcgi 模块来将http 请求映射为对应的 fastcgi 请求。

Nginx 的fastcgi 模块提供了fastcgi_param 指令来主要处理这些映射关系,除此之外,非常重要的就是 fastcgi_pass 指令了,这个指令用于指定 fpm 进程监听的地址,Nginx 会把所有的 php 请求翻译成 fastcgi 请求之后再发送到这个地址。

location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/www.sock;
       #fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;

}

在这个配置文件中,/tmp/www.sock  是php-fpm监听的socket文件,nginx通过location将所有的php文件,即http请求都交给fpm处理,实现了nginx和php的协同工作。

换言之,nginx就是作了fastcgi的一个代理,用fastcgi的方式结合使用了php。所以,需要开启php-fpm服务。

当然Nginx作为一个代理,挂在Apache前面也是可以的。

Nginx + PHP 第一种是利用CGI让NGINX和PHP进行通信
Nginx + Apache(https://httpd.apache.org/) + PHP 第二种是静态资源是NGINX,动态资源让APACHE里的MOD_PHP模块来实现PHP。

二种都是NGINX在前端80端口,作为一个反向代理服务器。当然第二种情况下可以不挂Nginx。

如果单台服务器的话,NGINX+APACHE+PHP 纯粹多此一举,多了一次请求转发,效率肯定低,而且现在FPM已经足够稳定,完全没必要。

只有多台服务器集群的话,apache+nginx反代才有意义。NGINX+APACHE+PHP 这种架构存在的原因除了apache出现比较早外,还因为当时FPM不如module模式稳定(所以现在基本淘汰apache的架构了)。

Nginx在前面实现动静分离,静态内容由Nginx负责,动态请求则交给后面的 PHP应用服务器Apache(libphp5.so)处理。
 

Nginx+PHP-FPM相对Nginx+Apache(libphp5.so)来说,PHP-FPM更灵活,在php-fpm.conf里可以配置监听不同端口的多个pool,每个pool又可以自由配置PHP-FPM worker进程数pm.max_children,一个pool里的worker进程繁忙不会影响到另一个pool。在Nginx里可以配置应用的不同部分使用不同的pool,而且一台服务器上可以运行多个版本的PHP-FPM,借助Nginx的upstream功能,PHP-FPM非常容易横向扩展

新浪微博和百度贴吧都在使用Nginx+PHP-FPM的架构(百度内部老服务大多也是这种架构,新的都不用PHP,哈哈),PHP-FPM已经足够稳定。

Web安全攻防学习笔记(二)_第1张图片

Apache Tomcat则是Apache基金会下的另外一个项目,与Apache HTTP Server/Nginx(只能生成静态资源)相比,Tomcat能够动态的生成资源并返回到客户端。 

Apache HTTP Server和Nginx本身不支持生成动态页面,但它们可以通过其他模块来支持(例如通过Shell、PHP、Python脚本程序来动态生成内容)。

如果想要使用Java程序来动态生成资源内容,使用这一类HTTP服务器很难做到。Java Servlet技术以及衍生的Java Server Pages技术可以让Java程序也具有处理HTTP请求并且返回内容(由程序动态控制)的能力,Tomcat正是支持运行Servlet/JSP应用程序的容器(Container)。

严格的来说,Apache/Nginx 应该叫做「HTTP Server」;而 Tomcat 则是一个「Application Server」,或者更准确的来说,是一个「Servlet/JSP」应用的容器(Ruby/Python 等其他语言开发的应用也无法直接运行在 Tomcat 上)。

一个 HTTP Server 关心的是 HTTP 协议层面的传输和访问控制,所以在 Apache/Nginx 上你可以看到代理、负载均衡等功能。客户端通过 HTTP Server 访问服务器上存储的资源(HTML 文件、图片文件等等)。通过 CGI 技术,也可以将处理过的内容通过 HTTP Server 分发,但是一个 HTTP Server 始终只是把服务器上的文件如实的通过 HTTP 协议传输给客户端。

而应用服务器,则是一个应用执行的容器。它首先需要支持开发语言的 Runtime(对于 Tomcat 来说,就是 Java),保证应用能够在应用服务器上正常运行。其次,需要支持应用相关的规范,例如类库、安全方面的特性。对于 Tomcat 来说,就是需要提供 JSP/Sevlet 运行需要的标准类库、Interface 等。
Apache是通过扩展模块PHPcgiperl实现PHP的解析。如果要在Apache环境下运行JSP的话就需要一个解释器来执行JSP网页,而这个JSP解释器就是Tomcat。

Web安全攻防学习笔记(二)_第2张图片

Nginx与Apache比较

1) nginx相对于apache的优点

轻量级,同样起web 服务,比apache占用更少的内存及资源

抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能

高度模块化的设计,编写模块相对简单

提供负载均衡

社区活跃,各种高性能模块出品迅速

2) apache 相对于nginx 的优点

apache的 rewrite 比nginx 的强大;

支持动态页面;

支持的模块多,基本涵盖所有应用;

性能稳定,而nginx相对bug较多。

3)两者优缺点比较

Nginx 配置简洁, Apache 复杂;

Nginx 静态处理性能比 Apache 高 3倍以上;

Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端用;

Apache 的组件比 Nginx 多;

apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程;

nginx处理静态文件好,耗费内存少;

动态请求由apache去做,nginx只适合静态和反向;

Nginx适合做前端服务器,负载性能很好;

Nginx本身就是一个反向代理服务器 ,且支持负载均衡

2.4 搭建SQL注入平台

靶场。sqli-labs。

2.5 XSS测试平台

xsser.me 网站。

你可能感兴趣的:(网络安全,网络协议)