安全之web 任意文件上传下载

任意文件下载,上传

失效访问控制

#  目录问题
在web框架中面对的对象不同,对象所在的位置也不同
在主机系统中 文件路径 比如C盘  D盘  /etc/passwd  /applition/web/index.php

游览器中叫做  网络路径 http://127.0.0.1:80/web/index.php
同样的index.php文件 对于不同的对象来说,他的描述路径是不一样的。
            
           C:\www\web\index.php 
http://127.0.0.1:/web/index.php
对于系统来说C盘下www\ 只是文件系统的一个目录而已 
对于网络路径来说 / 就是 web这一层。


而提供网络路径访问的软件(apache  nginx)会设置一个目录对照比如  C:\www\web 等于 http://127.0.0.1:/web 目录
# (因为我使用过django STATIC_URL 设置网络地址的根路径的配置项 )          



现在从上述文档中推导出,一个文件能被游览器渲染出来,那么这个文件一定有一个网络地址。也一定有一个服务器的文件地址
https://mirrors.aliyun.com/oldubuntu-releases/releases/21.10/ubuntu-21.10-beta-desktop-amd64.iso
C:\clould\aliyun\linux\desp\oldubuntu-releases/releases/21.10/ubuntu-21.10-beta-desktop-amd64.iso
    
   


image-20220705143014749

通过特殊的目录符号跨越下载到敏感文件
# http://10.0.0.153/pikachu/vul/unsafedownload/execdownload.php?filename=../../../../pikachu-master.zip

image-20220705143713254

在实际工作中,是不知道网站的目录结构的,但是知道 系统文件的路径 和 默认软件的配置文件 所以可以这种形式下载下来。

就是不断使用的猜解字典去匹配实际的物理路径,

把系统文件用户配置文件
ssh的文件秘钥对 hosts等
系统历史命令文件
数据库配置文件,命令文件 数据库的备份文件
默认软件的配置文件下载 比如 java  python 链接数据库的配置文件
等等

image-20220705144120342

一般链接形式
download.php?path=
download.php?file=
data.php?file=
download.php?filename=
包含参数的:
&src=
&Filepath=
&Inputpath=
&Path=
&Data=



下载漏洞最重要的就是取得文件系统的路径,
1、代码中屏蔽了 ../ 的逻辑,要想办法去绕过或者欺骗,
2、在前期信息收集的过程中,把整个网站的html文件下载,分析网站的目录,然后推导文件系统的路径
3、故意使网站报错,报错信息中是否含有物理路径
4、




第一如果代码中没有定义网络路径的绝对地址,没有在代码中过滤或者屏蔽掉 ../这类的特殊符号。那么网络地址可以通过特殊符号 ../ 代表上一个目录,访问到不属于网络路径下的文件

第二  正则过滤

第三 代码中配置 文件的绝对路径。php.ini    open_basedir

第四 打开web框架的配置文件,不允许访问站点目录以外的目录,返回404

任意文件上传

image-20220712131718739

在web页面,提供上传文件的接口,就会存在文件上传漏洞、在上次的 mysql文件上传的途径一样,我们上传的文件最终是要被解释器执行的。
通过游览器去访问http://127.0.0.1/123.php   http://127.0.0.1/123.py    这个文件的时候由nginx或者apache 服务器找到该文件,调用语言的解释器去执行123php 或者123.py ,执行完成后组合成html文件返回给游览器,游览器生成页面。

# 为什么要上传固定类型的文件? 服务器上有解释器,而且可以通过游览器调用解释器去执行这个类型的文件。
# 开发人员,保证正常的文件能够被上传,并且使用,那么对于有害的文件,要进行拒绝。
# web渗透的过程就是,把有害的文件进行伪装,并且绕过所有的检测,能够让服务器的解释器找到该文件并且有权限执行。

'''
在文件上传中
从文件提交,会对文件的大小,文件的后缀名,文件的类型进行校验,符合前端规定才会结束校验的代码。    ----js校验
在传输过程中,使用post,get 发送的方式,提取文件名和文件的内容,                              -----文件的提取数据

文件传输可以把文件整体打包发送,也可以拆分为几段一起发送,                                    ---- 文件的传输
加密:特殊的加密方式比如加盐等手段,防止数据被篡改
文件一致性:有的会进行hash值校验,
重传机制等。。
'''

