PHP代码审计:变量覆盖漏洞

本文深入探讨了变量覆盖漏洞,详细讲解了extract(), parse_str(), 和import_request_variables()函数的使用不当如何导致变量覆盖,以及如何防范此类漏洞。
原文链接: https://www.shiyanlou.com/courses/895

当你的才华

还撑不起你的野心时

那你就应该静下心来学习


 

       代码审计学习线上实验,都是CE一边实操,一边整理的笔记,方便以后翻看时,可快速查阅。

目录

变量覆盖漏洞

一、简介

• extract()函数

• parse_strc()函数

• import_request_variables()函数

二、漏洞利用

三、漏洞防范

 extract()函数防御

parse_str()函数防御

import_request_variables()函数防御


变量覆盖漏洞

       变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击

一、简介

变量覆盖漏洞大多数由函数使用不当导致,经常引发变量覆盖漏洞的函数有:extract(), parse_str()和import_request_variables()【php5.4后取消】

通常来说,单独的变量覆盖漏洞很难有利用价值,需要和其他漏洞结合起来才能完成攻击

 

• extract()函数

先看看extract()函数说明:


 
  1. extract( array,extract_rules,prefix)
  2. 函数从数组中将变量导入到当前的符号表,即将数组中的键值对注册成函数,使用数组键名作为变量名,使用数组键值作为变量值

该函数的变量覆盖隐患就出在第二个参数上面:

  • 当第二个参数为空或者EXTR_OVERWRITE时,变量注册如果遇到冲突会直接覆盖掉原变量。

  • 当第二个变量为EXTR_IF_EXISTS时,仅当原变量已存在是对其进行更新,否则不注册新变量。

  • 当第二个变量为空,只传入第一个参数时,仅当原变量已存在是对其进行更新,否则不注册新变量。

extract.php 代码如下:


 
  1. <?php
  2. header( "Content-Type: text/html; charset=utf-8");
  3. $a = 1;
  4. print_r( "extract()执行之前:\$a = ".$a. "<br />");
  5. $b = array( 'a'=> '2');
  6. extract($b);
  7. print_r( "extract()执行之后:\$a = ".$a. "<br />");
  8. ?>

打开浏览器输入:http://192.168.161.133/VariCover/extract.php

可以看到extract()函数执行之后,将变量$a的值覆盖

 

• parse_strc()函数

说明:


 
  1. parse_str(string, array)
  2. 函数把查询字符串解析并注册为变量,主要用于页面之间传值(参数)

该函数在注册变量之前不会验证当前变量是否已存在,如果存在会直接覆盖。

parse_str.php


 
  1. <?php
  2. $a = 1;
  3. print_r( "parse_str()执行之前:\$a = ".$a. "<br />");
  4. parse_str( "a=2");
  5. print_r( "parsr_str()执行之后:\$a = ".$a. "<br />");
  6. ?>

打开浏览器,输入url:http://192.168.161.133/VariCover/extract.php

 

• import_request_variables()函数

说明:


 
  1. import_request_variables ( string $types , string $prefix )
  2. 将 GET/POST/Cookie 变量导入到全局作用域中, types 参数指定需要导入的变量, G代表GET,P代表POST,C代表
  3. COOKIE

import_request_variables.php


 
  1. <?php
  2. $a = 1; //原变量值为1
  3. import_request_variables( 'GP'); //传入参数是注册变量
  4. print_r($a); //输出结果会变成传入参数
  5. ?>

    值得注意的是:import_request_variables()函数函数只能用在 PHP4.1 ~ PHP5.4之间,额外以上三种函数,使用时请格外注意,否则非常容易出现变量覆盖漏洞。

 

二、漏洞利用

       我们应该已经理解了变量覆盖是怎么发生的,但是否还在疑惑这种漏洞是如何利用的?又会造成怎样的危害呢? 正如之前所说,单独的变量覆盖漏洞不易实现完整的攻击,但是这种漏洞的利用上限非常高,配合上其他漏洞,会有意想不到的效果。 比如,齐博CMS变量覆盖导致sql注入漏洞、metinfo变量覆盖漏洞导致任意文件包含,有兴趣的同学可以自行百度了解详情,这里就点到为止

 

三、漏洞防范

 extract()函数防御

将extract.php中extract()函数第二个参数修改为extr_skip:


 
  1. <?php
  2. header( "Content-Type: text/html; charset=utf-8");
  3. $a = 1;
  4. print_r( "extract()执行之前:\$a = ".$a. "<br />");
  5. $b = array( 'a'=> '2');
  6. extract($b,extr_skip);
  7. print_r( "extract()执行之后:\$a = ".$a. "<br />");
  8. ?>

再加载该页面,可以看到变量没有再被覆盖

 

parse_str()函数防御

parse_str()函数的防范,只能我们自己添加判断语句,比如:


 
  1. <?php
  2. header( "Content-Type: text/html; charset=utf-8");
  3. $a = 1;
  4. print_r( "parse_str()执行之前:\$a = ".$a. "<br />");
  5. if(! isset($a)){
  6. parse_str( "a=2");
  7. }
  8. print_r( "parsr_str()执行之后:\$a = ".$a. "<br />");
  9. ?>

再加载该页面,可以看到变量不再会被覆盖

 

import_request_variables()函数防御

       此函数是非常危险的函数,在PHP5.5之后已被官方删除!假如你任然在使用低版本的PHP环境,也建议你避免使用此函数.

=========================================================================

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值