parse_url函数的解释和绕过

parse_url函数

作用:parse_url — 解析 URL,返回其组成部分

mixed parse_url ( string $url [, int $component = -1 ] )
本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。

参数:
url:要解析的 URL。无效字符将使用 _ 来替换。

component:
指定 PHP_URL_SCHEME、 PHP_URL_HOST、 PHP_URL_PORT、 PHP_URL_USER、 PHP_URL_PASS、 PHP_URL_PATH、PHP_URL_QUERY 或 PHP_URL_FRAGMENT 的其中一个来获取 URL 中指定的部分的 string。 (除了指定为PHP_URL_PORT 后,将返回一个 integer 的值)。

对严重不合格的 URL,parse_url() 可能会返回 FALSE (CTF常用 返回值False 用于逃逸判断)

DEMO

<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH);
?>
结果----------------------------------------------------------------------------------------------------
Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)
	/path

这里我们还输出了当前$url的PHP_URL_PATH 发现是 /path
那么如果我们这里把$url中的/path去掉 发现输出的则为 NULL

tips:parse_url()会把//认为是相对路径(5.4.7以前)
如果我们

<?php
$url = '//www.example.com/path?googleguy=googley';
 
// 在 5.4.7 之前这会输出路径 "//www.example.com/path"
var_dump(parse_url($url));
?>

则输出为路径为 path=
//www.example.com/path

2016asisctf的一道web题 DEMO1

<?php 
$data = parse_url($_SERVER['REQUEST_URI']); 
var_dump($data);
$filter=array("aaa","qqqq");
foreach($filter as $f)
{ 
	if(preg_match("/".$f."/i", $data['query']))
	{ 
		die("Attack Detected"); 
	} 
} 

?>

在这里插入图片描述
这里query中的参数有aaa 被preg_match匹配到 所以拦截了
在这里插入图片描述
这里test.php前面加了一个/ 导致把test.php? 认为成了host 相对的来说 /aaa/xxx 也就成为了路径 这也可以说是一个绕过吧
在这里插入图片描述
这里test.php前面再多加了一个/ 导致 严重不合格的 URL,parse_url() 返回FALSE 这个是通用的绕过方法

再来 DEMO2

<?php 
$url=parse_url($_SERVER['REQUEST_URI']);
var_dump($url);
parse_str($url['query'],$query);  // 参数
echo "<hr />";
var_dump($query);
$key_word=array("select","from","for","like");
    foreach($query as $key) // select
    {
        foreach($key_word as $value) //  "select","from","for","like"
        {
            if(preg_match("/".$value."/",strtolower($key))) // select
            {
                die("Stop hacking by using SQL injection!");
            }
        }
    }
?>

对于这种题目也 一样直接 /// 直接绕过

总结:
1.对于高版本的php的来说 直接/// 三个斜杠就可以直接解决方便 学习了parse_url的绕过
2.学习到了parse_url函数的作用

最后感谢大家的阅读 我这里可能有很多描述的不清楚 希望大家可以体谅下 之后自己有体会 再慢慢补充

展开阅读全文

没有更多推荐了,返回首页