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函数的作用
最后感谢大家的阅读 我这里可能有很多描述的不清楚 希望大家可以体谅下 之后自己有体会 再慢慢补充