PHP中的危险函数
代码执行
函数 | 作用 |
eval() | 把字符串作为PHP代码执行 |
assert() | 检查一个断言是否为 FALSE,可用来执行代码 |
preg_replace() | 执行一个正则表达式的搜索和替换 |
call_user_func() | 把第一个参数作为回调函数调用 |
call_user_func_array() | 调用回调函数,并把一个数组参数作为回调函数的参数 |
array_map() | 为数组的每个元素应用回调函数 |
命令执行
函数 | 作用 |
system() | 输出并返回最后一行shell结果 |
exec() | 执行一个外部程序 |
shall_exec() | 通过shell环境执行命令,并且将完整的输出以字符串的方式返回 |
passthru() | 执行外部程序并且显示原始输出 |
pcntl_exec() | 在当前进程空间执行指定程序 |
popen() | 打开进程文件指针 |
proc_open() | 执行一个命令,并且打开用来输入/输出的文件指针 |
包含函数
函数 | 作用 |
require() | 在变量可控的情况下,我们可以包含任意文件,从而达到getshell的目的 另外,在不同的配置环境下,可以包含不同的文件 |
include() | |
require_once() | |
include_once() |
文件函数操作函数
函数 | 作用 |
copy() | 拷贝 |
file_get_contents | 将整个文件读入一个字符串 |
file_put_contents | 将一个字符串写入文件 |
feil() | 把整个文件读入一个数组中 |
fopen() | 打开文件或者url |
move_uploaded_file() | 将上传的文件移动到新位置 |
readfeil() | 输出文件 |
rename() | 重命名一个文件或目录 |
rmdir() | 删除目录 |
unlink & delete | 删除文件 |
C语言中的危险函数
严重性:很危险
解决方法 | |
gets | 使用 fgets(buf, size, stdin) |
strcpy | 改为使用 strncpy |
strcat | 改为使用 strncat |
sprintf | 改为使用 snprintf,或者使用精度说明符 |
scanf | 使用精度说明符,或自己进行解析 |
sscanf | 使用精度说明符,或自己进行解析 |
fscanf | 使用精度说明符,或自己进行解析 |
vfscanf | 使用精度说明符,或自己进行解析 |
vsprintf | 改为使用 vsnprintf,或者使用精度说明符 |
vscanf | 使用精度说明符,或自己进行解析 |
vsscanf | 使用精度说明符,或自己进行解析 |
streadd | 确保分配的目的地参数大小是源参数大小的四倍 |
strecpy | 确保分配的目的地参数大小是源参数大小的四倍 |
strtrns | 手工检查来查看目的地大小是否至少与源字符串相等 |
很危险(或稍小,取决于实现)
realpath | 分配缓冲区大小为 MAXPATHLEN,或手工检查参数以确保输入参数不超过 MAXPATHLEN |
syslog | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小 |
getopt | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小 |
getopt_long | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小 |
getpass | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小 |
中等危险(前四)、低危险(后八)
函数 | 解决方法 |
getchar | 如果在循环中使用该函数,确保检查缓冲区边界 |
getc | 如果在循环中使用该函数,确保检查缓冲区边界 |
fgetc | 如果在循环中使用该函数,确保检查缓冲区边界 |
read | 如果在循环中使用该函数,确保检查缓冲区边界 |
bcopy | 确保缓冲区大小与它所说的一样大 |
fgets | 确保缓冲区大小与它所说的一样大 |
memcpy | 确保缓冲区大小与它所说的一样大 |
snprintf | 确保缓冲区大小与它所说的一样大 |
strccpy | 确保缓冲区大小与它所说的一样大 |
strcadd | 确保缓冲区大小与它所说的一样大 |
strncpy | 确保缓冲区大小与它所说的一样大 |
vsnprintf | 确保缓冲区大小与它所说的一样大 |
特殊的危险函数
函数 | |
phpinfo() | 信息泄露 |
symlink() | 软连接-读取文件内容 |
readlin() | |
string getenv (string $) | 环境变量 |
bool putenv(string $) | |
bool dl (string $) | 加载扩展:载入指定参数的PHP扩展 |
string ini_get | 成功时返回配置选项的值 |
string ini_set(string $,string $) | 设置指定配置选项的值 |
void ini_restore(string $) | 恢复指定的配置选项到它的原始值 |
bool is_numeric(mixed $var) | 仅用is_numeric判断而不是用intval转换就有可能插入十六进制的字符串到数据库,进而可能导致sql二次注入 |
bool in_array() | 数组相关 |
array get_defined_vars(void) | 返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量,服务器变量和用户定义的变量 |
array get_defined_constants(void) | 返回当前已定义的常量名和值。这包含define()函数创建的,也包含了所有扩展所创建的 |
array get_defined_functions(void) | 返回一个包含所有已定义函数列表的多维数组 |
array get_include_feils(void) | 返回所有被include,include_once,require和require_once的文件名 |
void parse_str(string &str [, array &$star]) | 如果str是URL传递入的查询字符串(query string ),则将它解析为变量并设置到当前作用域 |
int extract(array & $var_array [,int $extract_type = EXTR_OVERWRITE [, string $prefix = NULL | 本函数用来将变量从数组中导入到当前的符号表中,检查每个键名看是否可以作为一个合法的变量名,同事也检查和符号表中已有的变量名的冲突 |
bool mb_parse_str (string $encoded_string [,array &$result]) | 解析GET/POST/COOKIE数据并设置全局变量。由于PHP不提供原始POST/COOKIE数据,目前它仅能够用于GET数据。它解析了URL编码过的数据,检测其编码,并转换编码为内部编码,然后设置其值为array的result或者全局变量 |
bool import_request_variables(string $type [,string $prefix]) | 将GET/POST/Cookie变量导入到全局作用域中,如果你禁用了register_globals, 但又想用到一些全局变量,那么此函数就很有用 |