ctfhub-RCE

关于管道操作符

windows:

1. “|”:直接执行后面的语句。
2. “||”:如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。
3. “&”:两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。
4. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

linux:

1. “;”:执行完前面的语句再执行后面的语句。
2. “|”:显示后面语句的执行结果。
3. “||”:当前面的语句执行出错时,执行后面的语句。
4. “&”:两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。
5. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

关于转义字符

 由反斜杠 \ 后面跟一个或多个字符组成,其目的是为了表示那些不能直接输入或具有特殊含义的字符。使用转义字符可以明确其表示的是普通字符而不是特殊含义

1.eval执行

开启环境,得到源码主要是eval函数

eval函数:将内容转为php语言进行执行

所以我们就直接传入参数cmd没有看到flag,就再往上进行穿越(或者直接进行查看根目录也可以)查看到了flag,就去cat这个文件

2文件包含

得到源码

strpos函数:strpos()函数用于查找字符串中某个子字符串的位置。

那么这个代码就是:检查是否有get传参的参数file,查找参数file里是否有字符flag

由于代码是!strpos所以需要不含flag,如果含就会输出hacker

include():语句的主要作用是将指定文件的内容插入到当前 PHP 文件中该语句所在的位置,并当作当前文件的一部分来执行。

这里include()函数就提供了文件包含漏洞,文件包含漏洞同时要求那个被包含的文件是用户通过传参方式引入的,这个条件我们也满足了

 那么我们就直接进行get传参,传入参数file,访问shell.txt,然后进入这个文件,看到有一个request传参“ctfhub”,所以进行传参查看就好了

php://input

源码

<?php
if (isset($_GET['file'])) {if ( substr($_GET["file"], 0, 6) === "php://" ) {include($_GET["file"]);} else {echo "Hacker!!!";}
} else {highlight_file(__FILE__);
}
?>

get传参传入参数file

且对参数file的前六个字符有限定,必须是“php://”

而且这里已经给了我们phpinfo界面了,我们直接看看

没有flag直接给出,但是我们传入php://input就可以执行传入的php代码

所以我们抓包去构造文件执行,写入命令执行的php代码

然后再进行cat那个flag文件

读取源代码

<?php
error_reporting(E_ALL);
if (isset($_GET['file'])) {if ( substr($_GET["file"], 0, 6) === "php://" ) {include($_GET["file"]);} else {echo "Hacker!!!";}
} else {highlight_file(__FILE__);
}
?>

get传参file,前六字节限定为php://

而且直接告诉了我们flag文件在哪

所以我们就直接去访问就好

用php伪协议

这样就得到了一串base64编码,进行base64解码就可以了

远程包含

和php://input类似

看到了flag,就去cat它

命令注入

源码

<?php$res = FALSE;if (isset($_GET['ip']) && $_GET['ip']) {$cmd = "ping -c 4 {$_GET['ip']}";exec($cmd, $res);
}?>

 get传参传入参数ip

ping -c 4 是一个常见的命令,用于向指定的 IP 地址发送 4 个 ICMP 数据包

也就是拼接了一个字符串,让用户输入ip就能执行ping命令

exec($cmd, $res);

调用 exec 函数执行存储在 $cmd 中的命令。

exec 函数会执行一个外部命令,并将命令的最后一行输出存储在 $res 数组中。

所以传入ip地址以及一个命令

用管道符进行分隔,来使后面的可以被执行,因为使用exec函数,那么ls命令可以被执行

过滤cat

源码

与上一题相似,get传参传入参数ip,管道符|直接执行后面的语句,我们随便用个ip,然后ls查看目录看到了flag文件,cat它

但是源码中正则表达式将cat给过滤掉了,所以我们用tac

tac:从下往上查看

cat:从上往下查看

但是没看到有flag,我们就看源码

过滤空格

源码同样get传参,参数ip,正则表达式将空格过滤掉了

所以我们就用同样的方法查看目录

看到了flag文件,cat它

但是通常我们cat文件是cat <文件名>

但是这里过滤了空格,用$IFS$4

这样就可以查看flag文件里

空格过滤绕过:

1、大括号{}

    {cat,flag.php}

2、$IFS代替空格

$IFS$9,${IFS},$IFS这三个都行

    Linux下有一个特殊的环境变量叫做IFS,叫做内部字段分隔符 (internal field separator)。
    ?cmd=ls$IFS-I
    单纯$IFS2,IFS2被bash解释器当做变量名,输不出来结果,加一个{}就固定了变量名
    ?cmd=ls${IFS}-l
    $IFS$9后面加个$与{}类似,起截断作用,$9是当前系统shell进程第九个参数持有者始终为空字符串。
    ?cmd=ls${IFS}$9-l

