文件上传漏洞
当文件上传点未对文件进行严格验证和过滤时容易造成任意文件上传,一些文件会导致风险,如PHP,JSP,ASP文件等,如果上传的目标目录没有限制执行权限,会导致文件上传漏洞
文件上传的必要条件:
存在上传点
可以上传动态文件(绕过)
上传文件有执行权限,并可以执行
可以访问到上传的文件
当文件上传使用前端检测的时候,我们通过抓包再修改即可以绕过大部分的限制,此处不表。
一般来说后端检测一般是检测的三个点
- 文件名(扩展名)
- MIME/content type(浏览器自动生成)
- 文件内容
MIME类型检测绕过
MIME是描述消息内容类型的因特网标准
MIME消息能包含文本,图像,音频,视频以及其他应用程序专用数据
浏览器会根据上传文件扩展名自动对应到相应的MIME类型上
所以也是在抓包后修改content type为白名单即可
文件内容检测绕过
检测文件头
- 文件开头一部分数据承担了一定的任务数据,具有固定格式,文件头的开头一般标记文件类型,如gif类型的文件头为GIF89a或者GIF87a
- 我们可以尝试在抓包或在所上传的文件中内容中加上指定的文件头格式即可完成绕过
完整文件结构检测
- 通过调用图像函数等来检测上传文件是否为预定格式,需要文件内容保持相对完整,无法通过增加头头部起始字节的方式进行绕过
- 针对这种检测,我们可以将图片与我们想要上传的文件进行合并来绕过检测(使用copy命令进行文件合并)
- 合并后的文件只要没有经过清洗或者缩放等操作即可通过检测,并保持文件上传的完整性
- 由于上传的图片在解析为php代码时会被解析为乱码,所以应当选择尽量小的图片(使用画板即可)进行合并,一下为一个copy命令实例:
copy /b 1.jpg+aaa.php 2.jpg
这样就将本目录下的1.jpg和aaa.php文件合并为了2.jpg文件
恶意文件内容检测
- 检测上传内容中是否有webshell等数据
- 需要对常见语言的webshell有一定的认知,最后能知道是拦截了什么webshell,
- 推荐使用kali中使用强混淆的weevely
逐渐尝试找到被拦截的关键字
文件上传绕过小技巧:
- 文件参数多filename属性:上传过程中,如果waf拦截了一些扩展名,我们可以尝试多个filename属性,即在上传时我们可以构造两个filename参数,因为有的wafhi只对第一个(或最后一个)进行校验,而我们最后读取到的是最后一个(或第一个)文件,这样就可以实现绕过完成上传
- 目录可控时可以尝试目录穿越的方法**(../)** ,有的时候我们上传文件成功后该目录下没有访问权限,比如过滤掉了php文件这种时候我们就可以尝试使用目录穿越的方法来回到上级目录,尝试是否能够将文件上传到上级目录并执行啊
- 具体操作为在上传时使用burp抓包,在上传文件的参数中的file 出加上/../(这是返回一级)/../../(返回两级),这是就可以实现上传了
- 如果waf有过滤连续../时可以这样:/.././../ 这样就可以了,因为./是本级目录的意思,这样也可以达到回到前两级目录的效果
00截断检测
- 00截断是存在于php较低版本(5.2之前?)中的一个漏洞,当我们使用%00时,可以恶意的截断路径,因为在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。
- 比如我们上传文件时,想要上传c.php,被黑白名单拦截,要求上传jpg格式,我们可以选择上传c.php.jpg,在抓包后将其改为c.php%00.jpg,这样上传时被当做jpg没有被拦截,但是因为有%00,所以%00后的语句被截断了,所以可以认为我们是上传了一个php文件,这样就可以拿到webshell了
- 在有的时候还可以用于上传文件目录中,以ctfhub中一道文件上传题目为例,需要使用两个截断,一个是将上传的一句话木马名称截断,一个是将设定的上传目录截断,以方便连接
这是这道题目给出的代码,可以看到,他会将上传的文件存储在一个该目录下的一个随机值加date下,这样我们无法找到并连接,所以我们需要将将上传的目录也进行00截断,这样后面的随机值就影响不到我们了,就可以上传一句话成功
.htaccess文件上传
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能,具体不表。
原理:上传覆盖.htaccess文件,重写解析规则,将上传的图片马以脚本方式解析
当用在文件上传中时,可以这样使用:
<FilesMatch "aaa.jpg"> ForceType application/x-httpd-php SetHandler application/x-httpd-php </FilesMatch>
这里的意思是对于文件 aaa.jpg,在调用他时将其转换为php格式进行执行,这样我们就可以上传一个aaa.jpg,其中的内容为一句话木马,这样就可以获取webshell了
解析漏洞
即服务器在访问静态文件时将其解析成了动态文件导致的解析错误漏洞
IIS/Nginx+PHP fastcgi取值错误解析漏洞(配置错误)
开启了cgi.fix_pathinfo,如果开启后所执行文件不存在,会继续查找上一级文件是否存在。并且未设置security.limit_extensions,该选项限制可以执行的文件类型
示例: abcde.jpg/.php
在这个目录下没有找到php文件,会返回到jpg的目录下,导致jpg文件被当做php执行
Nginx文件名逻辑漏洞(CVE-201304547)上传一个以空格(%20)结尾 文件,例如”abcd.jpg “当访问abcd.jpg%20%00.php时,会将刚刚上传的文件当做php执行(%00,%20可能需要解码)
Apache解析漏洞(配置错误)
apache的conf文件有如下配置:AddHandler application/x-httpd-php .php
则abcd.php.jpg会被当做php执行
如果在.htaccess中有如下配置,则可以将扩展名.xxx当做php执行:
AddType application/x-httpd-php xxx
IIS 5.x/6.0解析漏洞
- 上传文件名: abcd.asp;.jpg服务器默认不解析;后的内容,所以文件被当做了asp文件解析
- 向xxx.asp目录下上传文件都当做asp文件解析。
高级利用
重绘图
后端调用了图片库对上传的文件进行了图像转换,所以即使将图片和文件合并也会将尾部换掉,无法使用前面所讲的图片合并绕过,无法上传webshell
将正常图片用目标使用的图片库进行转换,
寻找转换前后两次未变的部分,
将未变部分替换为想上传的webshell
将替换后的文件进行图像转换,看是否转换后任存在替换后部分
PHPINFO与本地文件包含的利用
站点存在本地文件及包含phpinfo,可以利用其执行脚本
- PHP在解析multipart/form-data请求时,会创建临时文件,并写入上传内容,脚本执行结束或删除
- phpinfo可以输出$_FILES信息
- 通过多种方式争取时间,在临时文件删除前进行执行包含
- 在数据报文中加入大量垃圾数据,让phpinfo页面过大,导致PHP输出进入流式输出,一次不能输出完毕
- 通过大量请求来延迟PHP脚本的执行速度
在线解压缩
存在上传压缩包并解压的的上传点,可以如下利用:
将webshell打包到压缩包中,
- 模板上传处常用压缩包上传后进行自动解压
- 部分此类有检测压缩包中的内容可以尝试建立目录进行压缩
- 使用目录穿越(../)的方法向上一级目录进行上传
上传软链接
- 文件软链接链接到/etc/passwd等文件夹,达到任意文件读取
- 软链接类似windows的快捷方式
一些特性
对于windows服务器,在文件上传上有一些特性
- 自动去除文件名后的“.”,所以可以通过上传”shell.php.”进行绕过黑名单
- 自动去除文件名后的空格,所以可以通过上传后抓包在最后加上空格即可绕过黑名单
- windows操作系统建立文件会自动去除末尾::$DATA,所以在末尾加上::$DATA即可绕过黑名单。(php在windows的时候如果文件名+”::$DATA”会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持”::$DATA”之前的文件名。)