RCE之无参数读取文件总结

RCE漏洞(Remote Code|Command Execute):

是指由于程序中预留了执行代码或者命令的接口,并且提供了给用户使用的界面,导致被黑客利用, 控制服务器。

代码执行漏洞原理:

传入php代码到执行函数的变量,客户端可控,并且没有做严格的过滤,攻击者可以随意输入他想执行的代码,并且这些代码在服务端执行

什么是无参数?

顾名思义,就是只使用函数,且函数不能带有参数

举个栗子:

<?php

highlight_file(FILE);

if(';' === preg_replace('/\^\\W+\((?R)?\)/', '', $_GET'code')) {

eval($_GET'code');

}

?>

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

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

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

栗子:aaa(bbb(ccc())); 我们只可以这样,当然,这里可以是数字,_,不止是英文。不可以aaa('bbb');

那我们怎么通过这种输入函数的方式来获取文件内容呢?(大概思路)

1.首先可以先获取当前目录的所有文件

2.然后通过函数读取函数的内容,例如像show_source,hightlightfile等

如果发现文件不在当前目录,可能在上一级,由该如何读取文件内容呢?

先来说目标文件在上一级目录的下:

可以通过diename()查看上一级目录,以及构造".."

漏洞复现:

1.首先准备好两个文件web3.php,flag.txt,我们的目的就是读取这个flag.txt里面的内容(同一目录)

2.打开BP,进行流量抓包

3.查看当前目录下有没有我们需要的文件

正常来说,我们可以通过print_r(scandir('.'));可以用来查看当前目录所有文件名,但是正则过滤了'.',所以我们需要构造出这个'.';

方法一:current(localeconv() )

current()返回数组中的单元,默认取第一个值,别名pos()。如果都被过滤还可以使用reset()

方法二:chr(46)

chr(46)就是字符"."

怎么构造46呢,因为函数要无参数

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

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

这里的Array0每过一秒值加一,一分钟内至少得到一个46

这里得到这个"."了

这里我们就得到了当前目录下的所有文件及目录了!

这里还有另外一种思路:上面通过构造点的方式其实就是相对路径,我们还可以通过绝对路径的方式来展示当前路径下的文件

getcwd() --- 取得当前工作目录

这不是跟之前构造"."一样的效果嘛

4.读取文件内容

我们可以通过show_source(),readfile、highlight_file、readgzfile()等读文件函数都可以

注意:只可以读取文件,目录是不行的!

在此之前我们需要获取文件名,而获取文件名的方法有以下几种:

1.current(),返回数组第一个元素

2.end(),数组指针指向最后一个元素,也就是返回数组最后一个元素

3.next(),将数组的指针向后移动一位。就是第二个元素

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

zlag.php(flag.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 --- 从数组中随机取出一个或多个随机键

通过这种方式我们可以随机获取到当前路径下的文件名或目录名

这不就是flag嘛。多随机几次就有了

5.获取上一级目录的文件

再介绍几个函数:

1.dirname() :返回路径中的目录部分

当然了,这里是可以叠加的

这样就算文件在哪里都能获取到了

2.构造".."

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

获取上一级目录的内容:

直接这样:readfile(array_rand(array_flip(scandir(dirname(getcwd()))))) 是不行的

因为默认是在当前工作目录寻找并读取这个文件,而这个文件在上一层目录,所以要先改变当前工作目录

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

相关推荐
chunmiao303222 分钟前
DeepSeek V4-Pro 正式版上线,API 8月17日起分时调价
网络·安全
湘美书院--湘美谈教育1 小时前
湘美书院主理人谈AI文学:提示词与Skill的与时俱进
大数据·人工智能·安全·自动化·生活
hz567892 小时前
视频会议终端对接详解:协议兼容、系统集成与常见问题
安全·实时音视频·信息与通信
安全指北针2 小时前
AI编程工具供应链安全实战:当你的AI编码助手成为跳板
人工智能·安全·ai编程
迪康Defender3 小时前
AI 重构终端安全运营:智能分析中枢 AI Insight 模块架构与落地场景深度解析
运维·网络·人工智能·其他·安全·重构·架构
XR1234567883 小时前
医院网络安全与等保合规选型指南
安全·web安全
LPCK_202606224 小时前
企业智能体可信安全架构:知识硬约束、执行层拦截与人工终审的技术实现
人工智能·安全·安全架构
Bruce_Liuxiaowei5 小时前
基于微步在线威胁情报的公网 IP 攻击迹象监测:threatbook_query 脚本全解析与 BruceSec 平台整合实践
数据库·tcp/ip·安全·网络安全·智能体
ZJU_统一阿萨姆5 小时前
【DSH】如何将 DeepSeek Harness 嵌入生产环境?万字解构 DeepSeek Agent Harness 的运行机制与安全边界
前端·javascript·安全
明航咨询_贾老师6 小时前
CISP-AISE知识体系大纲深度解读:6大模块,国内首个AI安全应用官方认证
人工智能·安全