缘由
只要Web应用程序允许上传文件, 就有可能将可执行文件(php,asp,aspx)等上传至服务器,得到所谓的webshell
绕过姿势
客户端绕过
客户端检测主要事通过js,禁用js或者burp抓包修改后缀都能绕过
服务端绕过
- 若服务端只检测文件类型,只需抓包,修改content-type字段为image/gif或者image/jpeg
- 若服务端只检测文件头,只需在文件头加上GIF89a等图片的标志
- 若服务端只检测文件后缀名,寻找黑名单中的漏网之鱼(cer),或者大小写绕过
中间件解析漏洞绕过
待续。。。
php.ini绕过
php.ini是php默认的配置文件,其中包括了很多php的配置,这些配置中,又分为几种:
PHP_INI_SYSTEM
PHP_INI_PERDIR
PHP_INI_ALL
PHP_INI_USER
其中最重要的就是.htaccess
和.user.ini
.htacess
提供了针对目录改变配置的方法,在Apache中使用,启用.htaccess
,需要修改httpd.conf
,启AllowOverride
.user.ini
是一个能被动态加载的ini文件,只要是以fastcgi运行的php都可以用,修改了.user.ini
后,不需要重启服务器中间件只需要等待user_ini.cache_ttl
所设置的时间(默认为300秒),即可被重新加载
如果我们能够上传图片马,但不能利用时,就可以使用上面两个文件将gif解析成php,或者php包含gif文件
上传的.user.ini
内容为
auto_prepend_file=1.gif #让所有php文件都“自动”包含某个文件
# 使用条件 在含有.user.ini的文件夹下需要有正常的php文件,否则也不能包含了
上传的.htaccess
内容为
SetHandler application/x-httpd-php
# 通过.htaccess文件调用php解释器去解释任意文件
php_value auto_append_file "1.gif"
#或者让所有php文件都“自动”包含某个文件
若上传时调用了exif_imagetype()
来检测,发现只有wbmp格式只检测文件的第一位是否为0x00.htaccess
和.user.ini
中默认以#开头的行被认为是注释行,测试可以发现以0x00开头的行也被认为是注释行
所以需要在这两个文件前加上0x00,0x0a