1、前端JS代码绕过

(1) 在靶机上修改js代码,跳过文件 类型的验证

image-20220712144430095

文件类型不是图片话,是不允许上传
2种方式绕过


1、直接修改js代码,把校验类型的逻辑代码删除。

image-20220712144700597

第二种 burp 抓包 ,如果修改js代码,无法跳过逻辑代码的文件类型的检查,那么就可以利用提取文件数据的时候,篡改文件名称,达到绕过的目的、

image-20220712170334328

通过抓包的参数 POST 获取到上传的后台代码位置  /pikachu/vul/unsafeupload/clientcheck.php    文件保存的位置 uploads 
所以简单的拼接一下 http://10.0.0.153/pikachu/vul/unsafeupload/uploads/123.php
使用webshell 连接 

image-20220712170634673

2、后端文件 类型的验证

绕过游览器类型的检测 content-type:image/png  
post 请求中,游览器会自动对携带的文件的类型进行分析,如果是php的文件 定义为 application/octer-strem 类型

image-20220712180034799

image-20220712180433632

post 请求中,如果是png的文件 定义为image/png类型 其他数据基本一致。所以修改游览器的检测类型,欺骗后台,达到上传的目的。

image-20220712180710644

image-20220712181004674

3、后端 文件内容的校验

随着对文件的校验的等级不断升级,单纯的对文件的类型判断满足不了,需求更新手段
对于文件来说,每一种类型的文件 通常的内容开头的值是不变的,比如
图片开头值是xxxx  ,那么后台代码decode 文件开头的数据, 对比是否一致确实是图片类型,才予以放行。
还有的做法是 把文件全部解码以后,对文件所有的内容进行扫描关键字,匹配,然后才放行。

# 破解这种手段的方式,就是图片 + 木马整合成一个文件,进行把木马的字符串和图片的字符串进行交融杂糅,既让文件能够显示,又能绕过后台的检测机制,木马又能正常使用

#1、粗暴做法, 把木马的代码追加到文件的最后,躲避文件头的检测
 使用 copy  /b  1.png/b  muma.php/b  000.png   以二进制的方式整合成一个png文件 ,然后在使用php解释器 执行

#2、使用工具注入一句话木马 
 使用工具把一句话代码 注入到图片文件中的 任意位置。躲避文件后台代码对文件头或者文件尾的检查
    
    
   


在webshell 中分为 
# 一句话木马  需要专业的工具连接 上述讲的两个手段主要是对 一句话木马起作用的 对于 大马和小马而言,技术手段都是通用的,灵活使用即可
# 小马    功能不是很强大的webshell 通过游览器访问就能控制对方服务器的
# 大马    功能强大的webshell 通过游览器访问就能控制对方服务器的

如图一 就是大马

image-20220714085854635

突破getimagesize()

突破exif_imagetype()

上传木马后,如何解决目录问题

想要绕过目录的问题 及找到上传文件所在的目录
办法有两个:
# 1 找到网站的整个站点目录 ,通过各种渠道 (目录探测,报错等等)
# 2 上传到系统已知目录上去,在去执行该文件的时候,通过任意文件下载漏洞去执行。 
    在信息收集中确定 系统版本  web服务名称   比如 Centos Ubuntu 常用目录 nginx  apache  redis 软件安装目录 可以把文件传到已知的目录上。
# 3 让网页报错,报错信息中可能会有目录信息,比如 安装首页 ,phpinfo  数据库初始化页面 帮忙页面 重置密码页面 
# 4、github  或者  源码商城等等

问题现在通过简单的抓包分析 出来的 那么一个网站有N多个页面的时候,如何分析网站的站点目录,成为一个新的挑战

posted @   mmszxc  阅读(202)  评论(0编辑  收藏  举报
编辑推荐:
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
阅读排行:
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1
· 一文搞懂MCP协议与Function Call的区别
点击右上角即可分享
微信分享提示