3、重定向字符<,<>
4、%09绕过(相当于Tab键)

过滤目录分隔符

;(命令分隔符): 无论前一个命令 cmd_1 是否成功,都会执行下一个命令 cmd_2。例: echo "Hello"

源码


<?php$res = FALSE;if (isset($_GET['ip']) && $_GET['ip']) {$ip = $_GET['ip'];$m = [];if (!preg_match_all("/\//", $ip, $m)) {$cmd = "ping -c 4 {$ip}";exec($cmd, $res);} else {$res = $m;}
}
?>

由于源码中禁用了分隔符\,所以我们不能直接访问某文件夹下的文件

但是我们可以进入某文件夹,只要没有穿越,就可以访问文件了

所以,我们先查看该级目录查看得到了一个目录,有flag,那么我们就进入后并cat这个flag

同样是没有直接看到flag,但是可以看到有一条空的数组的显示,那么就看源码

过滤运算符

源码

<?php$res = FALSE;if (isset($_GET['ip']) && $_GET['ip']) {$ip = $_GET['ip'];$m = [];if (!preg_match_all("/(\||\&)/", $ip, $m)) {$cmd = "ping -c 4 {$ip}";exec($cmd, $res);} else {$res = $m;}
}
?>

看源码,可以知道被禁用的运算符并不多 ,仅仅只是|和&

也就是说我们还有其他的没被禁用,比如;

所以我们就利用;来使后面的代码被执行

综合练习

源码

<?php$res = FALSE;if (isset($_GET['ip']) && $_GET['ip']) {$ip = $_GET['ip'];$m = [];if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {$cmd = "ping -c 4 {$ip}";exec($cmd, $res);} else {$res = $m;}
}
?>

 被禁用了| ,\ ,& , 空格 ,/, ; cat ,flag ,ctfhub

管道符|,&,;都被禁用了,但是我们需要考虑用什么去替代他们实现

%0a可以替代管道符

所以得到:

看到了flag所在,我们再去查看一下flag_is_here目录

用*绕过flag,${IFS}绕过空格

得到了flag所在的文件,再进行cat

但是需要用tac来进行cat的绕过

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

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

相关文章

Missashe考研日记-day28

Missashe考研日记-day28 1 专业课408 学习时间&#xff1a;2h学习内容&#xff1a; 今天先是预习了OS关于虚拟内存管理的内容&#xff0c;然后听了一部分视频课&#xff0c;明天接着学。知识点回顾&#xff1a; 1.传统存储管理方式特征&#xff1a;一次性、驻留性。2.局部性原…

01 appium环境搭建

环境搭建 Java JDKNode.jsAndroidStudio(提供sdk)appiumappium Inspector 相关安装包下载 链接&#xff1a;https://pan.xunlei.com/s/VOOf3sCttAdHvlMkc7QygsoJA1# 提取码&#xff1a;x4s5 AndroidStudio下载安装sdk AndroidStudio下载 安装运行&#xff0c;配置代理及测…

指针(4)

1.回调函数 回调函数就是通过函数指针调用的函数。 将函数的指针&#xff08;地址&#xff09;作为一个参数传递给另一个函数&#xff0c;当这个指针被调用其所指向的函数时&#xff0c;被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用&#xff0c;而是在特…

Raptor码的解码成功率matlab实现

下面是使用matlab实现关于Raptor 码解码成功率的仿真代码&#xff0c;并绘制成功率随编码符号数量变化的图形示例。代码中包含了 Raptor 码的预编码&#xff08;使用稀疏矩阵乘法模拟&#xff09;、LT 编码、解码过程&#xff0c;以及解码成功率的计算和绘图。 具体代码如下&am…

域名系统DNS

DNS介绍 DNS是一个域名系统&#xff0c;在互联网环境中为域名和IP地址相互映射的一个分布式数据库 &#xff0c; 能够使用户更方便的访问互联网&#xff0c;而不用去记住能够被机器直接读取的IP数串。类似于生活中的114服务&#xff0c;可以通过人名找到电话号码&#xff0c;也…

Spark Streaming核心编程总结(四)

一、有状态转化操作&#xff1a;UpdateStateByKey 概念与作用 UpdateStateByKey 用于在流式计算中跨批次维护状态&#xff08;如累加统计词频&#xff09;。它允许基于键值对形式的DStream&#xff0c;通过自定义状态更新函数&#xff0c;将历史状态与新数据结合&#xff0c;生…

Dijkstra 算法代码步骤[leetcode.743网络延迟时间]

