初探审计-extract变量覆盖

目录

  • Ox1 源码
  • Ox2 函数注解
    • 01 extract()-详
    • 02 file_get_contents()-略
    • 03 trim()-略
  • Ox3 payload
  • Ox4 我的理解与分析
    • 01 一句话概括
    • 02 错误类型归纳
  • Ox5 fix方案
  • Ox6 Ref

Ox1 源码

<?php

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

?>

Ox2 函数注解

01 extract()-详

extract ( array &$array [, int $flags = EXTR_OVERWRITE [, string $prefix = NULL ]] ) : int

本函数用来将变量从数组中导入到当前的符号表中。

检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。

参数 含义
array 一个关联数组。此函数会将键名当作变量名,值作为变量的值。 对每个键/值对都会在当前的符号表中建立变量,并受到 flagsprefix 参数的影响。
flags 对待非法/数字和冲突的键名的方法将根据取出标记 flags 参数决定。
prefix 仅在 flags 的值是 EXTR_PREFIX_SAMEEXTR_PREFIX_ALLEXTR_PREFIX_INVALIDEXTR_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地址

感谢官网助攻:官网手册

原文地址:https://www.cnblogs.com/goodswarm/p/10995256.html

时间: 2024-08-01 04:46:12

初探审计-extract变量覆盖的相关文章

代码审计-extract变量覆盖

<?php $flag='xxx'; extract($_GET); if(isset($shiyan)) { $content=trim(file_get_contents($flag)); if($shiyan==$content) { echo'flag{xxx}'; } else { echo'Oh.no'; } } ?> file_get_contents() 函数把整个文件读入一个字符串中. extract() 函数从数组中将变量导入到当前的符号表. 大概就是将flag变量与shi

变量覆盖漏洞----extract()函数

Extract()函数引起的变量覆盖漏洞 该函数使用数组键名作为变量名,使用数组键值作为变量值.但是当变量中有同名的元素时,该函数默认将原有的值给覆盖掉.这就造成了变量覆盖漏洞. 一.我们来查看一串代码:1.文件将get方法传输进来的值通过extrace()函数处理.2.通过两个if语句分别判断是否存在gift变量,和变量gift的值和变量content的值是否相等.变量content的值是通过读取变量test的值获取到的.如果两个变量相等输出flag.如果不相等,输出错误. 二.但是我们并不知

CTF-代码审计(1)——parse_str()变量覆盖

题目连接:http://222.18.158.226:7000/iscc.php 考点:parse_str()变量覆盖 代码: PHP知识点: 1.parse_url() 参照网址:https://www.php.net/manual/zh/function.parse-url.php 2.$_SERVER[] 参考网址:https://php.net/manual/zh/reserved.variables.server.php 3.parse_str() 参考网址:http://www.w3

7. 由一道ctf学习变量覆盖漏洞

0×00 背景 近期在研究学习变量覆盖漏洞的问题,于是就把之前学习的和近期看到的CTF题目中有关变量覆盖的题目结合下进一步研究. 通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞.经常导致变量覆盖漏洞场景有:$$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册等. 本篇收集了几个CTF中的题目作为例子,对$$,extract(),parse_str()的问题进行总结. 0×

php代码审计之变量覆盖

变量覆盖一般由这四个函数引起 <?php $b=3; $a = array('b' => '1' ); extract($a,EXTR_OVERWRITE); print_r($b); //extract 有三种形式可能导致变量覆盖,第一种是第二个参数为EXTR_OVERWRITE,他表示如果有冲突,覆盖原有的变量.第二种情况是只传入第一个参数,默认为EXTR_OVERWRITE模式,第三种是第二个参数为EXTR_IF_EXISTS,他表示在当前符号表中已有同名变量时,覆盖它们的值,其他的都不

【代码审计】变量覆盖漏洞详解

一.漏洞介绍 变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击 二.漏洞函数 变量覆盖漏洞大多数由函数使用不当导致,经常引发变量覆盖漏洞的函数有:extract(),parse_str()和import_request_variables() 1.extract() 目前最常见的就是这个函数,使用频率最高,导致的漏洞也最多  extract(array,extract_rules,prefix)  参数 描述 array 必需.规定要

齐博CMS变量覆盖漏洞exp

 漏洞的具体分析在 http://security.alibaba.com/blog/blog.htm?spm=0.0.0.0.AooULy&id=13,下面公布一下我写的漏洞利用以及exp. 利用步骤如下: (1)首先访问/member下面的"评论管理"功能,抓包 (2)在http request中构造一个attachment,如下: POST /qibo/member/comment.php?job=yz&yz=0 HTTP/1.1 Host: 127.0.0.

变量 覆盖漏洞----$$

变量覆盖漏洞经常引发变量覆盖漏洞的函数有:extract(),parsestr()和importrequestvariables()和$$(可变变量) $$可变变量引起的变量覆盖漏洞一.我们先来查看源代码进行分析1.Include 调用了flag.php文件2.$_200,$403 定义两个参数,以及参数值.3.接着是两个判断语句,判断访问页面的方法是否为post方法和有没有参数flag.4.再接着两个foreach函数遍历数组函数,这里就是把我们用get方法传输的数据当做数组进行遍历,并将遍历

变量覆盖漏洞学习及在webshell中的运用

一.发生条件: 函数使用不当($$.extract().parse_str().import_request_variables()等) 开启全局变量 二.基础了解: 1.$$定义 $$代表可变变量,就是说,一个变量的变量名可以动态的设置和使用. 举个简单例子: 变量a被定义成了字符串hello 而变量$a被定于成了字符串world! 但同时$a本身也是个变量 $$a就可以代表两个含义$($a)和$(hello) 两个变量 此时输出的结果如图: 2.extract()定义 extract()可以