文件上传入门
文件上传入门
推荐文章:超详细文件上传漏洞总结分析-腾讯云开发者社区-腾讯云 (tencent.com)
原理
我只能浅显地说:在要上传的文件里构造语句并按照特定的方式进行上传,以达到攻击者的目的。
限制措施及绕过
前端检测
原理
前端检测主要是通过JavaScript语句。
附:如果检测失败则不会发出请求,也就是不会发包。
判断
前端验证通过以后,表单成功提交后会通过浏览器发出─条网络请求,但是如果前端验证不成功,则不会发出这项网络请求;可以在浏览器的网络元素中查看是否发出了网络请求。
绕过
方法一:改变前端
F12修改source的JavaScript代码,或者直接禁用JavaScript
方法二:骗过前端
文件名是name.png,在bp抓包后改成name.php
须知:只有前端通过后才能发包,bp这时才能抓包
MIME绕过
基础
概念
MIME(Multipurpose Internet Mail Extensions)
多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。
常见的MIME类型
text/plain
(纯文本)text/html
(HTML文档)text/javascript
(js代码)application/xhtml+xml
(XHTML文档)image/gif
(GIF图像)image/jpeg
(JPEG图像)image/png
(PNG图像)video/mpeg
(MPEG动画)application/octet-stream
(二进制数据)application/pdf
(PDF文档)
检测方式
在文件上传过程中,服务端会针对我们的上传的文件生成一个数组,这个数组其中有一项就是这个文件的类型
file_type
;服务端对文件进行检测时,就是通过检测脚本中的黑白名单和这个数组中的file_type
进行对比,如果符合要求就允许上传这个文件。
绕过
传name.php
,bp抓包直接改成image/png
等等
.htaccess
文件解析漏洞
基础
原理
.htaccess文件(或者"分布式配置文件")
,全称是Hypertext Access(超文本入口)
。提供了针对目录改变配置的方法,即,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
前提
web具体应用没有禁止.htaccess文件的上传,同时web服务器提供商允许用户上传自定义的
.htaccess文件
利用方式
上传覆盖
.htaccess文件
,重写解析规则
,将上传的带有脚本马的图片以脚本方式解析。
绕过
第一步:
先命名成a.htaccess,bp抓包改成.htaccess
即可,内容为:
<FilesMatch "js">
SetHandler application/x-httpd-php
</FilesMatch>
再写个木马,改名为name.js
此时js文件会按照php文件被解析,也就是name.js
被当成php
文件执行,然后开蚁剑。
注意点:
.htaccess是全名,但不能直接在Windows命名,在bp上改
补录:https://we11s.github.io/posts/154257042/
.htaccess
使用模板
1 | #对于php |
.user.ini文件包含漏洞
基础
.user.ini实际上就是一个可以由用户“自定义”的php.ini,我们可以自定义除了PHP_INI_SYSTEM以外的模式,在执行php代码之前,系统会对.user.ini先做一个执行,然后才执行其他的php文件。
我们这边利用.user,ini先执行auto_prepend_file函数,auto_prepend_file表示在php程序加载第一个php代码前加载的php文件,也就是先加载了a.jpg里面的文件,即一句话木马。
原文链接:https://blog.csdn.net/hxhxhxhxx/article/details/107165508
须知:.user.ini配置文件是PHP的,可以在全部环境里生效,而.htaccess配置文件是Apache特有
利用
先上传a.user.ini.jpg文件,内容:
GIF89a
//auto_append_file=test1.png
auto_prepend_file=test1.png
第一行绕过文件头检测,第二行可以不写。
bp抓包改名为.user.ini
再上传test1.png
,没必要改名,其内容会被当做PHP文件内容执行。
这句话:auto_prepend_file表示在php程序加载第一个php代码前加载的php文件
我们要先找到一个php文件,自己传会被Unicode化,那看看是否有原有的:
url/upload/index.php
蚁剑连
后端检测_文件头检测漏洞
基础
原理
在每一个文件(包括图片,视频或其他的非ASCII文件)的开头(十六进制表示)实际上都有一片区域来显示这个文件的实际用法,这就是文件头标志。我们可以通过16进制编辑器打开文件,添加服务器允许的文件头以绕过检测。
常见文件头
GIF:47 49 46 38 39 61
png:89 50 4E 47 0D 0A 1A 0A
JPG:FF D8 FF E0 00 10 4A 46 49 46
GIF 文件头解码结果:GIF89a
PNG 文件头解码结果:\x89PNG\r\n\x1A\n
JPG 文件头解码结果:ÿØÿà\x00\x10JFIF
在进行
文件头绕过
时,我们可以把上面的文件头
添加到我们的一句话木马内容最前面,达到绕过文件头检测的目的。
附:最好文件头和代码(木马)之间有个空格
后端检测_00截断
基础
虽然web应用做了校验,但是由于文件上传后的
路径用户可以控制
,攻击者可以利用手动添加字符串标识符0X00
的方式来将后面的拼接的内容进行截断
,导致后面的内容无效,而且后面的内容又可以帮助我们绕过黑白名单的检测。
可是0x00跟%00有什么关系呢?
%00经过URL解码后就是0x00,二者的意思都是空字符,表示一个字符串的结束。我们就可以根据源码利用%00实现.php后缀
示例:ctfhub
源码
最关键的是这句代码:
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
只要在road的值里使用空字符即可,因为GET会编码,所以用%00
payload:
?road=/var/www/html/upload/test1.php%00
至于下面的文件名,最多判断一下后缀,把后缀补过去也会被%00截断,所以在白名单的范围里里命名即可
后端检测_后缀名检测漏洞
原理
通常是针对文件的扩展名后缀进行检测,主要是通过黑白名单进行过滤检测,如果不符全过滤规则则不允许上传。
黑名单
一般有个专门的
blacklist 文件
,里面会包含常见的危险脚本文件。
双写绕过
有时后端会把敏感字符替换为空,这就可以双写绕过了,比如name.phphpp
。
解析漏洞
.htaccess
文件解析漏洞- apache解析漏洞
利用.htaccess可以使其他类型的文件按照PHP文件来执行
apache:技术向!Apache解析漏洞 - 知乎 (zhihu.com)
- 简单来说就是一个配置(AddHandler):后缀可以是其他的,只要文件名里有
.php
,就按照PHP文件执行 - 使用
.php\x0a
,具体看上面链接
IIS7.0 | IIS7.5 | Nginx的解析漏洞
Nginx拿到文件路径(更专业的说法是URI)/test.jpg/test.php后,一看后缀是.php,便认为该文件是php文件,转交给php去处理。php一看/test.jpg/test.php不存在,便删去最后的/test.php,又看/test.jpg存在,便把/test.jpg当成要执行的文件了,又因为后缀为.jpg,php认为这不是php文件,于是返回Access denied。
这其中涉及到php的一个选项:cgi.fix_pathinfo,该值默认为1,表示开启。开启这一选项PHP可以对文件路径进行修理。
举个例子,当php遇到文件路径/1.jpg/2.txt/3.php时,若/1.jpg/2.txt/3.php不存在,则会去掉最后的/3.php,然后判断/1.jpg/2.txt是否存在,若存在,则把/1.jpg/2.txt当做文件/1.jpg/2.txt/3.php,若/1.jpg/2.txt仍不存在,则继续去掉/2.txt,以此类推。原文链接:https://blog.csdn.net/weixin_45588247/article/details/118889668
简单来说,文件我们可以在存在的文件路径后面加一个虚假的/name.php,这个存在的文件如果是一个图片马,就可能实现getshell。
IIS6.0/IIS5.x解析漏洞解析漏洞
- 上传文件名:xxx.asp;.jpg
服务器默认不解析;号后面的内容,因此xxx.asp;.jpg被当做asp文件解析
- 向xxx.asp目录下面上传xxx.jpg
服务器会将xxx.asp目录下的文件都当做asp文件解析
文件上传之IIS6.0解析漏洞_iis6解析漏洞利用-CSDN博客
第一种是文件解析漏洞,如果文件名被修改,可以采用第二种:目录解析漏洞。目录解析漏洞不需要实际的后缀,只需要知道文件名即可
黑名单的漏网之鱼
比如:
asa
和cer
之类asp:
asa
cer
aspx
jsp:
jspx
jspf
php:
php
php3
php4
php5
phtml
pht
exe:
exee
利用Windows的命名机制
shell.php.
shell.php空格
shell.php:1.jpg
shell. php::$DATA
shell.php:1.jpg
在windows中,后缀名后面的点和空格都会被删除掉。
白名单
一般有个专门的
whitelist 文件
,里面会包含的正常文件。
绕过同黑名单
后端检测_文件头检测漏洞
漏洞原理:
一般文件内容验证使用
getimagesize函数
检测,会判断文件是否是一个有效的文件图片,如果是,则允许上传,否则的话不允许上传。 本实验就是将一句话木马插入到一个[合法]的图片文件当中,然后用webshell管理工具进行远程连接。
指令:copy 1.jpg /b + 2.php /a 3.php
/b:指定以二进制格式复制、合并文件,用于图像或者声音类文件
/a:指定以ascii格式复制、合并文件用于txt等文本类文件
这条命令的意思是:通过
copy命令
,把a.png
图片文件,以二进制文件形式添加到a.php
文件中,以ASCII文本文件
形式输出为3.php
文件。
解析图片马需要将图片马被PHP一下,比如文件包含。
一般解析图片马需要结合
解析漏洞
或者文件包含
才能解析图片马;
条件竞争漏洞
我简单称之为:卡空子。当文件的判断需要过多的时间时,可以卡那个时间间隔执行木马。
由于服务器并发处理(同时)多个请求,假如
a用户
上传了木马文件,由于代码执行需要时间,在此过程中b用户
访问了a用户
上传的文件,会有以下三种情况:1.访问时间点在上传成功之前,没有此文件。
2.访问时间点在刚上传成功但还没有进行判断,该文件存在。
3.访问时间点在判断之后,文件被删除,没有此文件。
二次渲染漏洞
二次渲染原理:
在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片并放到网站对应的标签进行显示。
绕过:
1、配合文件包含漏洞: 将一句话木马插入到网站二次处理后的图片中,也就是把一句话插入图片在二次渲染后会保留的那部分数据里,确保不会在二次处理时删除掉。这样二次渲染后的图片中就存在了一句话,在配合文件包含漏洞获取webshell。 2、可以配合条件竞争: 这里二次渲染的逻辑存在漏洞,先将文件上传,之后再判断,符合就保存,不符合删除,可利用条件竞争来进行爆破上传
如何判断图片是否进行了二次处理?
对比要与上传后的图片大小,使用
16进制编辑器
打开图片查看上传后保留了哪些数据,