这里总结了一些攻击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中被移除
其实现步骤:
- 获取参数,函数体
- 拼凑一个
function __lambda_func(参数) {函数体}
的字符串 - 使用eval函数执行它
- 通过
__lambda_func
在函数表中找到eval后得到的函数体,找不到就出错 - 定义一个函数名
"\000_lambda_" . count(anonymous_functions)++
- 用新定义的函数名替换
__lambda_func
- 返回新的函数名
1 | create_function($_GET['args'], $_GET['code']) |
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 | ob_start("system"); |
usort
usort($array, $call_back)
- 用用户自定义的比较函数对一个数组中的值进行排序。
- 如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。即:对array调用$all_back
1 | $a = ["1",2]; |
register_shutdown_function
register_shutdown_function(callback[,param])
- 注册一个回调函数,其会在脚本执行结束时调用(或调用exit()后)
1 | register_shutdown_function("var_dump","1"); |
register_tick_function
1 | declare(ticks=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 | exec("whoami", $a); |
popen($cmd)
无回显
打开一个指向进程的管道,该进程由cmd命令执行产生
返回一个和fopen相同的文件指针
1 | echo fread(popen("whoami", "r"), 9999); |
proc_open($cmd)
无回显
- 执行一个命令,并且打开用来输入/输出的文件指针
1 | $descriptorspec = array( |
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)
返回文件的路径部分