<?php/* # -*- coding: utf-8 -*- # @Author: Firebasky # @Date: 2020-09-16 11:25:09 # @Last Modified by: h1xa # @Last Modified time: 2020-09-28 22:34:07*/highlight_file(__FILE__); include('flag.php'); error_reporting(0); $error='你还想要flag嘛?'; $suces='既然你想要那给你吧!'; foreach($_GET as $key => $value){if($key==='error'){die("what are you doing?!");}$$key=$$value; }foreach($_POST as $key => $value){if($value==='flag'){die("what are you doing?!");}$$key=$$value; } if(!($_POST['flag']==$flag)){die($error); } echo "your are good".$flag."\n"; die($suces);?> 你还想要flag嘛?
这里利用的是变量覆盖,关键点在$$key=$$value,这里把$key的值当作了变量
例如 $key=flag 则$$key=$flag
这里一共有三个变量,$error、$suces和$flag;这里通过die($error)或者die($suces)都可以输出flag,所以有两个payload
第一种:
通过die($error)输出flag,首先我们把$flag的值传给$mm,接着再把$dotast的值传给$error,于是$error的值就是flag,再通过if判断die输出就是flag
例如$flag=ctfshow{xxxxx},?mm=flag,通过第一个for循环,也就是$mm=$flag,$mm=ctfshow{xxxxx},接着再通过第二个for循环,$error=$mm,此时$error=ctfshow{xxxxx}
?mm=flagpost: error=dotast
第二种:
通过die($suces)输出flag,首先我们把flag的值传给suces变量,接着再把flag的值给置空,已达到下面if条件为0不执行的目的,往下执行,die($suces)即可把flag输出
?suces=flag&flag=