安全之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
通过特殊的目录符号跨越下载到敏感文件
# http://10.0.0.153/pikachu/vul/unsafedownload/execdownload.php?filename=../../../../pikachu-master.zip
在实际工作中,是不知道网站的目录结构的,但是知道 系统文件的路径 和 默认软件的配置文件 所以可以这种形式下载下来。
就是不断使用的猜解字典去匹配实际的物理路径,
把系统文件用户配置文件
ssh的文件秘钥对 hosts等
系统历史命令文件
数据库配置文件,命令文件 数据库的备份文件
默认软件的配置文件下载 比如 java python 链接数据库的配置文件
等等
一般链接形式
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。
任意文件上传
在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代码,跳过文件 类型的验证
文件类型不是图片话,是不允许上传
2种方式绕过
1、直接修改js代码,把校验类型的逻辑代码删除。
第二种 burp 抓包 ,如果修改js代码,无法跳过逻辑代码的文件类型的检查,那么就可以利用提取文件数据的时候,篡改文件名称,达到绕过的目的、
通过抓包的参数 POST 获取到上传的后台代码位置 /pikachu/vul/unsafeupload/clientcheck.php 文件保存的位置 uploads
所以简单的拼接一下 http://10.0.0.153/pikachu/vul/unsafeupload/uploads/123.php
使用webshell 连接
2、后端文件 类型的验证
绕过游览器类型的检测 content-type:image/png
post 请求中,游览器会自动对携带的文件的类型进行分析,如果是php的文件 定义为 application/octer-strem 类型
post 请求中,如果是png的文件 定义为image/png类型 其他数据基本一致。所以修改游览器的检测类型,欺骗后台,达到上传的目的。
3、后端 文件内容的校验
随着对文件的校验的等级不断升级,单纯的对文件的类型判断满足不了,需求更新手段
对于文件来说,每一种类型的文件 通常的内容开头的值是不变的,比如
图片开头值是xxxx ,那么后台代码decode 文件开头的数据, 对比是否一致确实是图片类型,才予以放行。
还有的做法是 把文件全部解码以后,对文件所有的内容进行扫描关键字,匹配,然后才放行。
# 破解这种手段的方式,就是图片 + 木马整合成一个文件,进行把木马的字符串和图片的字符串进行交融杂糅,既让文件能够显示,又能绕过后台的检测机制,木马又能正常使用
#1、粗暴做法, 把木马的代码追加到文件的最后,躲避文件头的检测
使用 copy /b 1.png/b muma.php/b 000.png 以二进制的方式整合成一个png文件 ,然后在使用php解释器 执行
#2、使用工具注入一句话木马
使用工具把一句话代码 注入到图片文件中的 任意位置。躲避文件后台代码对文件头或者文件尾的检查
在webshell 中分为
# 一句话木马 需要专业的工具连接 上述讲的两个手段主要是对 一句话木马起作用的 对于 大马和小马而言,技术手段都是通用的,灵活使用即可
# 小马 功能不是很强大的webshell 通过游览器访问就能控制对方服务器的
# 大马 功能强大的webshell 通过游览器访问就能控制对方服务器的
如图一 就是大马
突破getimagesize()
突破exif_imagetype()
上传木马后,如何解决目录问题
想要绕过目录的问题 及找到上传文件所在的目录
办法有两个:
# 1 找到网站的整个站点目录 ,通过各种渠道 (目录探测,报错等等)
# 2 上传到系统已知目录上去,在去执行该文件的时候,通过任意文件下载漏洞去执行。
在信息收集中确定 系统版本 web服务名称 比如 Centos Ubuntu 常用目录 nginx apache redis 软件安装目录 可以把文件传到已知的目录上。
# 3 让网页报错,报错信息中可能会有目录信息,比如 安装首页 ,phpinfo 数据库初始化页面 帮忙页面 重置密码页面
# 4、github 或者 源码商城等等
问题现在通过简单的抓包分析 出来的 那么一个网站有N多个页面的时候,如何分析网站的站点目录,成为一个新的挑战
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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的区别