文件上传复现
文件上传漏洞的概念
在现代互联网的web应用程序中,上传文件是一种常见的功能,因为它有助于提高业务效率,比如社交 网站中,允许用户上传图片、视频、头像和许多其他类型的文件。然而向用户提供的功能越多, web应 用受到攻击的风险就越大,如果web应用存在文件上传漏洞,那么恶意用户就可以利用文件上传漏洞将 可执行脚本程序上传到服务器中,获取网站的权限,或者进一步危害服务器。
为什么文件上传存在漏洞?
上传文件时,如果服务器代码未对客户端上传的文件进行严格的验证和过滤,就容易造成可以上传任意 文件的情况,包括上传脚本文件(asp、aspx、 php、jsp等格式的文件)。
IIS
SQLserver
会造成什么危害?
非法用户可以利用上传的恶意脚本文件控制整个网站,甚至控制服务器。这个恶意的脚本文件,又称之 为webshell,也可将webshell脚本称为一种网页后门, webshell脚本具有强大的功能,比如查看服务器 目录,服务器中的文件,执行系统命令等。
文件上传漏洞原理和代码分析
Pass-01-前端校验
可以看到这个地方限制了后缀。
查看源码:
这个时候我们只需要将这个onsubmit事件删除就可以了。
再次提交即可。可以利用burp抓响应包,然后修改响应包。
再次提交即可拿到shell
Pass-03-黑名单
查看源码:
这个地方尝试利用burp抓包修改后缀为php5试试:
放包:
上传成功,拿到shell:
这一关的前提是在apache配置文件中有如下配置:
AddHandler application/x-httpd-php .php .php3 .php4 .php5 .phtml 当然防御也就是将上面这句配置修改为:
AddHandler application/x-httpd-php .php
docker路径
root@bf0766c132ed:/etc/apache2/conf-available# echo "AddHandler application/x- httpd-php .php .php3 .php4 .php5 .phtml" >> docker-php.conf |
Pass-10-双写
查看源码:
抓包尝试:
放包:
拿到shell:
GET-%00截断-Pass-11
00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都 是以\0(即0x00)作为字符串的结尾。操作系统在识别字符串时,当读取到\0字符时,就认为读取到了 一个字符串的结束符号。因此,我们可以通过修改数据包,插入\0字符的方式,达到字符串截断的目
的。00截断通常用来绕过web软waf的白名单限制。
产生的条件
. php版本小于5.3.29
. magic_quotes_gpc = Off 最终达到的效果:
www.xxx.com/shell.jpg www.xxx.com/shell.php%00.jpg => www.xxx.com/shell.php |
我们直接查看源码:
直接burp抓包:
获得shell:
条件竞争-Pass-17
查看源码:
代码他是先将图片上传上去,才开始进行判断后缀名、二次渲染。如果我们在上传上去的一瞬间 访问这个文件,那他就不能对这个文件删除、二次渲染。这就相当于我们打开了一个文件,然后再去删 除这个文件,就会提示这个文件在另一程序中打开无法删除。
这个地方需要对并发有一定了解才行。
总体操作是,直接上传一个php文件,利用burp抓包,然后跑一个Null payloads
然后发包,用另一个浏览器一直访问shell.php地址:
总结:
文件包含漏洞属于代码注入漏洞,为了减少重复代码的编写,引入了文件包含函数,通过文件包含函数将文件包含进来,直 接使用包含文件的代码;简单来说就是一个文件里面包含另外一个或多个文件。
但我们除了包含常规的代码文件外, 包含的任意后缀文件都会被当作代码执行,因此,如果有允许用户控制包含文件路径的 点,那么则很有可能包含非预期文件,从而执行非预期的代码导致getshell。
几乎所有的脚本语言中都会提供文件包含的功能,但文件包含漏洞在PHP Web 应用中居多,在JSP、ASP中十分少甚至没 有,问题在于语言设计的弊端。因此后续均以PHP为主。
攻击者利用包含的特性,加上应用本身对文件(包含)控制不严格,最终造成攻击者进行任意文件包含。
一句话来说就是: 文件包含并不属于漏洞,但是,由于对包含进来的文件不可控,导致了文件包含漏洞的产生。
PHP中的文件包含分为本地文件包含和远程文件包含。
LFI
本地文件包含 Local File Include (LFI)
所包含文件内容符合PHP语法规范,任何扩展名都可以被PHP解析。
所包含文件内容不符合PHP语法规范,会暴露其源代码(相当于文件读取)。
RFI
远程文件包含 Remote File Include (RFI)
如果要使用远程包含功能,首先需要确定PHP是否已经开启远程包含功能选项(php默认关闭远程包含功能: allow_url_include=off),开启远程包含功能需要在php.ini配置文件中修改。