php常利用的函数

这里总结了一些攻击php网站常用的函数

可以执行php代码的函数

eval和assert

eval其实是php中的语言结构,不是函数。assert在php7之后也成为了语言结构。

preg_replace

preg_replace($pattern,replacement,subject)

  • 执行一个正则表达式的搜索和替换,搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。

  • 当pattern使用了\e修饰符时,会将replacement当做php代码执行

  • php7以后,不再支持\e修饰符

create_function(args, code)

在php中,函数create_function主要用来创建匿名函数,php8中被移除

其实现步骤:

  1. 获取参数,函数体
  2. 拼凑一个function __lambda_func(参数) {函数体}的字符串
  3. 使用eval函数执行它
  4. 通过__lambda_func在函数表中找到eval后得到的函数体,找不到就出错
  5. 定义一个函数名"\000_lambda_" . count(anonymous_functions)++
  6. 用新定义的函数名替换__lambda_func
  7. 返回新的函数名
1
2
3
4
5
create_function($_GET['args'], $_GET['code'])
==> eval('function __lambda_func('.$_GET['args'].'){'.$_GET['code'].'}')

// 若args可控,args=){}phpinfo();/*
// 若code可控,code=}phpinfo();/*

call_user_func

call_user_func(callback, parameter)

  • 把第一个参数作为回调函数调用,返回值为回调函数的返回值

  • 第一个参数callback是被调用的回调函数,其余参数是回调函数的参数

  • 相当于 $callback($parameter)

如果第一个参数是一个数组,则此call_user_func将用来调用一个类里面的方法:

call_user_func(array($classname, 'say_hello')); //将会调用$classname的say_hello方法

例如:call_user_func("var_dump", "hello");

call_user_func_array

call_user_func_array(callback,callback,callback,callback,param_arr)

  • 把第一个参数作为回调函数调用

  • 第二个参数是一个数组,表示参数列表,按照顺序依次会传递给要调用的函数。

  • 传入的数组应为索引数组

  • 返回值为回调函数的结果,如果出错就返回false

例如:call_user_func_array("var_dump", ["hello"]);

array_map

array_map(callback,array)

  • 为数组的每个元素应用回调函数

  • 第二个参数必须是数组

  • 返回值为数组,是为每个元素应用callback函数的结果的数组

例如:array_map("var_dump", ["hello"]);

array_filter

array_filter($array,$callback)

  • 用回调函数过滤数组中的单元

  • 依次将array中的每个值传递到callback函数,如果callback函数返回true,则array数组的当前值会被包含在返回的结果数组中

  • 返回值为过滤后的数组

例如:array_filter(["hello"], "var_dump");

ob_start

ob_start($output_callback)

  • 此函数将打开输出缓冲区。当输出缓冲区激活后,脚本将不会输出内容(除了http表头外)

  • $output_callback指定输出的回调函数,此时输出的内容将会被当做回调函数的参数

  • 使用ob_end_flush()函数将清除缓冲区的内容

1
2
3
4
5
ob_start("system");
echo "ls";
ob_end_flush();

// 无回显,但能执行

usort

usort($array, $call_back)

  • 用用户自定义的比较函数对一个数组中的值进行排序。
  • 如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。即:对array调用$all_back
1
2
3
4
5
6
7
$a = ["1",2];
usort($a, "var_dump");
// string(1) "1"
// int(2)

// ?1[]=test&1[]=phpinfo();&2=assert
usort(...$_GET);

register_shutdown_function

register_shutdown_function(callback[,param])

  • 注册一个回调函数,其会在脚本执行结束时调用(或调用exit()后)
1
register_shutdown_function("var_dump","1");

register_tick_function

1
2
declare(ticks=1); 
register_tick_function('var_dump', '1');

filter_var

1
filter_var('1', FILTER_CALLBACK, array('options' => 'var_dump'));

filter_var_array

1
filter_var_array(array('test' => "1"), array('test' => array('filter' => FILTER_CALLBACK, 'options' => 'var_dump')));

php中可以执行系统命令的函数

system($cmd) 有回显

  • 执行系统命令,并输出结果

  • 成功则返回命令输出的最后一行,失败则返回false

passthru($cmd) 有回显

  • 执行系统命令,并显示原始输出

  • 无返回值

shell_exec($cmd) 无回显

  • 执行命令,并将完成的输出以字符串的方式返回

  • 如果执行发生错误,则返回null

1
echo shell_exec("whoami");

exec(cmd,output) 无回显

  • 执行cmd命令。如果提供了output参数,那么命令执行的结果将会输出到output参数中

  • 返回命令执行的最后一行的内容

1
2
exec("whoami", $a);
var_dump($a);

popen($cmd) 无回显

  • 打开一个指向进程的管道,该进程由cmd命令执行产生

  • 返回一个和fopen相同的文件指针

1
echo fread(popen("whoami", "r"), 9999);

proc_open($cmd) 无回显

  • 执行一个命令,并且打开用来输入/输出的文件指针
1
2
3
4
5
6
7
8
9
10
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);
$process = proc_open("whoami", $descriptorspec, $pipes, null);
if (is_resource($process)) {
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
}

pcntl_exec(path, args)无回显

  • 在当前进程空间执行指定程序

  • $path是可执行文件路径

  • 发生错误时返回false,没有错误时无返回内容

php中和目录与文件相关的函数

读文件

readfile($filename) 有回显

  • 输出文件内容,返回从文件中读入的字节数,如果出错,返回false

highlight_file($filename) 有回显

  • 语法高亮一个文件

fpassthru(fopen($filename, 'r')); 有回显

show_source($filename)

file_get_contents($filename)

  • 将整个文件读入一个字符串,如果失败,返回false

file($filename)

  • 把整个文件读入一个数组中,返回那个数组,如果出错,返回false

列目录

scandir($path)

  • 列出指定路径中的文件和目录,如果失败返回false

glob($pattern)

  • 寻找与pattern匹配的文件路径,将其结果返回为一个数组,如果出错返回false

readdir($dir_handle)

  • 从目录句柄中读取一条条目
  • readdir(opendir($path))

获取文件信息

filetype($filename) 返回文件的类型,如果出错,返回false

filesize($filename) 返回文件大小的字节数,如果出错,返回false

realpath($filemame) 返回文件的绝对路径,失败返回false

getcwd() 返回当前文件目录路径

dirname($file) 返回文件的路径部分

文章作者: Dar1in9
文章链接: http://dar1in9s.github.io/2022/03/04/php/php常利用的函数/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Dar1in9's Blog