——文件上传漏洞简介
如果不对被上传得文件进行限制或者限制被绕过,该功能便有可能会被利用上传可执行文件,
脚本到服务器上,进而进一步导致服务器沦陷。
原因导致文件上传漏洞类型:
1: 服务器的错误的配置
2: 开源编辑器漏洞。
3: 本地上传限制不严格被绕过
4: 服务端过滤不严格被绕过
——检测绕过
–客户端javascript(检测文件扩展名)绕过
在上传过程中将文件格式修改为可上传的文件格式,然后通过抓包,将文件修改为原来格式。
例如:网页需上传jpg格式文件,而我想要上传php文件,可以先将php改为jpg,然后在提交时抓包,将文件后缀再更改为php。
–服务端MIME类型检测(检查Content-Type内容)绕过
MIME检测的是数据包content-type
字段。常见的图片格式的MIME类型有:PNG:image/png,GIF:image/gif,JPG:image/jpeg
上传文件后,进行抓包,将content-type
字段修改。
–服务端目录路径(检查跟path参数有关内容)检测绕过
1、0x00截断绕过
2、在文件上传时,有的程序允许用户将文件放到指定的目录中,如果指定目录存在就将文件写入目录,若不存在则先建立目录,然后写入。
在HTML页面有一个隐藏的表单,它默认提交的文件夹名称为value
的值。使用 burpsuite 将 value 值改为 pentest.php
并提交上传一句话木马文件,如果服务器不存在此目录,则会创建此目录,然后将一句话木马写入该目录,如果是 IIS 6.0 ,则会解析网页木马。
–服务端文件扩展名检测(检测跟文件extension相关的内容)–
黑名单检测,在下面会具体讲黑名单检测绕过方式。
–服务端文件内容检测(检测内容是非合法或含有恶意代码)
1、 文件幻术检测
2、 文件相关信息检测:图像文件相关信息检测常用的就是 getimagesize()函数 只需要把文件头部分伪造好就 ok 了,
3、 文件加载检测:调用API或函数去进行文件加载测试,常见的是图像渲染测试,更变态的是进行二次渲染。
对渲染/加载测试的攻击方式是代码注入绕过。
对二次渲染的攻击方式是攻击文件加载器自身。
注意: 文件内容检测时,检测内容是否合法,有可能还会把内容敏感字符过滤掉或者转移掉,并且在自动将文件后缀名转化为某格式。我们需要通过大小写混写,双写等绕过方式来尝试绕过。
——绕过方式
——黑名单检测绕过
黑名单检测绕过:
1、 大小写组合绕过:pHp,AsP
。
2、 特殊文件名绕过:在windows下有一个特性就是如果文件后缀以点'.'
或者空格' '
,结尾的后缀名时,系统在保存文件时会自动去除点和空格,但要注意Unix/Linux系统没有这个特性。
在burp中修改,因为windows系统不被允许。
3、 修改文件扩展名时,有时候会过滤很多文件后缀名,导致无法绕过文件扩展名检测,我们可以使用畸形后缀名来绕过
,以下是畸形后缀名表:
4、 文件大小绕过:有时候会限制上传文件的大小,如果只限制最大值,我们可以尽可能用小的文件去尝试绕过,如果文件只限制最小值,我们可以往文件内容中尽可能加入垃圾信息来扩大文件的大小。
5、 0x00
截断绕过(php版本<5.3.4,php配置magic_quotes_gpc
关闭):文件名后缀有一个%00
字节,可以截断某些函数对文件名的判断。在许多语言函数中,处理字符串的函数中0x00被认为是终止符。
例如:网站上传函数处理xxx.asp%00.jpg
时,首先后缀名是合法的jpg格式,可以上传,在保存文件时,遇到%00字符丢面后面的.jpg,文件后缀最终保存的后缀名为xxx.asp
Get方式:在url中输入%00
来进行截断。
Post方式:通过burpsuite
抓包将获取包中asp后面加上一个空格' '
,通过hex编码,将空格的hex编码20
修改为00
来绕过。
6、 htaccess文件攻击:是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:
网页301重定义、自定义404错误页面,改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
如果服务器对文件名控制不够严格,通过move_uploaded_file函数把自己写的.htaccess文件覆盖服务器上的这样就可以解析定义名单了。
.htaccess文件内容:<FilesMatch "haha"> SetHadnler application/x-httpd-php </FilesMatch>
同目录中有上传一个文件名包含字符串haha,无任何扩展名的文件,里面的内容是Php一句话木马,
该文件被以php的方式来解析。
注意!: 上传文件的名字包含字符串haha,且无任何扩展名的文件
7、.use.ini配置攻击:内容为auto_prepend_file=info.jpg,作用是使php文件自动包含info.jpg文件。jpg文件可以为一个图片马
8、::$DATA
绕过:在后缀名上加上::$DATA
::$DATA
作用:php在windows中如果文件名+"::$DATA
“会把::$DATA
之后的数据当成文件流处理,
不会检测后缀名.且保持”::$DATA
"之前的文件名(Windows文件流特性)
7、 解析调用/漏洞绕过:这类漏洞直接配合上传一个代码注入过的非黑名单文件即可,再利用解析调用/漏洞。
——白名单绕过:
1、 0x00截断绕过:用像test.asp0x00.jpg的方式进行截断,属于白名单文件。
2、 解析/php文件包含漏洞绕过:这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析/包含漏洞。
——文件幻术检测绕过:
图像相关的信息检测常用getimagesize()
函数。每种类型的图片内容最开头会有一个标志性的头部,这个头部被称为文件幻术。
绕过jpg文件幻术检测要在文件开头上写下图的值:value=FF D8 FF E0 00 10 4A 46 49 46
绕过png文件幻术检测要在文件开头上写下图的值:value=89 50 4E 47
绕过gif文件幻术检测要在文件开头上写下图的值:value=47 49 46 38 39 61
然后在最后面加上一句话木马即可。
——对渲染/加载测试的攻击方式是代码注入绕过
用图像处理软件对一张图片进行代码注入,用winhex看数据可以分析出这类攻击的原理是:在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般会是图片的注释区。
对于渲染测试基本上都能绕过,毕竟本身的文件结构是完整的。
——对二次渲染的攻击方式是攻击文件加载器自身
二次渲染是把原本属于图像数据的部分抓了出来,再用自己的API或函数进行重新渲染,在这个过程中,非图像数据的部分直接被隔离开,一句话木马消失。
对文件加载器进行攻击,采用溢出攻击,上传自己的恶意文件后,服务器上的文件加载器会主动进行加载测试,加载测试时被溢出攻击执shellcode。
gif二次渲染绕过: 比较16进制下的上传前后的gif代码,哪一部分上传前后位置相同,就在此部分插入php。
jpg,png二次渲染绕过: 在相对路径使用脚本执行jpg,png图像, php jpg_payload.php 1.jpg 生成带有代码的图片上传绕过二次渲染。
在相对路径使用脚本执行图像的方法:
首先我们需要一个能绕过二次渲染的php
文件脚本,然后将php
加入到环境变量中,在cmd中用命令:php 脚本名 图像名
,即可成功
——解析漏洞
Apache解析漏洞: 一个文件名为test.php.aaa.bbb.ccc的文件,Apache会从CCC的位置往php的位置开始尝试解析,如果CCC不属于Apache能解析的后缀名,那么Apahce就会尝试去解析BBB,这样一直往前尝试,知道遇到一个能解析的拓展名为止。
IIS解析漏洞: IIS 6.0有两个解析漏洞,一个是如果目录名包含asp、.asa、.cer字符串,那么这个目录下所有的文件都会按照asp去解析
另一个是只要文件名中含有.asp、.asa、.cer会优先按asp来解析。
IIS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞,对任意文件名只要在URL后面写上字符串"/任意文件名.php”就会按照php的方式去解析。
Nginx解析漏洞: 一个是对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是text.jpg
,可以添加为test.jpg/x.php
进行解析攻击。
一个是对低版本的Nginx可以在任意文件名后面添加%00.php
。
在代码层上不能突破,配合 这些解析漏洞来使用。
——检测步骤
1: 寻找上传点:网站前台的上传点一般有头像上传、附件上传、证件认证上传。如果通过sql注入或者其他一些技术手段得到网站后台权限,一般在网站更新页面的地方会存在上传点。
也可以通过敏感目录或文件扫描工具扫到一些开源编辑器的测试上传页面等等。
2: 找到上传点之后,先上传一张正常的图片测试该上传点时候可用。
3: 上传一张正常的图片,抓包修改文件后缀名为对应网站脚本语言。
该操作可通过前端检测,MIME检查、文件内容检测,可以检测出网站是否对上传文件进行了文件后缀名的检测。
如果上传成功表示没有对文件后缀进行检测,可以进一步上传图片马,抓包修改文件后缀为对应网站脚本语言即可获取webshell
如果上传失败表示对文件名后缀进行了检测,需要进一步判断是黑名单检测还是白名单检测。
4: 上传一张正常的推按,在它后缀随便添加几个字符进行上传。
eg:"1.jpgaaaaaaa"该后缀的文件既不在黑名单之内也不在白名单之内。如果文件上传成功是黑名单检测,上传失败是白名单检测。
——上传攻击框架
——轻量级检测绕过攻击
1、 绕过javascript对扩展名的检测—用burp直接POST数据到服务端,绕过前端检测
2、 绕过服务端对http request包MIME类型检测—用burp伪造POST数据包到服务端,绕过MIME检测
——路径/扩展名检测绕过攻击
1、 黑名单绕过:文件名大小写,名单列表,特殊文件名,0x00截断,.htaccess文件攻击,本地包含漏洞,Apache解析漏洞,IIS解析漏洞,Nginx解析漏洞
2、 白名单绕过:0x00截断绕过,本地文件包含漏洞,IIS解析漏洞,Nginx解析漏洞
——文件内容检测绕过攻击
文件加载绕过
——upload-labs通关经验
Less-1:
客户端js检测,先改为Jpg格式,再抓包改为phpLess-2:
同上,没发现什么区别Less-3:
禁止了一些文件格式,但没禁止php5等,可以将文件格式改为php5,再在抓包中的repeater包中找到上传文件的位置。Less-4:
上传.htaccess文件,这关没成功,插眼。Less-5:
禁止了.htaccess文件,文件自带php文件,使用.user.ini文件配置,内容为auto_prepend_file=info.jpg,作用是使php文件自动包含info.jpg文件。Less-6:
没有全部转化为小写的格式,大小写混写绕过,抓包后用repeater包找到相对路径的文件名。Less-7:
没有过滤空格,在抓包后,将文件后缀名后加上空格。Less-8:
将后缀名过滤了,在抓包后,将文件后缀名加上’.’,来绕过。Less-9:
没有将::DATA绕过。::DATA"会把::DATA"之前的文件名(Windows文件流特性)Less-10:
该关只去除了末尾的点,可以在抓包后,将文件后缀名上加"…",加俩点的原因是,第一个点是去除了末尾的点,第二个点是绕过去除后缀名。Less-11:
双写绕过。Less-12:
白名单0x00截断绕过,GET传输,直接抓包在url中修改为php格式,用%00截断。Less-13:
白名单0x00截断绕过,POST传输,抓包在文件位置中加上info.php空格,用hex编码00截断Less-14:
使用文件包含漏洞绕过,直接上传一个图片马,用过关自带的include.php 127.0.0.1/upload-labs/include.php?file=./upload/143243.jpg ./x:表示相对路径Less-15:
跟上关过法一样Less-16:
Less-17:
渲染绕过
——文件上传漏洞绕过经验
—过滤文件内容敏感字符,文件后缀名,同时将没有绕过的文件转化为jpg格式
双写绕过,一个个尝试畸形后缀名绕过
由于对文件上传漏洞的学习还没有太深,在网上老师傅写的资料都似懂非懂,于是就想以一个初学者的角度来学习这些知识的。如果有相似的地方,就感谢师傅对我学习的帮助,Thank you。