首页 > 技术文章 > php_bugs学习 01 extract变量覆盖

murkuo 2021-07-04 02:22 原文

php_bugs学习 01 extract变量覆盖

来源: https://github.com/bowu678/php_bugs
参考:https://www.cnblogs.com/-mo-/p/11652926.html

ps:由于一些我不太清楚的原因,导致感觉GitHub项目里面少了一些东西?比如数据库。。。还有题目感觉不太一样?

<?php

$flag='xxx'; 
extract($_GET);
 if(isset($shiyan))
 { 
    $content=trim(file_get_contents($flag));
    if($shiyan==$content)
    { 
        echo'ctf{xxx}'; 
    }
   else
   { 
    echo'Oh.no';
   } 
   }

?>

目的:达成$shiyan==$content

考点:extract的变量覆盖

想法:

?shiyan=1&content=1
但是失败了

查看官方文档

Rgwkgx.png

这么看来我构造的应该是格式不对

在看一个例子

RgwAv6.png

默认情况下extract_rules为EXTR_OVERWRITE

也就是说会直接覆盖原本的变量

RgwebD.png

同时注意一下代码中的trim

RgwnVe.png

由于flag的数值未知,所以我们需要通过extrat使得flag的值(也就是content)与我们可控的shiyan数值相等

so,flag只能上传空值,那么$shiyan也上传为空值即可

payload:

?shiyan=
?shiyan=&flag
?shiyan=&content

这里的=&就相当于取得别名(就是这两个玩意都同时被赋值为空了),数据地址均为一致的

这些都可以保证flag的数值为空

$$变量覆盖

提交参数chs,则可覆盖变量"$chs"的值。$key为chs时,$$key就变成$chs

<?  
$chs = '';  
if($_POST && $charset != 'utf-8'){  
    $chs = new Chinese('UTF-8', $charset);  
    foreach($_POST as $key => $value){  
        $$key = $chs->Convert($value);  
    }  
    unset($chs);  
} 

关于变量覆盖具体可以参考这篇文章:
变量覆盖
这道题可以这么改一下更贴近ctf
源码:

<?php

$flag='wdl8jH0kbr4'; 
extract($_GET);
 if(isset($shiyan))
 { 
    $content=trim(file_get_contents($flag));
    if($shiyan==$content)
    { 
        echo 'ctf{you_win_it}'; 
    }
   else
   { 
    echo 'Oh.no';
   } 
 }

?>

extract($_GET);
 if(isset($shiyan))
 { 
    $content=trim(file_get_contents($flag));
    if($shiyan==$content)
    { 
        echo 'ctf{xxx}'; 
    }
   else
   { 
    echo ‘Oh.no';
   } 
 }

推荐阅读