2

php常利用的函数 | Dar1in9's Blog

 1 year ago
source link: https://dar1in9s.github.io/2022/03/04/php%E5%B8%B8%E5%88%A9%E7%94%A8%E7%9A%84%E5%87%BD%E6%95%B0/#%E8%8E%B7%E5%8F%96%E6%96%87%E4%BB%B6%E4%BF%A1%E6%81%AF
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

这里总结了一些攻击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. 返回新的函数名
php
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()函数将清除缓冲区的内容

php
ob_start("system");
echo "ls";
ob_end_flush();

// 无回显,但能执行

usort

usort($array, $call_back)

  • 用用户自定义的比较函数对一个数组中的值进行排序。
  • 如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。即:对array调用$all_back
php
$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()后)
php
register_shutdown_function("var_dump","1");

register_tick_function

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

filter_var

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

filter_var_array

php
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

php
echo shell_exec("whoami");

exec(cmd,output) 无回显

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

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

php
exec("whoami", $a);
var_dump($a);

popen($cmd) 无回显

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

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

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

proc_open($cmd) 无回显

  • 执行一个命令,并且打开用来输入/输出的文件指针
php
$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) 返回文件的路径部分


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK