[第二章 web进阶]SSRF Training

查看题目,点击intersting challenge发现源码

在这里插入图片描述
然后就是源码审计
首先url经过的函数是

function check_inner_ip($url)
{
	//正则匹配
    $match_result=preg_match('/^(http|https)?:\/\/.*(\/)?.*$/',$url);
    if (!$match_result)
    {
        die('url fomat error');
    }
    try
    {	//解析url,详细见下
        $url_parse=parse_url($url);
    }
    catch(Exception $e)
    {
        die('url fomat error');
        return false;
    }
    $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;
}

对整个url进行解析
然后解析之后只取了host的内容

在这里插入图片描述
接着往下分析
host经过gethostbyname函数
如果能解析的话就是返回IP地址
不能解析的话就是返回原来的字符串

在这里插入图片描述
最后判断ip是不是私有地址
绕过这个函数只需要把它的host字段改成不是以127,10,172.16,192.168,开头的私有ip

在这里插入图片描述

我在本地执行代码报错
因为curl是php的一个扩展
这段的话就是通过curl去访问一个url得到响应的数据

        $ch = curl_init(); 
        curl_setopt($ch, CURLOPT_URL, $url); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt($ch, CURLOPT_HEADER, 0); 
        $output = curl_exec($ch); 
        $result_info = curl_getinfo($ch); 
        if ($result_info['redirect_url']) 
        { 
            safe_request_url($result_info['redirect_url']); 
        } 
        curl_close($ch); 
        var_dump($output); 

有一个问题卡了我好久

payload:http://a:@127.0.0.1:80@baidu.com

这里它取到的host为baidu.com
可以绕过gethostbyname函数
在这里插入图片描述

那这个payload又是怎么绕过safe_request_url函数的
搭个环境自己测试一下
1.php源代码

<?php
function safe_request_url($url)
{
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $output = curl_exec($ch);
        $result_info = curl_getinfo($ch);
	echo $result_info["url"];
	echo "<br>";
        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);
}

正常情况下可以打出this is flag!
在这里插入图片描述

可是换成了本题的payload
发现它不会并打出flag.php里的内容

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值