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 用于逃逸判断)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
)

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

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

1
2
3
4
5
6
<?php
$url = '//www.example.com/path?googleguy=googley';

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

2016asisctf的一道web题 DEMO1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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");
}
}

?>

img

这里query中的参数有aaa 被preg_match匹配到 所以拦截了

img

这里test.php前面加了一个/ 导致把test.php? 认为成了host 相对的来说 /aaa/xxx 也就成为了路径 这也可以说是一个绕过吧

img

这里test.php前面再多加了一个/ 导致 严重不合格的 URL,parse_url() 返回FALSE 这个是通用的绕过方法