您当前位置: 首页 » 敏感函数 » parse_url()

parse_url()

2018年3月14日 |

parse_url()在ctf中经常遇到,现在就来总结一下相关的bug

先来看一下parse_url()的用法

用法

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

本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。

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

component:

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

 对严重不合格的 URL,parse_url() 可能会返回 FALSE

相关bug

1、如果指定了 component 参数, parse_url() 返回一个 string (或在指定为 PHP_URL_PORT 时返回一个 integer)而不是array。如果 URL 中指定的组成部分不存在,将会返回 NULL

返回

但如果我们把/path去掉的话。就会返回NULL

2、parse_url()会把//认为是相对路径(5.4.7以前)

在 5.4.7 之前这会输出路径 “//www.example.com/path”

例如2016asisctf的一道web题

当我们输入http://127.0.0.1/1.php?/home/aaa/ 会被attack detected

但如果输入http://127.0.0.1//1.php?/home/aaa/ 则会被当做相对url,此时的1.php?成了host 而path成了/hone/aaa,导致绕过$data[‘query’]的过滤

3、 ///会被返回false

例如如下代码,如果输入http://localhost/1.php?sql=select会被过滤

如果输入http://127.0.0.1///1.php?sql=select的话就会成功绕过

Note: parse_url() 是专门用来解析 URL 而不是 URI 的。不过为遵从 PHP 向后兼容的需要有个例外,对 file:// 协议允许三个斜线(file:///…)。其它任何协议都不能这样。

分类:

敏感函数

| 标签:

评论关闭。