Bugkuctf题库中的一道代码审计题,通过巧妙利用file_get_contents函数特性来绕过extract变量覆盖

源代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16<?php

$flag='../readme.txt';

extract($_GET);

if(isset($shiyan)){

@$content=trim(file_get_contents($flag));

if($shiyan == $content){

echo 'flag{xxx}';

}

else{

echo 'oh,no';

}

}

?>

首先先弄明白几个函数:

extract:该函数将数组的键名作为变量名,键名对应的键值作为对应的变量值,返回值为设置成功的变量个数

也就是说这里的extract($_GET)将我们GET的参数名作为变量名,参数值作为变量值

例子如下:

1

2

3

4

5

6

7

8

9

10

11

12<?php

if(isset($_GET['shiyan']) $$ isset($_GET['flag'])){

$a=extract($_GET);

echo '$a:'.$a;

echo '
';

echo '$shiyan:'.$shiyan;

echo '
';

echo '$flag:'.$flag;

}

?>

输出结果:

成功设置了两个变量,$shiyan和$flag,所以$a=2

file_get_contents:将文件内容作为字符串输出

例子如下:

1

2

3

4

5

6

7<?php

$flag='../readme.txt';

$content=file_get_contents($flag);

echo $content;

?>

输出结果

这里注意file_get_contents函数里的参数是$flag,也就是说我们GET进来的参数flag值会将之前的flag值覆盖掉,从而造成变量覆盖,而我们输入的flag值如果不为文件名,函数执行错误,$content会被赋值为空

例子如下:

1

2

3

4

5

6

7

8

9

10<?php

$flag='../readme.txt';

if(isset($_GET['flag'])){

extract($_GET);

@$content=file_get_contents($flag);

echo $content.'1';

}

?>

输出结果:

要得到最终要的flag,就必须要让变量content值等于变量shiyan的值

所以我们可以让shiyan值也为空,这样flag值任意输入,只要不为文件名,就一定相等

另外,即使shiyan值为空,isset($shiyan)也是返回true的

1

2

3

4

5

6

7

8<?php

$shiyan="";

if(isset($shiyan)){

echo "11";

}

?>

输出结果:

php extract 变量覆盖,extract变量覆盖相关推荐

  1. 浅显易懂 Makefile 入门 (02)— 普通变量和自动变量定义、使用($@、$^、$< 作用)、变量覆盖 override、变量的来源 origin

    1. 变量的定义 Makefile 文件中定义变量的基本语法如下: 变量的名称=值列表 变量的名称可以由大小写字母.阿拉伯数字和下划线构成.等号左右的空白符没有明确的要求,因为在执行 make 的时候 ...

  2. Java基础:成员变量的继承与覆盖

    1.前言 最近在研究Java多态时,发现子类通过继承父类来实现Java中的多态.子类可以继承父类的成员方法和成员变量.子类中如果有同名的成员方法,并且方法的参数和返回值一样,那么这个子类定义的这个方法 ...

  3. linux超级基础系列——shell变量(本地变量和环境变量)

    linux超级基础系列--shell变量(本地变量和环境变量) 2006-12-04 00:39 为使shell编程更有效,系统提供了一些shell变量.shell变量可以保存诸如路径名.文件名或者一 ...

  4. volatile变量与普通变量的区别

    我们通常会用volatile实现一些需要线程安全的代码(也有很多人不敢用,因为不了解),但事实上volatile本身并不是线程安全的,相对于synchoronized,它有更多的使用局限性,只能限制在 ...

  5. js变量作用域和变量提升

    在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 "一个变量的作用域表示这个变 ...

  6. 编译器在处理const变量跟一般变量时的区别

    const变量,也就是常量,当某个变量加上const属性的时候,表明这个变量不可修改. const变量是不可写的,那么我们对于const变量的处理只剩下读操作了. 当我们读一般的变量的时候,会先获取该 ...

  7. C++基础学习(02)--(数据类型,变量类型,变量作用域,常量,修饰符类型)

    文章目录 目录 一. 数据类型 C++ 中的数据类型 typedef enumeration枚举类型 c++中变量类型 二.变量作用域 三.常量 四.修饰符类型 目录 一. 数据类型 C++ 中的数据 ...

  8. php变量教学,PHP变量详解

    什么是变量 变量指的就是在程序执行过程中数值可以变化的量,它与我们所讲的常量是相反的,我们常量是只要被定义了,在程序中就不能被改变.而变量是可以变的. 变量作用 变量就是用来保存我们值,相当于一个存储 ...

  9. java 局部变量空间 大小_变量作用域-1:局部变量 和成员变量、各种变量内存分配的大小...

    注: ① 在同一个方法里面定义两次相同的变量,编译会报错 ②在同一个Java文件里面定义两次相同的类,编译会报错 java中的成员变量和全局变量有什么区别? 注:java中就没有全局变量这个概念,只分 ...

最新文章

  1. HomeKit推出已两年 但是苹果在智能家居上却被对手甩开了差距
  2. WiFiDemon – iOS WiFi RCE 0-Day漏洞利用
  3. 如何用SendMessage模拟某一按钮的点击事件
  4. POJ 3237 树链剖分学习(树链剖分小结)
  5. 自制Unity小游戏TankHero-2D(3)开始玩起来
  6. 浅谈:python自动化测试中使用异步
  7. 代理服务器-贪心算法
  8. 如何录制电脑内部声音
  9. IntelliJ IDEA 破解 到2100年到期
  10. 武汉理工计算机网络教学平台,武汉理工大学 操作系统
  11. 720度全景图有什么优势?
  12. javaWeb--MVC
  13. WalletContract区块钱包链接到web3js
  14. 防火墙技术之----包过滤(Packet Filter)
  15. 算法作业1:遍历与枚举
  16. 视频号无人直播怎么弄?微信视频号无人直播教程【无需软件】
  17. Unity3D-限制3D物体的旋转角度
  18. PermissionX 1.6发布,支持Android 12,可能是今年最大的版本升级
  19. 北大青鸟java项目实践_s2 北大青鸟Java S2 八个上机考试项目 Develop 249万源代码下载- www.pudn.com...
  20. 华中数控 Hnc 数据采集实战

热门文章

  1. Struts ActionForm简单理解
  2. Linux流量监控工具 (实时)-适用于centos 当然也兼容RHEL
  3. TurboMail邮件服务器荣膺“2012年度中国行业信息化最佳产品奖”
  4. MS CRM 2011中,对于多实体数据文件的导入
  5. 中学校园网建设实践与思考
  6. 微型计算机地未来发展,微型计算机的发展历史、现状和未来(最新) PDF.doc
  7. 你必须懂也可以懂的微服务系列三:服务调用
  8. linux ssh客戶端:termius介绍及安装
  9. vscode配置浏览器
  10. docker+jenkins+maven+svn