广西五象云谷杯-报名题-SSRF

本文探讨了广西五象云谷杯的一道报名题目,该题目涉及SSRF(Server-Side Request Forgery)漏洞。通过解析函数的检测,可以绕过私有地址检查,实现SSRF攻击。当输入的URL被解析后,可以定向到特定的内部服务器,从而获取到flag。
摘要由CSDN通过智能技术生成

0x00 题目

<?php
function check_inner_ip($url)
{
    $match_result=preg_match('/^(http|https)?:\/\/.*(\/)?.*$/',$url);
    if (!$match_result){
        die('url fomat error1');
    }
    try{
        $url_parse=parse_url($url);
        // var_dump($url);
    }
    catch(Exception $e){
        die('url fomat error2');
    }
    $hostname=$url_parse['host'];
    $ip=gethostbyname($hostname);	
    $int_ip=ip2long($ip);
    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 || ip2long('0.0.0.0')>>24 == $int_ip>>24;
}
function safe_request_url($url)
{
	//判断url的IP是否为私有IP地址,如果是则不通过
    if (check_inner_ip($url)){
        echo $url.' is inner ip';
    }
    else{
         $ch = curl_init();//初始化一个CURL会话
        //curl_setopt()为给定的cURL会话句柄设置一个选项
        curl_setopt($ch, CURLOPT_URL, $url);//CURLOPT_URL:需要获取的URL地址,也可以在curl_init()函数中设置。
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//CURLOPT_RETURNTRANSFER:将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
        curl_setopt($ch, CURLOPT_HEADER, 0);//CURLOPT_HEADER:启用时会将头文件的信息作为数据流输出。
        $output = curl_exec($ch);//执行一个cURL会话
        $result_info = curl_getinfo($ch);
        if ($result_info['redirect_url']){
            safe_request_url($result_info['redirect_url']);
        }
        curl_close($ch);
        var_dump($output);
    }
}
$url = $_GET['url'];
if(!empty($url)){
    safe_request_url($url);
}
else{
    highlight_file(__file__);
}
//flag in flag.php
?>

0x01 分析

function check_inner_ip($url)作用是检测$url中是否含私有地址。
检测方式为:通过parse_url($url)函数对$url进行解析,返回其组成部分,所以只要通过了这个检测,就能进行ssr。
如,parse_url('http://u@127.0.0.1:80@baidu.com/websf/flag.php')解析后返回如下数组:
scheme=>http
host=>baidu.com
user=>u@127.0.0.1
pass=>80
path=>/websf/flag.php
parse_url()函数将baidu.com视为host,从而通过了function check_inner_ip($url)的检测。
而在curl中又将请求转向127.0.0.1:80,即curl所请求的urlhttp://127.0.0.1:80/websf/flag.php,从而得到flag。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值