上传绕过

缘由

只要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
upload.png
其中最重要的就是.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

Edit with markdown