有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源节点&#xff0c;vi 是目标节点&#xff0c; wi 是一个信号从源节点传递到目标节点的时间。 现在&#xff0c;…

【java】lambda表达式总结

目录 一、面向对象的处理方法 二、函数式编程的处理方法 先使用匿名内部类&#xff1a; lambda改造&#xff1a; lambda改造规则 示例&#xff1a; 三、补充&#xff1a;函数式接口 大家好&#xff0c;我是jstart千语。今天总结一下lambda表达式。lambda表达式在后面的s…

AtCoder Beginner Contest 242 G - Range Pairing Query (莫队)

每周五篇博客&#xff1a;&#xff08;5/5&#xff09; 我做到了&#xff01; https://atcoder.jp/contests/abc242/tasks/abc242_g 这题主要是想给大家提供一份莫队的板子&#xff0c;很多莫队题基本上填空就差不多了&#xff08; 板子 void solve() {int n;std::cin >…

淘宝商品主图标题api接口

1、输入淘宝商品id或者链接&#xff0c;点查询 2、查询淘宝商品主图&#xff0c;商品标题&#xff0c;商品价格&#xff0c;卖家旺旺 3、支持api接口

文心一言开发指南06——千帆大模型平台新手指南

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 千帆大模型平台为新手用户提供了一个全面的入门指南&#xff0c;以便用户能够快速熟悉平台的操作和功能。千帆大模型平台通过提供详细的新手指南&#xff0c;确保用户能够顺…

Pacman-N-queen

文档 代码及文档&#xff1a;通过网盘分享的文件&#xff1a;code 链接: https://pan.baidu.com/s/1Rgo9ynnEqjZsSP2-6TyS8Q?pwdn99p 提取码: n99p 补充核心代码 核心代码内容&#xff1a; genetic_algorithm,py # -*- coding: utf-8 -*- """ Created on …

常用的多传感器数据融合方法

1. 概述 根据具体需求&#xff08;实时性、计算资源、噪声特性&#xff09;选择合适的方法&#xff0c;实际应用中常结合多种方法&#xff08;如UKF与神经网络结合&#xff09;。 传统方法 &#xff08;KF/EKF/UKF/PF&#xff09;依赖数学模型&#xff0c;适合动态系统&#…

简单几步,开启 Intel VT-x 让电脑“解开CPU封印”

#vmware #虚拟机 #cpu虚拟化 # Intel VT-x 前言 你是不是也遇到过这种情况&#xff1a;在尝试运行虚拟机&#xff08;VM&#xff09;、安卓模拟器&#xff0c;或者使用 Windows 沙盒、WSL2 等功能时&#xff0c;遇到了类似“此主机支持 Intel VT-x&#xff0c;但 Intel VT-x …

Go语言--语法基础4--基本数据类型--字符串类型

在 Go 语言中&#xff0c;字符串也是一种基本类型。相比之下&#xff0c; C/C 语言中并不存在原 生的字符串类型&#xff0c; 通常使用字符数组来表示&#xff0c;并以字符指针来传递。 Go 语言中字符串的声明和初始化非常简单&#xff0c;举例如下&#xff1a; var str st…

QT中的事件及其属性

Qt中的事件是对操作系统提供的事件机制进行封装&#xff0c;Qt中的信号槽就是对事件机制的进一步封装 但是特殊情况下&#xff0c;如对于没有提供信号的用户操作&#xff0c;就需要通过重写事件处理的形式&#xff0c;来手动处理事件的响应逻辑 常见的Qt事件&#xff1a; 常见事…

socket套接字-UDP(中)

socket套接字-UDP&#xff08;上&#xff09;https://blog.csdn.net/Small_entreprene/article/details/147465441?fromshareblogdetail&sharetypeblogdetail&sharerId147465441&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link UDP服务器…

C++入门小馆: STL 之queue和stack

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

ALTER TABLE 删除DROP表列的报错: 因为有一个或多个对象访问此列

目录 1.问题 2.解决办法 1.问题 删除某个列名的时候&#xff0c;提示错误因为有一个或多个对象访问此列 2.解决办法 2.1 添加或删除表新列名 将表中的字段设置Default 或 NOT NULL 都会给该字段添加约束&#xff0c;增加了这些约束后&#xff0c;再SQL脚本修改类型、删除会发生…

python源码打包为可执行的exe文件

文章目录 简单的方式&#xff08;PyInstaller&#xff09;特点步骤安装 PyInstaller打包脚本得到.exe文件 简单的方式&#xff08;PyInstaller&#xff09; 特点 支持 Python 3.6打包为单文件&#xff08;–onefile&#xff09;或文件夹形式自动处理依赖项 步骤 安装 PyIns…