parse_url-的一些tricks

无协议报错

<?php 
$url = $_GET['url'];
$data = parse_url($url); 
var_dump($data);
?>

该函数在URL没有协议的时候,加上端口会报错

7.jpg

不加端口会正常进行解析

10.jpg

其他情况下可以正常解析

8.jpg

当端口有字母时,依然会正常解析

9.jpg

端口错误解析

url为

http://127.0.0.1/demo1.php?url=//yml-sec.top/index:80

我们期望的解析结果是这样的

12.jpg

而实际的解析结果是这样的

11.jpg

路径解析错误

http://127.0.0.1/demo1.php?url=//yml-sec.top?/index/config.php

解析结果

13.jpg

http://127.0.0.1/demo1.php?url=/yml-sec.top?/index/config.php

解析结果

14.jpg

///解析返回false

如ciscn题目部分源码

<?php 
$payload= $_GET['url'];

if(isset($payload)){  
    $url = parse_url($_SERVER['REQUEST_URI']);
    var_dump($url);
    parse_str($url['query'],$query);

    foreach($query as $value){
        if (preg_match("/flag/",$value)) { 
    	    die('stop hacking!');
    	    exit();
        }
    }
    $payload = unserialize($payload);
}else{ 
   echo "Missing parameters"; 
} 
?>

正常输入会拦截

15.jpg

使用///时会成功的绕过

16.jpg