(1)第一种:未知扩展名解析漏洞
Apache对文件的解析主要是从右到左开始判断并进行解析,如果判断为不能解析的类型,则继续向左进行解析,如xx.php.wer.xxxxx将被解析为PHP类型。
(2)第二种:局部配置
通过分布式配置文件.htaccess文件进行局部配置,定义不同文件名及后缀的解析方式。参考《【文件上传漏洞-06】分布式配置文件攻击实验—以upload-labs-4为例》
(1)加深理解Apache的两种解析漏洞原理;
(2)掌握两种解析漏洞的检测及绕过方法。
靶场:基于WAMP环境的upload-labs靶场。其中WAMP环境的部署可参考《【语言环境】WAMP环境部署及优化—以win2008R2SP1为操作系统》、upload-labs靶场的搭建可参考《【环境搭建-03】基于WAMP环境的upload-labs漏洞靶场的搭建》,请务必将PHP版本设置为小于5.3.4版本。
攻击机:使用真实机浏览器。
(1)真实机使用浏览器访问upload-labs靶场,进入第4关。点击“显示源码”或“查看提示”可以看到部分后缀被列入黑名单,结合之前的文章中,我们可以有以下几种思路:
(2)准备上传文件。新建一个txt文件,文件内容为,并将其重命名为info.php.xxx。
(3)上传info.php.xxx文件。选择info.php.xxx,点击上传,可以看到文件已经成功上传,但是由于文件内容并非图片,所以在网页上不能成功解析。
(4)右键该图片,在新标签打开,代码执行失败(打开后一片空白,暂时找不到原因)。可以看到该文件图片的存储路径为:http://172.16.1.1/upload-labs/upload/info.php.xxx
,并没有对文件名及其后缀名进行修改。
小结
文件上传漏洞第一个条件是文件成功上传且没能过滤掉恶意代码;第二个条件是让代码执行。
对于第一个条件,存在着前端JS检测绕过、服务端MIME类型绕过、服务端后缀名绕过、文件内容绕过等,其根本目的是要上传文件。
对于第二个条件,当中间件为Apache时:
(1)优先考虑绕过后缀名时采用恶意代码能够执行的后缀,这样文件能直接执行;
(2)其次考虑利用解析顺序漏洞执行该文件;
(3)最后才是考虑通过修改局部配置来执行。
定义:在iis6.0下,分号后面的不被解析,所以xx.asp;.jpg
被解析为asp脚本得以执行。
防御:对所上传的文件重命名后再保存,比如,所上传的xx.asp;.jpg重命名为xxxxxx.jpg再保存。
定义:在网站下创建名字为.asp、.asa的文件夹,其下任何扩展名的文件都被IIS当做asp文件来解析并执行。攻击者利用该漏洞,创建文件夹并往文件夹内上传图片马,不需修改后缀名便可直接执行!
目录解析漏洞格式,例如: /xx.asp/xx.jpg。
适用版本:IIS 5.x/6.0。对于高版本暂未实验。
定义:在 iis6.0 中,默认的可执行文件除了asp还包含这三种asa、cer、cdx。
防御:黑白名单过滤时要全面。
定义:该漏洞常见于IIS7.0、IIS7.5、Nginx <8.03等中间件+PHP环境,当浏览器采用1.jpg/.php的方式访问1.jpg文件时,jpg文件会以PHP程序执行。
原因:该漏洞的产生原因与中间件无关,主要是PHP配置上CGI.fix_pathinfo参数值默认为1,将其设置为0可以避免这个漏洞。
cgi.fix_pathinfo参数作用:看名字就知道是对文件路径进行“修理”。何谓“修理”?举个例子,当php遇到文件路径“/aaa.xxx/bbb.yyy/ccc.zzz”时,若“/aaa.xxx/bbb.yyy/ccc.zzz”不存在,则会去掉最后的“/ccc.zzz”,然后判断“/aaa.xxx/bbb.yyy”是否存在,若存在,则把“/aaa.xxx/bbb.yyy”当做文件“/aaa.xxx/bbb.yyy/ccc.zzz”,若“/aaa.xxx/bbb.yyy”仍不存在,则继续去掉“/bbb.yyy”,以此类推。
加深对IIS几种解析漏洞的理解;
掌握漏洞的检验及利用方法。
(1)由于没有找到方便直接使用的靶场环境,此处新建一个网站来作为靶场。
(2)按以上步骤安装后,点击开始→管理工具→Internet(信息服务IIS)。
(3)新建网站目录upload及文件。在D盘新建目录upload,在该目录下新建txt文件,输入内容<%=time()%>
,该内容为asp语句,执行后返回当前时间,并将文件名修改为time.asp作为动态网页访问。
(4)在第2步的界面,即IIS管理器界面,先右键默认网站→停止。然后再右键网站→新建→网站→输入描述(随便写)→下一步→分配本机IP给该网站→下一步。
(5)选择网站的路径。选择刚刚新建文件的文件夹D:\upload→下一步→勾选全部权限→下一步。
(6)回到IIS管理器界面,设置新建站点的属性。右键该网站→属性→选项→启用父路径。
(7)右键Web服务扩展→在右侧找到 Active Server Gages →点击允许。
(8)在真实机浏览器,输入虚拟机IP并加上文件名访问指定文件http://172.16.1.8/time.asp
,如下,访问成功,说明实验环境搭建结束。
(1)由于没有找到方便直接使用的靶场环境,此处新建一个网站来作为靶场,并设置映像链接来处理PHP语句。
(2)在设置角色服务时,“应用程序开发”全部勾选,点下一步直到开始安装。
(3)停止默认网站。安装完成后,点击开始→管理工具→Internet信息服务(IIS)管理器IIS,打开网址,然后按如下操作将默认网址停止。
(4)建立网站目录及相关文件。在D盘下新建文件夹,本实验命名为upload,新建TXT文件,输入内容');?>
,并将文件重命名为1.jpg。
(5)新建网站upload。在IIS管理器,右键网站→添加网站→如下设置名字和路径信息(网站路径为D:\upload
)→确定。
(6)安装phpstudy8.1及扩展php5.4.45。
D:\phpstudy_pro\Extensions\php\php5.4.45nts
。(7)让IIS调用php。
(3)至此,就可以让IIS支持PHP脚本。在网站目录D:\upload下新建TXT文件,输入内容为并重命名为info.php。在真实机输入win2008虚拟机IP地址并指定文件名进行访问,可以看到文件PHP代码成功执行。
由于没有可直接利用的靶场,此处就跳过文件上传的环节,直接验证文件能否被解析。步骤如下:
(1)在win2003虚拟机中的D:\upload
目录下,复制time.asp文件(上文搭建环境时建立的文件)黏贴后重命名为time.asp;1.jpg
。
(2)在真实机浏览器,输入网址http://172.16.1.8/time.asp;1.jpg
访问time.asp;1.jpg
文件,如下。可以看到在iis6.0下,分号后面的不被解析,所以xx.asp;.jpg被解析为asp脚本得以执行。
由于没有可直接利用的靶场,此处就跳过文件上传的环节,直接验证文件能否被解析。步骤如下:
(1)在win2003虚拟机中,在网站根目录下(D:\upload
)新建文件夹,命名为1.asp(1可以为任意字符,只要是.asp结尾即可),将time.asp文件(上文搭建环境时建立的文件)复制进去并重命名为time.jpg。
(2)在真实机浏览器,输入网址访问指定文件time.jpg,如下。可以看出,当文件夹名字中含有后缀.asp时,其目录内的任何扩展名的文件都被iis当做asp文件来解析并执行(.asa同理)。因此只要攻击者可以通过该漏洞直接上传图片马,并且可以不需要改后缀名!
(1)将info.php文件(上文搭建环境时建立的文件)复制黏贴并重命名为info.jpg。
(2)在真实机访问该文件,
http://192.168.1.3/info.png
,图片代码无法执行(1)方法一
(1)在win2008系统中,打开IIS管理器界面,找到搭建环境时建立的映射文件。
(2)选中该映射文件,点击右侧的编辑,点击请求限制,在限制栏下,勾选上并点击确定。
(2)方法二
将php.ini文件中的cgi.fix_pathinfo的值设置为0,并将该行代码签名的分号去掉,保存并重启phpstudy。
文件上传漏洞第一个条件是文件成功上传且没能过滤掉恶意代码;第二个条件是让代码执行。
对于第一个条件,存在着前端JS检测绕过、服务端MIME类型绕过、服务端后缀名绕过、文件内容绕过等,其根本目的是要上传文件。
对于第二个条件,当中间件为IIS时:
(1)优先考虑绕过后缀名时采用恶意代码能够执行的后缀,这样文件能直接执行;
(2)当IIS版本为5.x或6.x时,考虑利用文件解析漏洞、目录解析漏洞执行该文件;
(3)当IIS版本为7.x时,考虑利用CGI-PHP解析漏洞来执行该文件。
概述:该漏洞影响版本为:0.5*, 0.6*, 0.7 <= 0.7.65, 0.8 <= 0.8.37,版本较老。
原因:在使用PHP-FastCGI执行php的时候,URL里面在遇到%00空字节时与FastCGI处理不一致,导致可以在非PHP文件中嵌入PHP代码,然后通过访问xxx.jpg%00.php
来执行其中的代码。
概述:该漏洞影响版本为: Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7,范围较广。
原因:这个漏洞其实和代码执行没有太大关系,其主要原因是错误地解析了请求的URI,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。
漏洞产生过程:
1.gif[0x20][0x00].php
,这个URI可以匹配上正则 .php$
,可以进入这个Location块;但进入后,由于fastcgi在查找文件时被\0截断,Nginx却错误地认为请求的文件是1.gif[0x20]
,就设置其为SCRIPT_FILENAME的值发送给fastcgi。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;
}
概述:该漏洞常见于IIS7.0、IIS7.5、Nginx <8.03等中间件,当浏览器采用1.jpg/.php
的方式访问1.jpg文件时,jpg文件会以PHP程序执行。
原因:该漏洞的产生原因与中间件无关,主要是PHP配置上CGI.fix_pathinfo参数值默认为1,将其设置为0可以避免这个漏洞。
cgi.fix_pathinfo参数作用:看名字就知道是对文件路径进行“修理”。何谓“修理”?举个例子,当php遇到文件路径“/aaa.xxx/bbb.yyy/ccc.zzz”时,若“/aaa.xxx/bbb.yyy/ccc.zzz”不存在,则会去掉最后的“/ccc.zzz”,然后判断“/aaa.xxx/bbb.yyy”是否存在,若存在,则把“/aaa.xxx/bbb.yyy”当做文件“/aaa.xxx/bbb.yyy/ccc.zzz”,若“/aaa.xxx/bbb.yyy”仍不存在,则继续去掉“/bbb.yyy”,以此类推。
(1)加深对Nginx几种解析漏洞的理解;
(2)掌握漏洞的检验及利用方法。
(1)在虚拟机安装CentOS系统,可以参考文章《【Linux系统】第1节 CentOS7虚拟机安装》。
(2)部署Vulhub靶场环境。参考文章《【环境搭建-04】CentOS上搭建Vulhub靶场》。
(3)需要不同靶场环境时,在官网查询相关靶场路径,进入对应路径进行实验即可。
暂时没有找到Nginx空字符漏洞环境,无法进行实验,仅简要描述该漏洞攻击的方式,以后有机会时间再练习。
(1)步骤一,以图片马的方式提交文件以绕过。
(2)步骤二,访问所上传的文件时,在文件后加上%00.php
让服务器以PHP形式执行该文件,如IP+info.jpg%00.php
。
(1)参考Vulhub官网关于该漏洞的使用介绍,使用命令cd /usr/vulhub/nginx/CVE-2013-4547
进入靶场安装目录(根据自己安装的位置灵活调整)。
(2)使用命令docker-compose up -d
启动靶场。
(3)使用命令docker ps -a
查询启动的容器。可以看到所启动的容器是采用8080端口来访问的。
(1)真实机浏览器访问nginx靶场。输入URL为192.168.1.8:8080
。
(2)准备要上传的文件。文件名为phpinfo.php,内容代码为。
(3)真实机的浏览器设置代理→打开BurpSuite→在代理界面开启拦截功能。具体操作可以参考《【Burp Suite工具-2】BurpSuite工作原理及菜单栏介绍》
(4)在浏览器网页中选中phpinfo.php文件并点击提交按钮,可以看到BurpSuite成功拦截到请求,将该请求发送到Repeater模块。
(5)将BurpSuite切换到repeater模块界面,将刚刚发送过来的请求点击send,可以看到响应为上传文件失败。
(6)将文件名后缀修改为.png ,点击send,发现响应中说move_uploaded_file函数执行出错了,结合之前《文件截断绕过攻击实验》中对该函数的了解,其出错可能是路径出了问题或是写入权限出了问题,但是在该实验中其实是SELinux设置的问题,相关解决方案参考文章《CentOS7部署Vulhub靶场后,在启动漏洞容器时弹出SELinux警告,致使网站无法正常执行文件上传功能》。
(4)经过上面文章设置之后,接着继续实验。
(4)重新回到浏览器→重新上传文件→将拦截到的请求再次将请求发送到repeater模块→将文件名修改为png后缀,并点击发送。可以看到右侧文件成功上传,说明靶场环境搭建成功。
(1)在BurpSuite中的Repeater模块,将请求中文件的后缀名png后面再加一个空格,并点击发送。可以看到文件成功上传,且后缀带有空格。
(2)关闭BurpSuite中Proxy模块中的拦截功能,使用火狐浏览器输入网址:http://192.168.1.8:8080/uploadfiles/phpinfo.png
访问刚刚上传的文件,可以看到文件是存在的,但是由于不是图片格式所以显示不了。
(3)本来想使用BurpSuite拦截上述中的请求,不知道为什么拦不到,只能先复制上面浏览器访问时的URL,然后在repeater模块中新建一页,右键点击"Paste URL as request"。
(4)点击后出现以下请求,点击发送收到响应。可以看到响应正常并回显了文件的内容,但是由于后缀名格式问题并没有执行。
(5)在BurpSuite中的Repeater模块,在请求的文件后缀加上 ..php
,注意最前面是一个空格,点击发送手动响应如下,没有找打对应的文件。
(6)在BurpSuite中的Repeater模块,将请求切换到十六进制模式,修改第一个点对应的值变为空字符,原理类似空字符截断,发送后可以看到响应中执行了文件代码。
(1)参考Vulhub官网关于该漏洞的使用介绍,使用命令cd /usr/vulhub/nginx/nginx_parsing_vulnerability
进入靶场安装目录(根据自己安装的位置灵活调整)。(若之前启动了其他靶场,可以使用docker-compose down关闭靶场
,之后再进入目标靶场路径)。
(2)使用命令docker-compose up -d
启动靶场。
(3)使用命令docker ps -a
查询启动的容器。
(1)访问nginx_parsing_vulnerability靶场。真实机打开浏览器,输入IP:192.168.1.8
访问靶场。
(2)使用命令http://192.168.1.8/uploadfiles/nginx.png
访问靶机网站下的文件,可以看到图片正常显示。
(3)使用命令http://192.168.1.8/uploadfiles/nginx.png/.php
访问靶机网站下的文件,可以看到文件中的PHP代码被成功执行,由此也可知该图片为图片马。
将php.ini文件中的cgi.fix_pathinfo的值设置为0,并将该行代码签名的分号去掉,保存并重启phpstudy。
文件上传漏洞第一个条件是文件成功上传且没能过滤掉恶意代码;第二个条件是让代码执行。
对于第一个条件,存在着前端JS检测绕过、服务端MIME类型绕过、服务端后缀名绕过、文件内容绕过等,其根本目的是要上传文件。
对于第二个条件,当中间件为Nginx时:
(1)优先考虑绕过后缀名时采用恶意代码能够执行的后缀,这样文件能直接执行;
(2)其次,当Nginx版本较老时,比如老于小于0.8.37,考虑利用空字节解析漏洞执行该文件;
(3)最后,考虑利用CVE-2013-4547和CGI-PHP解析漏洞来执行该文件。
[《Nginx 文件名逻辑漏洞(CVE-2013-4547)》