初探审计-extract变量覆盖
Posted goodswarm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初探审计-extract变量覆盖相关的知识,希望对你有一定的参考价值。
目录
Ox1 源码
<?php
$flag='xxx';
extract($_GET);
if(isset($shiyan))
$content=trim(file_get_contents($flag));
if($shiyan==$content)
echo'ctfxxx';
else
echo'Oh.no';
?>
Ox2 函数注解
01 extract()-详
extract ( array &$array [, int $flags = EXTR_OVERWRITE [, string $prefix = NULL ]] ) : int
本函数用来将变量从数组中导入到当前的符号表中。
检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。
参数 | 含义 |
---|---|
array | 一个关联数组。此函数会将键名当作变量名,值作为变量的值。 对每个键/值对都会在当前的符号表中建立变量,并受到 flags 和 prefix 参数的影响。 |
flags | 对待非法/数字和冲突的键名的方法将根据取出标记 flags 参数决定。 |
prefix | 仅在 flags 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。 如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。 |
flags值表(部分):如果没有指定 flags
,则被假定为 EXTR_OVERWRITE。
值 | 含义 |
---|---|
EXTR_OVERWRITE | 如果有冲突,覆盖已有的变量。 |
EXTR_SKIP | 如果有冲突,不覆盖已有的变量。 |
EXTR_PREFIX_SAME | 如果有冲突,在变量名前加上前缀 prefix 。 |
EXTR_PREFIX_ALL | 给所有变量名加上前缀 prefix 。 |
02 file_get_contents()-略
file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] ) : string
file_get_contents — 将整个文件读入一个字符串。
03 trim()-略
trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] ) : string
trim — 去除字符串首尾处的空白字符(或者其他字符)。
Ox3 payload
http://127.0.0.1/Php_Bug/extract1.php?shiyan=1&flag=1
Ox4 我的理解与分析
01 一句话概括
在查阅官网手册后,我们不难发现——传入的同名变量覆盖了已有变量。
02 错误类型归纳
不严谨的编程手法。
官网也有提示,严谨使用此函数。
Ox5 fix方案
$content=trim(file_get_contents($flag));
改为
$content=trim(file_get_contents($flag,EXTR_SKIP)); #禁止覆盖
或者
$content=trim(file_get_contents($flag,EXTR_PREFIX_SAM,"usr")); #冲突变量,添加前缀
Ox6 Ref
感谢"git主"(滑稽)整理:github地址
感谢官网助攻:官网手册
以上是关于初探审计-extract变量覆盖的主要内容,如果未能解决你的问题,请参考以下文章