0x01 前言

这一篇其实就是一个简单的总结。
告诉我们如果审计的时候遇到这些函数了。
看看外部是否可控。
如果可控,那么就可能有命令执行/代码执行。

0x02 漏洞危害

继承web服务器的权限执行命令或是执行代码

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

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. ?>

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. ?>