freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

文件上传通关攻略
2025-01-14 00:47:49
所属地 广东省

测试过程

1、创建一个php文件

2、内容为

:::info

攻击语句:

:::

3、上传对应php文件,访问对应文件所在路径

4、使用中国蚁剑进行链接


upload-labs总结

https://www.freebuf.com/articles/web/385709.html

upload-labs通关攻略(全) - 清茶先生 - 博客园

https://blog.csdn.net/weixin_47598409/article/details/115050869


前端校验

对文件后缀进行校验

1、先上传png后缀,用burp抓包改成php后缀,访问图片路径

2、禁用前端javascript


MIME校验

两种方法:第一种是上传php文件,改Content-Type,第二种是上传合法后缀文件,改文件后缀。

法一:

改Content-Type:改为图片格式,image/png image/jpeg

法二:更改文件后缀

上传png文件,用burp改成图片后缀,png,jpg等


黑名单

apache http配置改成

黑名单策略---在服务器上不允许特定后缀的文件上传(PHP, asp, jsp)

php环境可以尝试的后缀php1,php2,php3,php4.php5,phtmI, pht

修改Apache http配置,添加

:::info
AddType application/x-httpd-php .php3 .php4 .phtml .phps .php5 .pht

:::

访问,链接

特殊字符::$DATA绕过

在url把::$DATA去掉


.htaccess

这一关我们可以看到禁止上传文件可太多了,几乎完全屏蔽

源码黑名单

:::info
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini");

:::

1.但是.htaccess还是没有过滤,可以重写文件解析规则绕过,上传一个.htaccess,这个文件内容的意思是告诉apache当遇到qianxun.jpg文件时,按照php去解析,文件内容如下:

<FilesMatch "xxx.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

我们再创建一个php测试文件xxx.php

分别将.htaccess文件和xxx.jpg文件上传

AddType application/x-httpd-php .jpg

用浏览器访问xxx.jpg:

如图所示,xxx.jpg被成功解析

删除末尾的点

这一关的思路是它没有循环验证,也就是说这些收尾去空,删除末尾的点,在数据包中把后缀名改为.php. .


大小写

改成全大写,或个别大小写 Php PhP


空格绕过

文件后缀后面加空格


文件后缀加点

php.


双写

.ppphp


白名单

get%00截断

apache版本调至5.2.17

magic_quotes_gpc=off (php.ini)

前提url路径可控,你可以修改上传路径,

上传s1.php文件,将路径改成s1.php%00,

filename改成s1.png

把后面截断的去掉


post%00截断

apache版本调至5.2.17

magic_quotes_gpc=off (php.ini)

前提请求体路径可控,你可以修改上传路径,

这一关白名单,文件上传路径拼接生成,而且使用了post发送的数据进行拼接,我们可以控制post数据进行0x00截断绕过白名单

补充知识:POST不会对里面的数据自动解码,需要在Hex中修改。

<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">../upload/</font>路径下加上<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">s1.php+</font><font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">+号</font>是为了方便后面修改<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">Hex</font>

切换hex,寻找<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">+号</font>的Hex是<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">2b</font>,这里我们要把它改为<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">00</font>

放出请求,删除后面截断的内容


图片马

1、前提要结合文件包含才能用图片马

这一关会读取判断上传文件的前两个字节,判断上传文件类型,并且后端会根据判断得到的文件类型重命名上传文件

1.Png图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A。即为 .PNG。

2.Jpg图片文件包括2字节:FF D8。

3.Gif图片文件包括6字节:47 49 46 38 39|37 61 。即为 GIF89(7)a。

4.Bmp图片文件包括2字节:42 4D。即为 BM。

<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">cmd</font>使用<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">copy 77.png/b + s1.php pass14.png</font>制作<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">图片马</font>,上传图片马

或者

在文件头部添加图片格式:

GIF的文件头为GIF89a,png的文件头为PNG。

改成png格式或gif,上传

用文件包含漏洞

:::info
http://127.0.0.1/upload-labs/include.php?file=upload/2320250109221923.gif

:::

2、使用010edit比较上传后两个文件的不同,把攻击语句粘贴到不会删除的位置


比较文件点击match,插入

结合文件包含,include.php?file=upload/1099891432.gif


条件竞争

由于文件上传到后端才判断文件后缀是否符合条件后缀,符合就通过,不符合就删除。

使用move_uploaded_file()函数,将上传的文件保存到服务器,再进行判断是否是jpg、png、gif中的一种类型,如果在数组中就保存重命名,如果不在根据unlink()就直接删除

代码他是先将图片上传上去,才开始进行判断后缀名、二次渲染。如果在上传上去的一瞬间访问这个文件,那他就不能对这个文件删除、二次渲染。这就相当于我们打开了一个文件,然后再去删除这个文件,就会提示这个文件在另一程序中打开无法删除。

解决方式:

使用burp一直发请求上传php文件,然后去浏览器访问图片,让它反应不过来

上传php文件

php文件内容为

fputs(fopen('Tony.php','w'),'');?>

发给intruder,不断上传

使用python写一段脚本不断访问创建的文件

http://127.0.0.1/upload-labs/upload/cjTom.php

import requests
url = "http://127.0.0.1/upload-labs/upload/cjTom.php"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break

再去访问创建的文件

http://127.0.0.1/upload-labs/upload/Tony.php,使用蚁剑链接


上传图片马

上传图片马

');?>

使用python捕捉

import requests
url = "http://127.0.0.1/upload-labs/include.php?file=upload/221.gif"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break

当出现<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">OK</font>说明访问到了该文件,那么<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">Tony.php</font>应该也创建成功了,用蚁剑连一下试试。

这里注意一下蚁剑连接的<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">URL</font><font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">http://xxx.xxx.xxx.xxx/upload-labs/Tony.php</font>

对文件名做判断

没有对上传的文件做判断,只对用户输入的文件名做判断
后缀名黑名单
上传的文件名用户可控
黑名单用于用户输入的文件后缀名进行判断
move_uploaded_file()还有这么一个特性,会忽略掉文件末尾的<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">/.</font>

先准备PHP一句话木马,并把后缀名改为PNG再上传

访问图片

# 文件上传
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
  • 0 文章数
  • 0 关注者
文章目录