0x01 前言
借鉴了某个师傅的文章,多学习多做笔记
这一篇其实就是一个简单的总结。
告诉我们如果审计的时候遇到这些函数了。
看看外部是否可控。
如果可控,那么就可能有命令执行/代码执行。
0x02 漏洞危害
web 应用程序接受用户输入,拼接到执行的系统命令中执行。
尝试原因:
1. 用户输入未被过滤和净化
2. 拼接到系统命令中执行
0x02 相关函数
- 反引号(就是``)
- system
- exec
- passthru
- shell_exec
- ob_start
- popen
这3个函数经常被用来绕 disable_functions
popen()/proc_open()/pcntl_exec()
- array_map
- eval
- preg_replace
- assert
- call_user_func
- call_user_func_array
- create_function
提示: 某些情况下,要注意存在以上函数的PHP文件,有可能是 webshell
0x03 部分函数使用例子
系统: Windows8
服务器: Apache
PHP版本: PHP5.6.27-nts
0x03.1 反引号(就是``)
<?php
// 文件名: a.php
// http://atest.test/a.php?test=whoami
// 执行完毕以后,使用 var_dump()函数,页面会返回执行的命令结果
$test = $_GET['test'];
$command = `$test`;
var_dump($command);
?>
0x03.2 system
<?php
// 文件名: a.php
// http://atest.test/a.php?test=whoami
// 执行完毕以后,页面会返回执行的命令结果
$test = $_GET['test'];
system($test);
?>
0x03.3 exec
<?php
// 文件名: a.php
// http://atest.test/a.php?test=whoami >> 1.txt
// 执行成功以后,会在根目录下生成文件1.txt 里面会记录 whoami 的值
$test = $_GET['test'];
exec($test);
?>
0x03.4 passthru
<?php
// 文件名: a.php
// http://atest.test/a.php?test=whoami >> 1.txt
// 执行成功以后,会在根目录下生成文件1.txt 里面会记录 whoami 的值
$test = $_GET['test'];
passthru($test);
?>
0x03.5 shell_exec
<?php
// 文件名: a.php
// http://atest.test/a.php?test=whoami >> 1.txt
// 执行成功以后,会在根目录下生成文件1.txt 里面会记录 whoami 的值
$test = $_GET['test'];
shell_exec($test);
?>
0x03.6 ob_start
<?php
// 文件名: a.php
// http://atest.test/a.php?test=whoami
// 执行完毕以后,页面会返回执行的命令结果
$sky = 'system';
ob_start($sky);
echo $_GET['test'];
ob_end_flush();
?>
0x03.7 popen
<?php
// 文件名: a.php
// http://atest.test/a.php?test=whoami >> 1.txt
// 执行成功以后,会在根目录下生成文件1.txt 里面会记录 whoami 的值
$test = $_GET['test'];
popen($test,'r');
?>
0x03.8 array_map
<?php
// 文件名: a.php
// http://atest.test/a.php?test=phpinfo
$test = $_GET['test'];
$array = [1,2,3,4,5];
array_map($test,$array);
?>
0x03.9 eval
<?php
// 文件名: a.php
// http://atest.test/a.php?test=phpinfo();
$test = $_GET['test'];
eval($test);
?>
eval()函数把 字符串按照PHP代码来计算。
该字符串必须是合法的PHP代码,且必须以分号结尾。
如果没有在代码字符串中调用return语句,则返回NULL,如果代码中存在解析错误,则eval函数返回 false
0x03.10 preg_replace
<?php
// 注1
// http://127.0.0.1/a.php?cmd=<php>phpinfo()</php>
preg_replace("/<php>(.*?)<\/php>/e","\\1",$_GET['cmd']);
// 注2
// http://127.0.0.1/a.php?cmd=phpinfo()
preg_replace("/cmd/e",$_GET['cmd'],"cmd");
// 注3
// http://127.0.0.1/a.php?cmd=[php]phpinfo();[/php]
preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", "\\1", $_GET['cmd']);
?>
0x03.11 assert
<?php
// http://127.0.0.1/a.php?test=phpinfo();
$test = $_GET['test'];
assert($test);
?>
0x03.12 call_user_func
<?php
// http://127.0.0.1/a.php?test=phpinfo();
$test = $_GET['test'];
$a = 'assert';
call_user_func($a,$test);
?>
0x03.13 call_user_func_array
<?php
// http://127.0.0.1/a.php?test[]=phpinfo();
$test = $_GET['test'];
$a = 'assert';
call_user_func_array($a,$test);
?>
0x03.14 create_function
<?php
// http://atest.test/a.php?1=}phpinfo();%23
$function = $_GET[1];
create_function('', $function);
?>
0x03.15 动态函数
<?php
// 文件名: a.php
// http://atest.test/a.php?fun=system&cmd=whoami
// 执行完毕以后,会根据调用的函数来确定是否返回执行的命令结果
$fun = $_GET['fun'];
$cmd = $_GET['cmd'];
$fun($cmd);
?>