Bootstrap

76,【8】BUUCTF WEB [第三章][3.4.6 案例解析][网鼎杯 2020 玄武组]SSRFMe(未做出)

进入靶场

再见代码

<?php
// 函数:检查传入的 URL 是否为内部 IP 地址
function check_inner_ip($url)
{
    // 使用正则表达式检查 URL 的格式是否以 http、https、gopher 或 dict 开头,后面可以跟任意字符和斜杠及后续字符
    $match_result = preg_match('/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/',$url);
    // 如果 URL 格式不符合上述正则表达式,输出错误信息并终止程序
    if (!$match_result)
    {
        die('url fomat error');
    }
    try
    {
        // 解析 URL,将其拆分为各个部分(如协议、主机、路径等)
        $url_parse = parse_url($url);
    }
    catch(Exception $e)
    {
        // 如果解析 URL 时发生异常,输出错误信息并终止程序,同时返回 false
        die('url fomat error');
        return false;
    }
    // 获取解析后的 URL 的主机名
    $hostname = $url_parse['host'];
    // 将主机名解析为 IP 地址
    $ip = gethostbyname($hostname);
    // 将 IP 地址转换为长整型
    $int_ip = ip2long($ip);
    // 检查 IP 地址是否属于以下内部 IP 地址范围:
    // 127.0.0.0/8(回环地址)、10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16(私有网络地址)
    return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16;
}

// 函数:安全请求 URL
function safe_request_url($url)
{
    // 调用 check_inner_ip 函数检查 URL 是否为内部 IP 地址
    if (check_inner_ip($url))
    {
        // 如果是内部 IP 地址,输出相应信息
        echo $url.' is inner ip';
    }
    else
    {
        // 初始化一个 cURL 会话
        $ch = curl_init();
        // 设置 cURL 选项:要请求的 URL
        curl_setopt($ch, CURLOPT_URL, $url);
        // 设置 cURL 选项:将请求结果以字符串形式返回,而不是直接输出
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        // 设置 cURL 选项:不包含响应头信息
        curl_setopt($ch, CURLOPT_HEADER, 0);
        // 设置 cURL 选项:超时时间为 10 秒
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        try {
            // 执行 cURL 请求并存储结果
            $output = curl_exec($ch);
            // 检查 cURL 请求是否出错
            if ($output === false) {
                $error = curl_error($ch);
                echo "cURL Error: ". $error;
                curl_close($ch);
                return;
            }
            // 获取 cURL 请求的信息(如状态码、重定向等)
            $result_info = curl_getinfo($ch);
            // 如果存在重定向 URL
            if ($result_info['redirect_url'])
            {
                // 递归调用 safe_request_url 函数处理重定向 URL
                safe_request_url($result_info['redirect_url']);
            }
            // 关闭 cURL 会话
            curl_close($ch);
            // 输出请求结果
            var_dump($output);
        } catch (Exception $e) {
            echo "Error occurred: ". $e->getMessage();
        }
    }
}
// 检查是否存在 GET 请求参数 url
if(isset($_GET['url'])){
    // 获取 GET 请求参数 url 的值
    $url = $_GET['url'];
    // 过滤 URL,确保其只包含允许的字符
    $url = filter_var($url, FILTER_SANITIZE_URL);
    // 如果 url 参数不为空
    if(!empty($url)){
        // 调用 safe_request_url 函数对 URL 进行安全请求
        safe_request_url($url);
    }
}
else{
    // 如果不存在 GET 请求参数 url,使用 highlight_file 函数显示当前文件的源代码并高亮显示
    highlight_file(__FILE__);
}
// 请在本地访问 hint.php
?>

我说代码那么熟悉呢,这不就是我做不出来的第5题吗

73,【5】BUUCTF WEB [网鼎杯 2020 玄武组]SSRFMe(未解出)-CSDN博客

;