0x01 前言

借鉴了某个师傅的文章,多学习多做笔记
这一篇其实就是一个简单的总结。
告诉我们如果审计的时候遇到这些函数了。
看看外部是否可控。
如果可控,那么就可能有命令执行/代码执行。
image.png

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 反引号(就是``)

  1. <?php
  2. // 文件名: a.php
  3. // http://atest.test/a.php?test=whoami
  4. // 执行完毕以后,使用 var_dump()函数,页面会返回执行的命令结果
  5. $test = $_GET['test'];
  6. $command = `$test`;
  7. var_dump($command);
  8. ?>

0x03.2 system

  1. <?php
  2. // 文件名: a.php
  3. // http://atest.test/a.php?test=whoami
  4. // 执行完毕以后,页面会返回执行的命令结果
  5. $test = $_GET['test'];
  6. system($test);
  7. ?>

0x03.3 exec

  1. <?php
  2. // 文件名: a.php
  3. // http://atest.test/a.php?test=whoami >> 1.txt
  4. // 执行成功以后,会在根目录下生成文件1.txt 里面会记录 whoami 的值
  5. $test = $_GET['test'];
  6. exec($test);
  7. ?>

0x03.4 passthru

  1. <?php
  2. // 文件名: a.php
  3. // http://atest.test/a.php?test=whoami >> 1.txt
  4. // 执行成功以后,会在根目录下生成文件1.txt 里面会记录 whoami 的值
  5. $test = $_GET['test'];
  6. passthru($test);
  7. ?>

0x03.5 shell_exec

  1. <?php
  2. // 文件名: a.php
  3. // http://atest.test/a.php?test=whoami >> 1.txt
  4. // 执行成功以后,会在根目录下生成文件1.txt 里面会记录 whoami 的值
  5. $test = $_GET['test'];
  6. shell_exec($test);
  7. ?>

0x03.6 ob_start

  1. <?php
  2. // 文件名: a.php
  3. // http://atest.test/a.php?test=whoami
  4. // 执行完毕以后,页面会返回执行的命令结果
  5. $sky = 'system';
  6. ob_start($sky);
  7. echo $_GET['test'];
  8. ob_end_flush();
  9. ?>

0x03.7 popen

  1. <?php
  2. // 文件名: a.php
  3. // http://atest.test/a.php?test=whoami >> 1.txt
  4. // 执行成功以后,会在根目录下生成文件1.txt 里面会记录 whoami 的值
  5. $test = $_GET['test'];
  6. popen($test,'r');
  7. ?>

0x03.8 array_map

  1. <?php
  2. // 文件名: a.php
  3. // http://atest.test/a.php?test=phpinfo
  4. $test = $_GET['test'];
  5. $array = [1,2,3,4,5];
  6. array_map($test,$array);
  7. ?>

0x03.9 eval

  1. <?php
  2. // 文件名: a.php
  3. // http://atest.test/a.php?test=phpinfo();
  4. $test = $_GET['test'];
  5. eval($test);
  6. ?>
  7. eval()函数把 字符串按照PHP代码来计算。
  8. 该字符串必须是合法的PHP代码,且必须以分号结尾。
  9. 如果没有在代码字符串中调用return语句,则返回NULL,如果代码中存在解析错误,则eval函数返回 false

0x03.10 preg_replace

  1. <?php
  2. // 注1
  3. // http://127.0.0.1/a.php?cmd=<php>phpinfo()</php>
  4. preg_replace("/<php>(.*?)<\/php>/e","\\1",$_GET['cmd']);
  5. // 注2
  6. // http://127.0.0.1/a.php?cmd=phpinfo()
  7. preg_replace("/cmd/e",$_GET['cmd'],"cmd");
  8. // 注3
  9. // http://127.0.0.1/a.php?cmd=[php]phpinfo();[/php]
  10. preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", "\\1", $_GET['cmd']);
  11. ?>

0x03.11 assert

  1. <?php
  2. // http://127.0.0.1/a.php?test=phpinfo();
  3. $test = $_GET['test'];
  4. assert($test);
  5. ?>

0x03.12 call_user_func

  1. <?php
  2. // http://127.0.0.1/a.php?test=phpinfo();
  3. $test = $_GET['test'];
  4. $a = 'assert';
  5. call_user_func($a,$test);
  6. ?>

0x03.13 call_user_func_array

  1. <?php
  2. // http://127.0.0.1/a.php?test[]=phpinfo();
  3. $test = $_GET['test'];
  4. $a = 'assert';
  5. call_user_func_array($a,$test);
  6. ?>

0x03.14 create_function

  1. <?php
  2. // http://atest.test/a.php?1=}phpinfo();%23
  3. $function = $_GET[1];
  4. create_function('', $function);
  5. ?>

0x03.15 动态函数

  1. <?php
  2. // 文件名: a.php
  3. // http://atest.test/a.php?fun=system&cmd=whoami
  4. // 执行完毕以后,会根据调用的函数来确定是否返回执行的命令结果
  5. $fun = $_GET['fun'];
  6. $cmd = $_GET['cmd'];
  7. $fun($cmd);
  8. ?>