进入靶场
再见代码
<?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题吗