php 变量覆盖 ctf,CTF中的变量覆盖问题

0x00 前言

最近在干代码审计,于是就把之前学习的CTF题目中有关变量覆盖的题目结合下进一步研究。

通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞。经常导致变量覆盖漏洞场景有:$$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册等。

本篇收集了几个CTF中的题目作为例子,对$$,extract(),parse_str()的问题进行总结。

0x01 $$导致的变量覆盖问题

$$ 导致的变量覆盖问题在CTF代码审计题目中经常在foreach中出现,如以下的示例代码,使用foreach来遍历数组中的值,然后再将获取到的数组键名作为变量,数组中的键值作为变量的值。因此就产生了变量覆盖漏洞。请求?name=test 会将$name的值覆盖,变为test。

1 <?php2 //?name=test3

4 //output:string(4) “name” string(4) “test” string(4) “test” test

5

6 $name="thinking";7 foreach ($_GET as $key => $value)8 {9 $$key = $value;10 }11 var_dump($key);12 var_dump($value);13 var_dump($$key);14 echo "".$name;15 ?>

可见$name的值被覆盖掉了

CTF中$$导致的变量覆盖问题的例题1:

题目源码:

1 <?php2 include "flag.php";3 $_403 ="Access Denied";4 $_200 ="Welcome Admin";5 if ($_SERVER["REQUEST_METHOD"] !="POST")6 {7 die("BugsBunnyCTF is here :p…");8 }9 if ( !isset($_POST["flag"]) )10 {11 die($_403);12 }13 foreach ($_GET as $key => $value)14 {15 $$key = $$value;16 }17 foreach ($_POST as $key => $value)18 {19 $$key = $value;20 }21 if ( $_POST["flag"] !== $flag)22 {23 die($_403);24 }25 echo "This is your flag : ". $flag ."\n";26 die($_200);27 ?>

题目分析:

源码包含了flag.php文件,并且需要满足3个if里的条件才能获取flag,题目中使用了两个foreach并且也使用了$$.两个foreach中对 $$key的处理是不一样的,满足条件后会将$flag里面的值打印出来,所以$flag是在flag.php文件文件中的。

但是由于第7,11-14行间的代码会将flag的值给覆盖掉了,所以需要先将flag的值给覆盖掉了,所以需要先将flag的值赋给200或200或_403变量,然后利用die(200)或die(200)或die(_403)将flag打印出来。

解题方法:

由于第7,11-14行间的代码会将$flag的值给覆盖掉,所以只能利用第一个foreach先将$flag的值赋给$_200,然后利用die($_200)将原本的flag值打印出来。

最终PAYLOAD:

本地复现,所以flag与原题不一样

GET DATA:?_200=flag

POST DATA:flag=aaaaaaaaaaaaaaaaaaaaa

20200529094958580648.png

0×02 extract()函数导致的变量覆盖问题

extract() 该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。

extract()的用法参考:http://www.runoob.com/php/func-array-extract.html

语法: extract(array,extract_rules,prefix)

CTF中extract()导致的变量覆盖问题的例题1:

题目源码:

1 <?php2 $flag =‘xxx’;3 extract($_GET);4 if (isset($gift))5 {6 $content = trim(file_get_contents($flag));7 if ($gift == $content)8 {9 echo‘hctf{…}’;10 }11 else

12 {13 echo ‘Oh..’;14 }15 }16 ?>

题目分析:

题目使用了extract($_GET)接收了GET请求中的数据,并将键名和键值转换为变量名和变量的值,然后再进行两个if 的条件判断,所以可以使用GET提交参数和值,利用extract()对变量进行覆盖,从而满足各个条件。

解题方法:

GET请求 ?flag=&gift=,extract()会将flag和flag和gift的值覆盖了,将变量的值设置为空或者不存在的文件就满足gift==gift==content。

最终PAYLOAD:

GET DATA: ?flag=&gift=

CTF中extract()导致的变量覆盖问题的例题2:

题目源码:

1 <?php2 if ($_SERVER["REQUEST_METHOD"] ==“POST”)3 {4 extract($_POST);5

6 if ($pass == $thepassword_123)7 {8

9 <?php echo $theflag; ?>

10

11 }12 }13 ?>

题目分析:

题目要求使用POST提交数据,extract($_POST)会将POST的数据中的键名和键值转换为相应的变量名和变量值,利用这个覆盖$pass和$thepassword_123变量的值,从而满足pass==pass==thepassword_123这个条件。

解题方法:

使用POST请求提交pass=&thepassword_123=, 然后extract()会将接收到的数据将$pass和$thepassword_123变量的值覆盖为空,便满足条件了。

最终PAYLOAD:

POST DATA:pass=&thepassword_123=

0×03 parse_str函数导致的变量覆盖问题

parse_str() 函数用于把查询字符串解析到变量中,如果没有array 参数,则由该函数设置的变量将覆盖已存在的同名变量。

语法:parse_str(string,array)

20200529094959214462.png

parse_str() 用法参考:http://php.net/parse_str

CTF中parse_str()导致的变量覆盖问题的例题1:

题目源码:

1 <?php2 error_reporting(0);3 if (empty($_GET[‘id‘]))4 {5 show_source(__FILE__);6 die();7 }8 else

9 {10 include (‘flag.php‘);11 $a = "www.OPENCTF.com";12 $id = $_GET[‘id‘];13 @parse_str($id);14 if ($a[0] != "QNKCDZO" && md5($a[0]) == md5("QNKCDZO"))15 {16 echo $flag;17 }18 else

19 {20 exit("其实很简单其实并不难!");21 }22 }23 ?>

题目分析:

首先要求使用GET提交id参数,然后parse_str($id)对id参数的数据进行处理,再使用判断a[0] != ‘QNKCDZO’ && md5(a[0] != ‘QNKCDZO’ && md5(a[0]) == md5(‘QNKCDZO’)的结果是否为真,为真就返回flag,md5(‘QNKCDZO’)的结果是0e830400451993494058024219903391由于此次要满足a[0] != ‘QNKCDZO’ && md5(a[0] != ‘QNKCDZO’ && md5(a[0]) == md5(‘QNKCDZO’)所以要利用php弱语言特性,0e123会被当做科学计数法,0 * 10 x 123。所以需要找到一个字符串md5后的结果是0e开头后面都是数字的,如,240610708,s878926199a

PHP处理0e开头md5哈希字符串缺陷/bug 参考:http://www.cnblogs.com/Primzahl/p/6018158.html

解题方法:

使用GET请求id=a[0]=240610708,这样会将a[0]的值覆盖为240610708,然后经过md5后得到0e462097431906509019562988736854与md5(‘QNKCDZO’)的结果0e830400451993494058024219903391比较都是0 所以相等,满足条件,得打flag。

最终PAYLOAD:

GET DATA:

?id=a[0]=s878926199a

or

?id=a[0]=240610708

0×04 小总结

变量覆盖漏洞在PHP代码审计中会以比较隐晦的方式存在,所以需要更加仔细的阅读源码找出漏洞的点,在CTF里面经常是以比较直接方式展示,所以可以先通过学习CTF各种变量覆盖的题目,然后掌握后再去审计cms,这样可以更加通透的理解掌握和挖掘变量覆盖漏洞。

原文:https://www.cnblogs.com/zzjdbk/p/12985530.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值