文件上传绕过方式和中间件解析漏洞 |
您所在的位置:网站首页 › 前端绕过漏洞 › 文件上传绕过方式和中间件解析漏洞 |
文件上传绕过方式和中间件解析漏洞 对文件上传绕过方式和解析漏洞的概念性总结。文件上传部分总结自upload-labs,中间件解析漏洞复现使用vulhub环境。 c0ny1/upload-labs vulhub 0x01 漏洞类型分类客户端 js检查 服务端 检查后缀 黑名单 上传特殊可解析后缀 上传.htaccess 上传.user.ini 后缀大小写绕过 点绕过 空格绕过 ::$DATA 配合解析漏洞 Apache HTTPD 换行解析漏洞(CVE-2017-15715) Apache HTTPD 多后缀解析漏洞 Nginx 解析漏洞 IIS7.5解析漏洞 IIS6解析漏洞 双后缀名绕过 白名单 MIME绕过 %00截断 0x00截断 0x0a截断 检查内容 文件头检查 突破getimagesize() 突破exif_imagetype() 二次渲染 其他 条件竞争 0x02 绕过方式客户端 js检查在console中,破坏函数/修改js添加白名单/删除js黑名单。 使用浏览器插件禁用js。 拦截数据包修改。(如果能够拦截到数据包,说明已经通过前端检测了!) 服务端 黑名单 特殊可解析后缀黑名单规则不严谨,在某些特定的环境中,某些特殊的后缀名仍然会被当做php文件解析。 Php|php2|php3|php4|php5|php6|php7|pht|phtm|phtml 比如,黑名单禁止上传.asp|.aspx|.php|.jsp后缀文件。 但是Apache的httpd.conf配置文件中,有这样一行内容: AddType application/x-httpd-php .php .php3 .phtml 这里上传.php、.php3、.phtml后缀的文件都可以当做php文件来执行。 .htaccess绕过在Apache里,.htaccess是一个配置文件。它可以用来控制所在目录的访问权限以及解析设置。可以通过修改该文件的配置项,将该目录下的所有文件作为php文件来解析。 .htaccess可以写入apache配置信息,改变当前目录以及子目录的apache配置信息。 应用场景:黑名单没有禁止.htaccess文件上传。 绕过方法:首先上传一个.htaccess文件,.htaccess文件内容如下。如果Apache允许.htaccess文件生效,并且.htaccess文件没有被重命名。那么就可以改变当前目录以及子目录的Apache配置信息,将其他后缀的文件作为PHP文件解析。 服务端允许.htaccess文件生效,需要在httpd.conf中,修改两处配置项: Apache加载rewrite模块 LoadModule rewrite_module modules/mod_rewrite.so AllowOverride All(默认为None) .htaccess文件中有两种写法 SetHandler application/x-httpd-phpxxx.png即可作为php脚本解析 或者是 AddType application/x-httpd-php .gif.gif为后缀额度文件都当做php解析 后缀大小写绕过应用场景:没有将文件后缀统一转换为大写或者是小写,而黑名单不严谨。 绕过方式:大小写绕过 比如:禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf|.htaccess后缀文件,但是没有使用strtolower()函数。 .user.ini应用场景 服务器脚本语言为PHP,并且使用CGI/FastCGI模式,php版本>5.3.0 上传目录下要有可执行的php文件 .user.ini,它会影响php.ini中的配置,从而将指定的文件内容按php来解析,影响的范围该文件所在的目录以及子目录。需要等待php.ini中的user_ini.cache_ttl设置的时间或重启Apache才能生效,且只在php5.3.0之后的版本才生效。.user.ini比.htaccess用的更广,不管是nginx/Apache/IIS,只要是以fastcgi运行的php都可以用这个办法。如果使用Apache,则用.htaccess文件有同样的效果。 注意:.htaccess只能用于Apache。 在php.ini中,有两个新的INI指令 ; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini"; 用户自定义的php.ini文件的名字,默认是.user.iniuser_ini.filename = ".user.ini"; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes); 重新读取用户INI文件的时间间隔,默认是300秒(5分钟)user_ini.cache_ttl = 300大致意思是:我们指定一个文件(如,xxx.jpg),那么该文件就会被包含在要执行的php文件中(如index.php),类似于在index.php中插入一句:require(./xxx.jpg); 这两个设置的区别只是在于auto_prepend_file是在文件前插入;auto_append_file在文件最后插入(当文件调用exit()时该设置无效)。 利用方法: 可以上传一个这样的.user.ini auto_prepend_file = xxx.jpg然后再上传一个图片马xxx.jpg system('whoami');如果在上传目录中还有一个可执行的php文件,访问php文件,就达到了执行系统命令的效果。 总结一下:上传目录中有一个可执行的php文件,我们先上传一个.user.ini文件,这个文件的内容为auto_prepend_file=xxx.jpg。起到的作用相当于在可执行的php文件前插入图片马中的内容。然后图片马中的恶意代码也会被当做PHP解析。 补充:利用操作系统特性-Windows利用Windows对于文件和文件名的限制,以下字符放在结尾时,不符合操作系统的命名规范,在最后生成文件时,字符会被自动去除。 上传文件名服务器文件名说明file.php[空格]file.phpfile.php[.]file.php无论多少个.都可以file.php[%80-%99]file.phpBurp抓包,在文件名结尾输%80,CTRL+SHIFT+U进行URL-DECODE,或者增加一个空格,再在HEX视图中把20修改为80上传文件名服务器生成文件名内容file.php::$DATAfile.phpfile.php中的实际内容file.php::$DATA......file.php实际空格绕过应用场景:服务器为Windows平台,在对用户上传的文件名进行处理时,没有使用trim()函数去除字符串收尾处的空白字符。 利用方式:用户上传图片马时,用Burp拦截,在文件尾部加入空格。例如:xxx.jpg空格。带有空格的后缀可以绕过黑名单的检测,而文件存在在Windows服务器上,会自动去除后缀中的空格。 点绕过应用场景:Windows平台,服务端没有使用deldot()删除文件名末尾的点。 利用方式:上传名为assert.php.的文件。在Windows服务器中,后缀名之后的点,在保存时,会被自动忽略。 ::$DATA绕过应用场景:Windows平台,没有使用str_ireplace()将::$DATA替换为空,导致可以利用NTFS文件流特性。 利用方式: 假设xxx.php的内容为 上传的文件名服务器表面现象生成的文件内容xxx.php:a.jpg生成xxx.php空xxx.php::$DATA生成xxx.phpxxx.php::$INDEX_ALLOCATION生成xxx.php文件夹xxx.php::$DATA.jpg生成0.jpgxxx.php::$DATA\aaa.jpg生成aaa.jpg这里,我们上传一个名为xxx.php::$DATA的木马,然后,在浏览器中访问xxx.php。 双后缀名绕过应用场景:黑名单、使用str_ireplace()将匹配到的黑名单中的内容替换为空。 利用方式:因为仅将黑名单中的内容一次替换为空,可以重写绕过。 xxx.phphpp 配合解析漏洞这里的部分解析漏洞使用vulhub的环境进行复现。 Apache HTTPD 换行解析漏洞(CVE-2017-15715)Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。 Apache HTTPD 换行解析漏洞(CVE-2017-15715) 在index.php中,使用了黑名单对文件后缀进行检测 if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) { exit('bad file'); }上传一个名为1.php的文件,被拦截 在1.php后面插入一个\x0A(注意,不能是\x0D\x0A,只能是一个\x0A),不再拦截: 社区版Burp点击1.php后面的一个字节,然后右键->Insert byte。再将插入的00修改为0a。 访问刚才上传的/1.php%0a,发现能够成功解析,但是这个文件的后缀不是php后缀,说明目标存在解析漏洞: Apache HTTPD 多后缀解析漏洞 Apache HTTPD支持一个文件拥有多个后缀,并为不同后缀执行不同的指令。比如,如下配置文件: AddType text/html .htmlAddLanguage zh-CN .cn其给.html增加了一个media-type,值为text/html;给.cn后缀增加了语言,值为zh-CN。此时,如果用户请求文件index.cn.html,它将会返回一个中午的html页面。 以上就是Apache多后缀的特性。如果运维人员给.php后缀增加了处理器: AddHandler application/x-httpd-php .php那么,在有多个后缀的情况下,只要有一个文件含有.php后缀即将被识别为PHP文件,没有必要是最后一个后缀。利用这个特性,将会造成一个可以绕过上传白名单的解析漏洞。 访问上传目录/uploads/phpinfo.php.7z,即可发现,phpinfo被执行了,该文件被解析为php脚本。 上传完成后并未重命名。可以通过上传文件名为xxx.php.jpg或xxx.php.jpeg的文件,利用Apache解析漏洞getshell。 Nginx 解析漏洞复现 版本信息: Nginx 1.x 最新版 PHP 7.x最新版 由此可知,该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。 访问/uploadfiles/nginx.png和/uploadfiles/nginx.png/.php即可查看效果。 增加/.php后缀,被解析为PHP文件: 访问index.php可以测试上传功能,上传代码不存在漏洞,但利用解析漏洞即可getshell: 使用命令行生成图片马 1.php中的内容 copy Koala.png/b+1.php/a shell.png上传shell.png后,成功访问,在后面加上/.phpgetshell。 Web中间件漏洞总结之IIS漏洞 环境: Microsoft-IIS/7.5 PHP 5.4.45 Windows Server 2008 R2 利用条件: Fast-CGI运行模式 php.ini里cgi.fix_pathinfo=1 取消勾选php-cgi.exe程序的"invoke handler only if request is mapped to"。也就是取消勾选模块映射中的请求限制。 利用方式:在上传的文件名后面加上/.php,可以被作为PHP文件解析。 漏洞修复: 限制上传的脚本执行权限,不允许执行脚本 将php.ini的cgi.fix_pathinfo=0 在模块映射中勾选请求限制 IIS6解析漏洞编辑器漏洞手册 Web中间件漏洞总结之IIS漏洞 环境: Microsoft-IIS/6.0 Windows 2003 路径解析 原理:在.asp、.asa目录下的任意文件都会以asp格式解析 文件解析(;截断)。 原理:在IIS 6.0下,服务器默认不解析;后面的内容。 上传test.asp;.jpg会被解析为asp。 解析文件类型 原理:IIS 6.0默认的可执行文件除了asp还包含asa、cer、cdx,会将这三种扩展名文件解析为asp文件。 FCKeditor 查看编辑器版本 FCKeditor V2.6.6版本 FCKeditor/editor/filemanager/connectors/asp/config.php这里FCKeitor的版本较新,也就不能利用IIS6中;截断的漏洞。 路径解析: FCKeditor查看文件上传路径 FCKeditor/editor/filemanager/connectors/asp/connector.asp?Command=GetFoldersAndFiles&Type=Image&CurrentFolder=/ 上传路径为/FCKeditor/upFile/2021-3/image/ 利用2003路径解析漏洞上传木马 漏洞描述:利用系统2003路径解析漏洞的原理,创建类似bin.asp的目录,再在此目录中上传文件即可被脚本解析器以相应脚本权限执行。 强制建立shell.asp目录: FCKeditor/editor/filemanager/connectors/asp/connector.asp?Command=CreateFolder&Type=Image&CurrentFolder=/shell.asp&NewFolderName=z&uuid=1244789975684 建立的shell.asp目录的路径为/FCKeditor/upFile/2021-3/image/shell.asp/ 上传图片马到shell.asp目录下就可以。可以使用冰蝎server中的shell.asp,将后缀改为png。上传的shell.png到shell.asp目录下会被解析为asp脚本,用冰蝎连接。 上传路径在:FCKeditor/editor/filemanager/connectors/test.html 防御: 限制上传的脚本执行权限,不允许执行脚本 对新建目录文件名进行过滤,不允许新建包含.的文件 不允许新建目录 过滤.asp/xxx.jpg,通过ISApi组件过滤 白名单 MIME检查MIME类型是描述消息内容类型的因特网标准。 HTTP头部的Content-Type字段的内容就是MIME类型。 只需要将MIME类型修改为白名单中允许的类型即可。 比如,图片上传点,允许上传gif、jpeg、png。用Burp抓包,将HTTP头部的Content-Type字段内容修改为: Content-Type: image/gif或Content-Type: image/jpeg或Content-Type: image/png %00截断%00是chr(0),空字符。 程序会把%00当做结束符,后面的数据直接忽略掉。 在文件上传中,利用%00截断,在文件扩展名验证时,是取文件的扩展名来验证,但是最后文件保存在本地时,%00或截断文件名,只保存%00之前的内容。 应用场景:白名单、上传路径可控、php.ini中的magic_quotes_gpc为off 利用方式: 如果上传文件的路径为:用户可控的上传路径/随机数.白名单中的后缀 正常情况下,服务器拼接得到的上传路径为: $img_path = ../upload/5920201223231032.gif; 而用户在可控的上传路径中,使用%00截断后,拼接得到的上传路径为: $img_path = ../upload/xxx.php%00/5920201223231032.gif 对后缀进行白名单检测,为gif。但是保存在服务器上的文件,却是xxx.php,因为%00之后的内容被截断了。 0x00截断条件:php版本 可以看到,在IDAT数据块中,有一句话木马:,这里利用了PHP中的短开标签。 注意:使用短开标签,需要在php.ini中,将short_open_tag=On jpg:未测试成功。 其他 条件竞争条件竞争漏洞(Race condition)官方概念是“发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。 upload-labs中的Pass-17是一个典型的条件竞争上传 代码执行逻辑:先移动,后检测,不符合再删除,符合则改名字。 因此我们可以让burp一直发包,让php程序一直处于移动php文件到upload目录这个阶段 我们使用多线程并发访问上传的文件,总会有一次在上传文件到删除文件这个时间段访问到上传的php文件,一旦我们成功访问到上传的php文件,那么它就会向服务器写一个shell。 0x03 文件上传漏洞的防御服务端文件扩展名使用白名单+文件重命名 对文件内容进行检测 对中间件进行安全配置 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |