二、 命令执行
2.1 rce中常用的php代码执行函数
eval()
,
assert()
,
preg_replace(), create_function()
,
array_map(), call_user_func()/call_user_func_array() , array_filter()
, usort()/uasort() ,
file_put_contents()
1)eval()
函数把字符串按照
PHP
代码来计算
eval函数的参数的字符串末尾一定要有分号,在最后还要另加一个分号;
如果参数中带有变量时,并且变量有赋值操作的话,变量前的$符号钱一定要有\来转义。如果没有赋值操作可以不需要。
2)assert()
assert 函数 是直接将传入的参数当成
PHP代码
直接,
不需要以分号结尾
,当然你加
上也可以。
3)preg_replace()
preg_replace(
string|array $pattern,
string|array $replacement,
string|array $subject,
int $limit = -1,
int &$count = null
): string|array|null 7
搜索
subject
中匹配
pattern
的部分,以
replacement
进行替换。
4)
create_function()
通过传递的参数创建一个匿名函数,并且返回函数的一个名字。
create_function(string $args, string $code): string
第一个参数是函数接受的参数,第二个参数是函数的执行体
5)array_map()
为数组的每个元素应用回调函数 。
array_map(callable $callback, array $array, array ...$arrays): array
6)call_user_func()/call_user_func_array()(返回回调函数的返回值)
call_user_func()
----------把第一个参数作为回调函数调用
call_user_func(callable $callback, mixed $parameter = ?, mixed $... = ?): mixed
第一个参数是被调用的回调函数,后面的参数是函数的形参
call_user_func_array() --------
调用回调函数,并把一个数组参数作为回
调函数的参数
call_user_func_array(callable $callback, array $param_arr): mixed
7)
array_filter()
使用回调函数过滤数组的元素。
array_filter(array $array, ?callable $callback = null, int $mode = 0): arr
ay
遍历
array
数组中的每个值,并将每个值传递给
callback
回调函数。 如果
callback
回调 数返回
true
,则将
array
数组中的当前值返回到结果
array 数组中。
8)usort()/uasort()(
PHP: usort - Manual)
使用用户自定义的比较函数对数组中的值进行排序。
usort(array &$array, callable $callback): bool
本函数将用用户自定义的比较函数对一个数组中的值进行排序。 如果要排序的数组需要
用一种不寻常的标准进行排序,那么应该使用此函数。
9)
file_put_contents()/fputs()
将一个字符串写入文件
10)
动态函数构造:
<?php
a=assert&b=system('ls')
$_GET['a']($_GET['b']);
?>
2.2 rce中常用的包含文件函数
1)include
当包含
.php
文件时,可同时运行(引用include传参绕过)
2)
highlight_fifile(别名show_source )
语法高亮一个文件,即将文件内容全部展示出来(高亮flag文件
highlight_file 'flag.php'
)
highlight_file(string $filename, bool $return = false): mixed
2.3 常见的系统执行函数
system、shell_exec、exec、popen、passthru
1)system
将字符串作为
OS命令
去执行,并且
自带输出功能
system(string $command, int &$return_var = ?): string
2)
shell_exec()
通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
只返回字符串,
不会 进行输出该函数和
反引号 `` 的执行效果一致
shell_exec(string $cmd): string
3)
exec
将字符串作为
OS命令 去执行,但是自身
不带输出功能,需要写入输出功能的代码
exec(string $command, array &$output = ?, int &$return_var = ?): string
本函数执行输入 command 的外部程序或外部指令。它的返回字符串只是外部程序执行后 返回的最后一行;若需要完整的返回字符串,可以使用 PassThru() 这个函数。
4)
popen
打开进程文件指针
popen
(
string
$command
,
string
$mode
):
resource
打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。
5)
passthru
执行外部程序并且
自带输出功能
passthru
(
string
$command
,
int
&$return_var
= ?
):
void
同
exec()
函数类似, passthru()
函数也是用来执行外部命令(
command
)的。 当
所执行的 Unix 命令输出二进制数据,并且需要直接传送到浏览器的时候,需要用此函
数来替代
exec()
或
system()
函数。 常用来执行诸如 pbmplus 之类的可以直接输出图
像流的命令。通过设置Content-type 为
image/gif
, 然后调用 pbmplus 程序输出
gif 文件, 就可以从 PHP 脚本中直接输出图像到浏览器。
2.4 其他命令执行函数
PHP
:
exec
、
shell_exec
、
system
、
passthru
、
popen
、
proc_open
等
ASP.NET
:
System.Diagnostics.Start.Process
、
System.Diagnostics.Start.Proces
sStartInfo
等
Java
:
java.lang.runtime.Runtime.getRuntime
、
java.lang.runtime.Runtime.exec
等
2.5 积累
php 中不需要括号的函数
echo 111; print 123; die;include " "; require " ";include_once " " ;
require_once " "
系统命令
:
1.
里可以用
?
匹配字符
2.
可以用
;
间隔两条命令
3. $? //
上一次命令执行成功为
0
,不成功为
1
4. env
查看本地变量
5. ``
和
$()
可以代替
shell_exec
执行系统命令
//web396
6. nl *
打开目录下所有文件
PHP:
1. <?= ?>===<?php ?> 2.目录:cd和%
2.6 正则(安全的一道重要防线)
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。