代码审计中常见危险函数及特殊函数


php代码执行函数

eval

1
2
@eval('echo "test";');
echo "test";

assert

assert('system("whoami");');

因为大多数杀毒软件把eval 列入黑名单,所以用assert来代替eval来执行具体操作

preg_replace

preg_replace("/test/e","phpinfo();","jutst test");

因为大多数杀毒软件把eval 列入黑名单,所以用assert来代替eval来执行具体操作

匿名函数

1
2
$cfunc = create_function('$v', 'return system(&v);');
$cfunc = ('whoami');
1
2
$sfunc = 'sys'.'tem';
$sfunc('whoami')

创建一个匿名函数,并返回独一无二的函数名

回调函数

mixed call_user_func(callabel callback [,mixedparameter [, mixed $...]])

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

1
2
3
4
function test($var){
echo "callable test $var";
}
call_user_func('test','virink');

mixed call_user_func_array(callable callback, arrayparam_arr)

第一个参数作为回调函数(callback)调用,把参数数组(param_arr)作为回调函数的参数传入

包含函数

  • require
  • include
  • require_once
  • include_once

包含函数一共有四个,主要作用为包含并运行指定文件

include $file;

include($_GET['file']);

命令执行函数

exec()

执行一个外部程序

passthru()

执行外部程序并且显示原始输出

proc_open()

执行一个命令,并且打开用来输出/输入的文件指针

shell_exec()

echo shell_exec('ping 127.0.0.1');

1
2
echo shell_exec('ping' . $_GET["v"]);
#访问http://www.shadowflow.com/test_fun.php?v=127.0.0.1|whoami执行whoami系统命令

通过shell环境执行命令,并且将完整的输出以字符串的方式返回。

system()

执行外部程序,并且显示输出

popen()

用过popen()的参数传递一条命令,并对popen()锁打开的文件进行执行

文件操作函数

  • copy————————拷贝文件
  • file_get_contents———将整个文件读入一个字符串
  • file_put_contents———将一个字符串写入文件
  • file—————————-把整个文件读入一个数组中
  • fopen————————打开文件或者url
  • move_uploaded_file—-将上传的文件移动到新位置
  • readfile———————-输出文件
  • rename———————重命名一个文件或目录
  • rmdir————————删除目录
  • unlink & delete———–删除文件

任意文件读取,写入,删除往往是上面几个函数受到了控制(当然还有其他函数)

读取:可以读取配置文件,拿到key
写入:可以写入shell代码相关的内容
删除:可以删除lock文件而可以重新安装覆盖

特殊函数

信息泄露

phpinfo()

软连接-读取文件内容

symlink()

一般是在linux服务器上使用的,为一个目标建立一个连接,在读取这个链接所连接的文件的内容,并返回内容

readlin()

环境变量

string getenv (string $varname)

获取一个环境变量的值

bool putenv(string $setting)

添加setting 到服务器环境变量。环境变量仅存活于当前请求期间。在请求结束时环境会恢复到初始状态

加载扩展

bool dl (string $library)

载入指定参数library的PHP扩展

配置相关

  • string ini_get(string $varname)
    成功时返回配置选项的值
  • string ini_set(string newvalue)
    string ini_alter(string newvalue)
    设置指定配置选项的值。这个选项会 在脚本运行时保持新的值,并在脚本结束时恢复。
  • void ini_restore(string $varname)
    恢复指定的配置选项到它的原始值

数字判断

bool is_numeric(mixed $var)

仅用is_numeric判断而不是用intval转换就有可能插入十六进制的字符串到数据库,进而可能导致sql二次注入

数组相关

bool in_array (mixed needle, arrayhaystack [,bool $strict=FALSE])

在haystack中搜索needle,如果没有设置strict则使用宽松的比较。
该函数有一个特性,比较之前会进行自动类型转换

1
2
$a = '1abc'
in_array($a, array(1,2,3))的返回值会是真,因为1abc自动转换成了1,而1在数组里

变量覆盖相关

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, 但又想用到一些全局变量,那么此函数就很有用

列目录

glob()函数依照libc glob()函数使用规则寻找所有与pattern匹配的文件路径,类似于一般shells所用的规则一样。不进行缩写扩展或参数代替。

1
2
echo "<pre>"
print_r(glob("*.php"));

无参数获取信息

array get_defined_vars(void)

返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量,服务器变量和用户定义的变量。

array get_defined_constants([bool $categorase=false])

返回当前已定义的常量名和值。这包含define()函数创建的,也包含了所有扩展所创建的

array get_defined_functions(void)

返回一个包含所有已定义函数列表的多维数组

array get_include_files(void)

返回所有被include,include_once,require和require_once的文件名

转载链接

------ 本文结束 ------

本文标题:代码审计中常见危险函数及特殊函数

文章作者:ApiCoder

发布时间:2019年07月15日 - 17:07

最后更新:2019年07月25日 - 01:07

原始链接:http://www.safeinfo.me/2019/07/15/代码审计中常见危险函数及特殊函数.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

ApiCoder wechat
扫一扫,加入信安圈。
0%