PHP-代码审计-变量覆盖
当你的才华
还撑不起你的野心时
那你就应该静下心来学习
代码审计学习线上实验,都是CE一边实操,一边整理的笔记,方便以后翻看时,可快速查阅。
目录
变量覆盖漏洞
一、简介
• extract()函数
• parse_strc()函数
• import_request_variables()函数
二、漏洞利用
三、漏洞防范
extract()函数防御
parse_str()函数防御
import_request_variables()函数防御
变量覆盖漏洞
变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击
一、简介
变量覆盖漏洞大多数由函数使用不当导致,经常引发变量覆盖漏洞的函数有:extract(), parse_str()和import_request_variables()
通常来说,单独的变量覆盖漏洞很难有利用价值,需要和其他漏洞结合起来才能完成攻击
• extract()函数
先看看extract()函数说明:
- extract(array,extract_rules,prefix)
- 函数从数组中将变量导入到当前的符号表,即将数组中的键值对注册成函数,使用数组键名作为变量名,使用数组键值作为变量值
该函数的变量覆盖隐患就出在第二个参数上面:
当第二个参数为空或者EXTR_OVERWRITE时,变量注册如果遇到冲突会直接覆盖掉原变量。
当第二个变量为EXTR_IF_EXISTS时,仅当原变量已存在是对其进行更新,否则不注册新变量。
extract.php 代码如下:
- <?php
- header("Content-Type: text/html; charset=utf-8");
- $a = 1;
- print_r("extract()执行之前:\$a = ".$a."<br />");
- $b = array('a'=>'2');
- extract($b);
- print_r("extract()执行之后:\$a = ".$a."<br />");
- ?>
打开浏览器输入:http://192.168.161.133/VariCover/extract.php
可以看到extract()函数执行之后,将变量$a的值覆盖
• parse_strc()函数
说明:
- parse_str(string,array)
- 函数把查询字符串解析并注册为变量,主要用于页面之间传值(参数)
该函数在注册变量之前不会验证当前变量是否已存在,如果存在会直接覆盖。
parse_str.php
- <?php
- $a = 1;
- print_r("parse_str()执行之前:\$a = ".$a."<br />");
- parse_str("a=2");
- print_r("parsr_str()执行之后:\$a = ".$a."<br />");
- ?>
打开浏览器,输入url:http://192.168.161.133/VariCover/extract.php
• import_request_variables()函数
说明:
- import_request_variables ( string $types , string $prefix )
- 将 GET/POST/Cookie 变量导入到全局作用域中, types 参数指定需要导入的变量, G代表GET,P代表POST,C代表
- COOKIE
import_request_variables.php
- <?php
- $a = 1;//原变量值为1
- import_request_variables('GP'); //传入参数是注册变量
- print_r($a); //输出结果会变成传入参数
- ?>
值得注意的是:import_request_variables()函数函数只能用在 PHP4.1 ~ PHP5.4之间,额外以上三种函数,使用时请格外注意,否则非常容易出现变量覆盖漏洞。
二、漏洞利用
我们应该已经理解了变量覆盖是怎么发生的,但是否还在疑惑这种漏洞是如何利用的?又会造成怎样的危害呢? 正如之前所说,单独的变量覆盖漏洞不易实现完整的攻击,但是这种漏洞的利用上限非常高,配合上其他漏洞,会有意想不到的效果。 比如,齐博CMS变量覆盖导致sql注入漏洞、metinfo变量覆盖漏洞导致任意文件包含,有兴趣的同学可以自行百度了解详情,这里就点到为止
三、漏洞防范
extract()函数防御
将extract.php中extract()函数第二个参数修改为extr_skip:
- <?php
- header("Content-Type: text/html; charset=utf-8");
- $a = 1;
- print_r("extract()执行之前:\$a = ".$a."<br />");
- $b = array('a'=>'2');
- extract($b,extr_skip);
- print_r("extract()执行之后:\$a = ".$a."<br />");
- ?>
再加载该页面,可以看到变量没有再被覆盖
parse_str()函数防御
parse_str()函数的防范,只能我们自己添加判断语句,比如:
- <?php
- header("Content-Type: text/html; charset=utf-8");
- $a = 1;
- print_r("parse_str()执行之前:\$a = ".$a."<br />");
- if(!isset($a)){
- parse_str("a=2");
- }
- print_r("parsr_str()执行之后:\$a = ".$a."<br />");
- ?>
再加载该页面,可以看到变量不再会被覆盖
import_request_variables()函数防御
此函数是非常危险的函数,在PHP5.5之后已被官方删除!假如你任然在使用低版本的PHP环境,也建议你避免使用此函数.
我不需要自由,只想背着她的梦
一步步向前走,她给的永远不重
PHP-代码审计-变量覆盖相关推荐
- 一、WillPHPv2代码审计-[变量覆盖]-[文件包含]-[任意文件读取漏洞]-[pearcmd裸文件包含]
时间戳--2021.12.12 0x01 [HXBCTF 2021]easywill_WriteUp: 一.PHPSTORM框架调试 第一步:登录buuctf,打开[HXBCTF 2021]easyw ...
- PHP代码审计笔记--变量覆盖漏洞
变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击. 经常导致变量覆盖漏洞场景有:$$,extract()函数,parse_str()函数, ...
- php extract 变量覆盖,extract变量覆盖
Bugkuctf题库中的一道代码审计题,通过巧妙利用file_get_contents函数特性来绕过extract变量覆盖 源代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...
- CTF——PHP审计——变量覆盖
一,变量覆盖漏洞 参考:https://www.cnblogs.com/xiaozi/p/7768580.html 通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞.经常导致变量覆盖漏洞 ...
- 变量覆盖 --- zkaq
1.概念 1.变量覆盖:变量覆盖指的是可以用我们的传参值替换程序原有的变量值 2.常见的变量覆盖的危险函数 extract()函数:将数组中变成变量 举例:<?php $a = "1& ...
- 浅显易懂 Makefile 入门 (02)— 普通变量和自动变量定义、使用($@、$^、$< 作用)、变量覆盖 override、变量的来源 origin
1. 变量的定义 Makefile 文件中定义变量的基本语法如下: 变量的名称=值列表 变量的名称可以由大小写字母.阿拉伯数字和下划线构成.等号左右的空白符没有明确的要求,因为在执行 make 的时候 ...
- filter执行先后问题_Thinkphp5框架变量覆盖导致远程代码执行
Thinkphp5.0.x框架对输入数据过滤不严,导致Request类成员存在变量覆盖问题,在一定情况下能导致远程代码执行漏洞. 介绍 Thinkphp框架官方提供核心版和完整版两种: 核心版因默认缺 ...
- php之变量覆盖漏洞讲解,PHP中的变量覆盖漏洞代码深入解析
2.CTF中extract()导致的变量覆盖 我们大致分析是要求我们GET传参进去值会经过extract()函数下来会有两个if 第一个if判断 ceshi这个变量是否存在 存在则继续执行if里面的 ...
- csrf漏洞防御方案_变量覆盖漏洞利用及防御方案
一.漏洞简介 变量覆盖漏洞是指攻击者使用自定义的变量去覆盖源代码中的变量,从而改变代码逻辑,实现攻击目的的一种漏洞.通常来说,单独的变量覆盖漏洞很难有利用价值,但是在与其他应用代码或漏洞结合后,其造成 ...
最新文章
- mysql 5.6 与5.7 区别_mysql5.6和5.7的区别
- 配置Apache2.2+PHP5+CakePHP1.2+MySQL5
- 密码学基础知识(九)密钥管理
- linux 操作系统安装配置vnc
- 上帝的玩偶:haXe语言
- pvrect r语言 聚类_R语言常用统计方法包+机器学习包(名称、简介)
- java pdf无法加载_java - 试图使用iText7合并来合并pdf,但是当我打开最终的合并pdf时,它说无法加载pdf文档 - SO中文参考 - www.soinside.com...
- 做海外市场,如何在Facebook20多亿用户中分一杯羹?
- 微信群发机器人源代码
- 【BLE MIDI】MIDI 文件格式分析 ( MIDI 文件头解析 | MIDI 文件头标识 | MIDI 文件头长度 | MIDI 文件格式 | MIDI 轨道个数 | 基本时间 )
- ASP.NET Core WebApi返回结果统一包装实践
- flv网页播放器开源代码
- Latex algorithm Input Output
- 【NLP】千呼万唤始出来——GPT-3终于开源!
- 「九省联考 2018」制胡窜 (SAM)(线段树合并)(分类讨论)
- jQuery学习基础理论(二)
- Linux下Chelsio T5调试方法
- 看完阿里的食堂,我想辞职了!
- 软件测试题目某市电话,软件测试题
- 从王者荣耀看设计模式(虚拟代理模式)
热门文章
- 零基础学Python-爬虫-2、scrapy框架(测试案例篇·技术点在后面文章内讲解)【测试将一篇小说的所有访问路径与标题存储到一个文件下】
- Windows下的定时任务
- CONFIGURE CONTROLFILE AUTOBACKUP ON/OFF;
- Linux Shell 通配符、元字符、转义符使用实例介绍
- CentOS7,linux下nginx的安装过程——1.安装pcre与nginx——源码
- appium---【Mac】appium-doctor提示WARN:“fbsimctl cannot be found”解决方案
- dig指定服务器查询域名解析时间
- python类class基础
- (转)生产者/消费者问题的多种Java实现方式 (待整理)
- int string java 呼转