源码:
<?php
$flag='test';
extract($_GET);
if(isset($shiyan))
{
$content=trim(file_get_contents($flag));
if($shiyan==$content)
{
echo'ctf{test}';
}
else
{
echo'Oh.no';
}
}
?>
函数释义:
extract()函数从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。该函数返回成功设置的变量数目。
函数语法如下:
extract(array,extract_rules,prefix),其中array为必填字段,为规定要使用的一个数组,extract函数示例如下图所示:

代码分析:
url 通过 get 的方式传参,传输的数据以数组的形式被封装在$_GET 中;
extract()函数从数组中将变量导入到当前的符号表,该函数使用数组键名作为变量名,使用数组键值作为变量值;
isset()函数判断是否存在变量$shiyan;
trim()函数移除字符串两侧的空白字符或其他预定义字符 ,这里是移除字符串两侧的空格;
file_get_contents()函数将整个文件读入一个字符串;假如$shiyan的值等于文件的内容$content时,就打印出flag。
解题过程:
extract()会将$shiyan和$flag值进行覆盖,将变量的值设置为空或者不存在的文件就满足$shiyan==$content,得到flag为“test”。
https://localhost:63342/test/1.php?shiyan=&flag=

参考链接:
https://github.com/bowu678/php_bugs
https://crayon-xin.github.io/2018/05/21/extract%E5%8F%98%E9%87%8F%E8%A6%86%E7%9B%96/
写在最后:
希望自己不要再拖延了,笔记整理之后及时发出来。。。。




