第一天:

1.就业简介:

比赛,实习经历-真实的渗透经历
比赛不必花费太多经历
实习经历-真实的渗透测试经历是求职的加分项

2.环境搭建与AI辅助学习

debug
	Python-PYCharm自带debug功能
	java-idea 使用量很少
	php-[phpstorm or vscode],VScode中需要插件“php debug”
	js-前段调试,浏览器开发者模式
AI学习辅助
	Claude code(claude opus4.5)、 codex(codex gpt-5.2)、 geminicli(gemini3pro)、glm-4.7、minimax2.1

3.debug调试与CTF比赛题目

baby-web例子:用include上传文件,文件包含类漏洞

upload.php:

<?php
session_start();
error_reporting(0);

$allowed_extensions = ['zip', 'bz2', 'gz', 'xz', '7z'];
$allowed_mime_types = [
    'application/zip',
    'application/x-bzip2',
    'application/gzip',
    'application/x-gzip',
    'application/x-xz',
    'application/x-7z-compressed',
];


function filter($tempfile)
{
    $data = file_get_contents($tempfile);
    if (
        stripos($data, "__HALT_COMPILER();") !== false || stripos($data, "PK") !== false ||
        stripos($data, "<?") !== false || stripos(strtolower($data), "<?php") !== false
    ) {
        return true;
    }
    return false;
}

if (!isset($_SESSION['dir'])) {
    $_SESSION['dir'] = random_bytes(4);
}

$SANDBOX = getcwd() . "/uploads/" . md5("supersafesalt!!!!@#$" . $_SESSION['dir']);
if (!file_exists($SANDBOX)) {
    mkdir($SANDBOX);
}

if ($_SERVER["REQUEST_METHOD"] == 'POST') {
    if (is_uploaded_file($_FILES['file']['tmp_name'])) {
        if (filter($_FILES['file']['tmp_name']) || !isset($_FILES['file']['name'])) {
            die("Nope :<");
        }

        // mimetype check
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $mime_type = finfo_file($finfo, $_FILES['file']['tmp_name']);
        finfo_close($finfo);

        if (!in_array($mime_type, $allowed_mime_types)) {
            die('Nope :<');
        }

        // ext check
        $ext = strtolower(pathinfo(basename($_FILES['file']['name']), PATHINFO_EXTENSION));

        if (!in_array($ext, $allowed_extensions)) {
            die('Nope :<');
        }

        if (move_uploaded_file($_FILES['file']['tmp_name'], "$SANDBOX/" . basename($_FILES['file']['name']))) {
            echo "File upload success!";
        }
    }
}
?>

<form enctype='multipart/form-data' action='upload.php' method='post'>
    <input type='file' name='file'>
    <input type="submit" value="upload"></p>
</form>

index.php:

<?php
session_start();
error_reporting(0);

if (!isset($_SESSION['dir'])) {
    $_SESSION['dir'] = random_bytes(4);
}

if (!isset($_GET['url'])) {
    die("Nope :<");
}

$include_url = basename($_GET['url']);
$SANDBOX = getcwd() . "/uploads/" . md5("supersafesalt!!!!@#$" . $_SESSION['dir']);

if (!file_exists($SANDBOX)) {
    mkdir($SANDBOX);
}

if (!file_exists($SANDBOX . '/' . $include_url)) {
    die("Nope :<");
}

if (!preg_match("/\.(zip|bz2|gz|xz|7z)/i", $include_url)) {
    die("Nope :<");
}

@include($SANDBOX . '/' . $include_url);
?>

该代码会检测文件路径,文件内容关键字,文件格式

关键字检测:不能包含关键字
“<?” “__HALT_COMPILER();” “PK” “<?php”

对文件内容关键字检测

文件格式检测:检测文件格式必须为压缩包类型

对文件格式检测

此时来看,压缩后的文件,文件内容存在“pk”,但又限制文件内容不能包含关键字“pk”,故此时来看是无解,此处为第一处无解点
该例子设计文件包含问题,“文件包含”可以将一切类型文件视为php代码执行
假设压缩包文件上传成功,index.php中的代码会提取上传的文件名并生成一个随机数与md5的路径组合,生成一个目录,并将文件放在该目录下,由于随机数与md5加密的路径会导致这一关无法越过去,此处为第二个无解点,同时伴有伪协议无法使用的问题。
此题的解法回归php底层调试
生成一个phar文件,此时后缀名不重要,上传后通过,检测到phar的关键字,分析该phar文件内是何种压缩格式并自动解压,此时就被include包含,并执行该php命令

debug调试与CTF比赛题目

第二天:

docker容器配置、VScode配置ssh连接
## 1.php底层后门调试
## 2.php底层c语言调试
## 3.php底层c语言解析phpzend虚拟机流程
## 4.zend编译函数解决问题

第三天:

## 1.php伪协议讲解
## 2.php伪协议相关漏洞
## 3.文件包含日志漏洞讲解

第四天:

## 1.文件包含的利用
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