0x01:eval()

eval会把里面的字符串当作php代码执行

1
eval($_POST[drac]);

0x02:assert()

assert也会把里面的字符串当作php代码执行

1
assert("phpinfo()");

0x03:preg_replace()

preg_replace(“字符串/e”, “phpinfo()”,”文本”)
在文本中搜索字符串,当搜索字符串使用e模式的时候,会执行替换后的字符串
注意要替换的字符在两个斜杠里面

1
preg_replace("/hello/e","phpinfo()","hello man");

0x04:create_function()

该函数会创建一个函数,该函数第一个参数为函数的参数,第二个参数为函数体
那么我们可以通过该函数创建一个函数来调用其它危险函数

1
2
$func = create_function('$params', 'return system($params);');
$func('whoami');

0x05:字符串拼接为函数名,然后调用

1
2
$func = "syst"."em";
$func("whoami");

0x06:通过call_user_func()调用函数

1
2
3
4
5
function test($params)
{
return eval($params);
}
call_user_func('test','phpinfo();');

我们还可以用它调用php内嵌函数

1
call_user_func('system', 'whoami');

0x07:文件包含函数(require,include,require_once,include_once)

被文件包含函数包含的文件,不论是什么文件,都会被当作php文件执行,因此如果我们发现一个文件包含的漏洞,就可以绕开很多的防护来getshell了

还可以结合filter文件流读取任意文件(之所以要base64编码是为了去掉php标签,让被读取的文件不执行):

1
2
include($_GET['file'])
?file=php://filter/convert.base64-encode/resource=index.php

我们新建一个文件,index.php

1
2
<?php
echo "hello world";

然后我们用文件包含结合filter文件流来读取index.php

0x08:命令执行函数(exec,passthru,proc_open,shell_exec,system,popen)

如果待执行命令需要拼接前缀,我们可以结合管道符来执行任意命令

1
2
<?php
echo shell_exec("ping ".$_GET['v']);


它会先执行ping 2.2.2.2 然后执行 whoami并把结果输出到页面

0x10:is_numeric,in_array

is_numeric判断16进制为true,因此如果不用intval进行转换插入的值,就可能造成二次注入

in_array第三个参数如果没有设置为true的话,比较只比较值,不比较类型,如果设置为true,则值和类型都要比较

1
2
$a = "1abc";
echo in_array($a,array(1,2,3));

1
2
$a = "1abc";
echo in_array($a,array(1,2,3),true);

0x11:变量覆盖(parse_str,extract,mb_parse_str,import_request_variables)

1
2
3
4
5
6
<?php
$str = "abc=test";
$abc = 123;
parse_str($str);
echo $abc;
echo "\n";

将字符串中的变量注册到当前域的变量可以覆盖掉原本的变量

最后更新: 2018年07月28日 12:31

原始链接: http://drac0nids.top/2018/07/07/php中的危险函数/

× 请我吃糖~
打赏二维码