1.变量覆盖:

①:针对extract函数的变量覆盖漏洞:

 <?php
@error_reporting(E_ALL^E_NOTICE);
require('config.php'); if($_GET['show_source'] === '1') {
highlight_file(__FILE__);
exit;
} $user = null; // connect to database if(!empty($_POST['data'])) {
try {
$data = json_decode($_POST['data'], true);
} catch (Exception $e) {
$data = [];
}
extract($data);
if($users[$username] && strcmp($users[$username], $password) == 0) {
$user = $username;
}
}
  <?php if($user == 'admin') printf("<code>%s</code>", htmlentities($flag)); ?>

当$user=“admin”时,输出flag

向上看,$user =$username

则需要使$username="admin"

if成立的条件是$users[$username]不为空并且需要满足$users[$username]=$password

我们在不知道$password的情况下需要使$users[$username]=$password成立。

再向上看extract()函数,此函数为变量注册函数,将数组中的数据以键名为变量名,键值为变量值的形式注册变量。

那在这就存在变量覆盖问题,我们可以传入任意构造$password的值覆盖原有的$password的值。

即构造data={"username":"admin","password":"123","users":{"admin":"123"}}即可得到flag

②:基于parse_str()函数的变量覆盖漏洞

 <meta charset="utf-8">
error_reporting(0);
if (empty($_GET['b'])) {
show_source(__FILE__);
die();
}else{
include('flag.php');
$a = "www.XMAN.com";
$b = $_GET['b'];
@parse_str($b);
if ($a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')) {
echo $flag;
}else{
exit('你的答案不对0.0');
}
}

输出flag的条件为$a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')

parse_str — 将字符串解析成多个变量,如果参数str是URL传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域。

由于此函数的作用可以将$a[0]的值覆盖,则在需要找一对md5碰撞即可。

即传b=a[0]=s155964671a即可得到flag。

③:基于register_globals的变量覆盖漏洞:

 <?php
echo "Register_globals: ".(int)ini_get("register_globals")."<br/>"; if ($auth){
echo "private!";
}
?>

当register_globals=OFF时,这段代码不会出问题。
但是当register_globals=ON时,提交请求URL:http://www.a.com/test.php?auth=1,变量$auth将自动得到赋值。得到的结果为
Register_globals:1

小记:如果上面的代码中,已经对变量$auth赋了初始值,比如$auth=0,那么即使在URL中有/test.PHP?auth=1,也不会将变量覆盖,也就是说不会打印出private!

通过$GLOBALS获取的变量,也可能导致变量覆盖。

 <?php
echo "Register_globals:".(int)ini_get("register_globals")."<br/>";
if (ini_get('register_globals')) foreach($_REQUEST as $k=>$v) unset(${$k});
print $a;
print $_GET[b];
?>

变量$a未初始化,在register_globals=ON时,再尝试控制“$a”的值(http://www.a.com/test1.php?a=1&b=2),会因为这段代码而出错(因为$a没有值)。
而当尝试注入“GLOBALS[a]”以覆盖全局变量时(http://www.a.com/test1.php?GLOBALS[a]=1&b=2),则可以成功控制变量“$a”的值。这是因为unset()默认只会销毁局部变量,要销毁全局变量必须使用$GLOBALS。
而在register_globals=OFF时,则无法覆盖到全局变量。
小记:register_globals的意思是注册为全局变量,所以当On的时候,传递过来的值会被直接注册为全局变量而直接使用,当为OFF的时候,就需要到特定的数组中去得到它。unset用于释放给定的变量

④:遍历初始化变量

 <?
$chs = '';
if($_POST && $charset != 'utf-8'){
$chs = new Chinese('UTF-8', $charset);
foreach($_POST as $key => $value){
$$key = $chs->Convert($value);
}
unset($chs);
}
?>

由于php中可以使用$$声明变量,因此当在遍历数组时可能会覆盖原来的值。

若提交参数chs,则可覆盖变量"$chs"的值。

小记:在代码审计时需要注意类似“$$k”的变量赋值方式有可能覆盖已有的变量,从而导致一些不可控制的结果

⑤:import_request_variables变量覆盖

 <?php
$auth = '0';
import_request_variables('G'); if($auth == 1){
echo "private!";
}else{
echo "public!";
}
?>

当用户输入http://www.a.com/test1.php?auth=1时,网页上会输出private!

import_request_variables('G')指定导入GET请求中的变量,从而导致变量覆盖。

小记:import_request_variables — 将 GET/POST/Cookie 变量导入到全局作用域中。如果你禁止了 register_globals,但又想用到一些全局变量,那么此函数就很有用。

ctf变量覆盖漏洞:的更多相关文章

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

    0×00 背景 近期在研究学习变量覆盖漏洞的问题,于是就把之前学习的和近期看到的CTF题目中有关变量覆盖的题目结合下进一步研究. 通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞.经常导 ...

  2. CTF——代码审计之变量覆盖漏洞writeup【2】

    题目: 基础: 所需基础知识见变量覆盖漏洞[1]  分析: 现在的$a=’hi’,而下面的函数需满足$a=’jaivy’才可以输出flag,那么需要做的事就是想办法覆盖掉$a原来的值. 那么出现的提示 ...

  3. Web安全之变量覆盖漏洞

    通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞.经常导致变量覆盖漏洞场景有:$$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_reques ...

  4. PHP代码审计笔记--变量覆盖漏洞

    变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击. 经常导致变量覆盖漏洞场景有:$$,extract()函数,parse_str()函数, ...

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

    一.发生条件: 函数使用不当($$.extract().parse_str().import_request_variables()等) 开启全局变量 二.基础了解: 1.$$定义 $$代表可变变量, ...

  6. php之变量覆盖漏洞讲解

    1.变量没有初始化的问题(1): wooyun连接1:[link href="WooYun: PHPCMS V9 member表内容随意修改漏洞"]tenzy[/link] $up ...

  7. 代码审计-MetInfo CMS变量覆盖漏洞

    0x01 代码分析 安装好后是这样的 漏洞文件地址\include\common.inc.php 首先是在这个文件发现存在变量覆盖的漏洞 foreach(array('_COOKIE', '_POST ...

  8. 2020/2/1 PHP代码审计之变量覆盖漏洞

    0x00 变量覆盖简介 变量覆盖是指变量未被初始化,我们自定义的参数值可以替换程序原有的变量值. 0x01 漏洞危害 通常结合程序的其他漏洞实现完整的攻击,比如文件上传页面,覆盖掉原来白名单的列表,导 ...

  9. PHP变量覆盖漏洞小结

    前言 变量覆盖漏洞是需要我们需要值得注意的一个漏洞,下面就对变量覆盖漏洞进行一个小总结. 变量覆盖概述 变量覆盖指的是可以用我们自定义的参数值替换程序原有的变量值,通常需要结合程序的其他功能来实现完整 ...

随机推荐

  1. java输出日志

    protected final Logger logger = Logger.getLogger(User.class); logger.info("在控制台中打印的内容");

  2. ls-grep-find组合命令解决企业问题实战

    ls -l|grep “^d”  以d开头 ls -lF  给不同文件类型加不同标志 ls -lF|grep  “/$” 以/结尾 ls -lF|grep  / find ./ -type d fin ...

  3. mycat操作MySQL第一篇:全局表

    1.安装mycat,点击bin下面startup_nowrap.bat启动 2.客户端连接mycat:server.xml里面的 <!--连接mycat用户名和密码.数据库--> < ...

  4. JVM垃圾收集器&对象的引用回收

    1.介绍垃圾收集器 垃圾收集器(Garbage Collection,GC)就是用于回收方法区和堆区,其他程序计数器.虚拟机栈.本地方法栈这3个区域都是随线程而生,随线程而灭,栈中的栈帧会随着方法的进 ...

  5. 开发IOS应用真的一定要买苹果电脑设备吗?

    不要忘记目的 如果你想开发ios或者苹果的app,网上很多网友都会建议你买一个苹果硬件--苹果电脑,一部分建议你安装黑苹果.这两种方案中前一种费用很高,后一种费时费力(甚至到最后都要转向购买apple ...

  6. TCP/IP NAT知识梳理

    一. IP地址的获取 首先,互联网上的每台主机都有一个唯一的IP地址标识,计算机在通信时需要向网络中的DHCP(动态主机配置协议)服务器申请一个IP地址,但开始主机并不知道哪台机器是DHCP服务器(不 ...

  7. 谁能用通俗的语言解释一下什么是 RPC 框架?

    转载自知乎:https://www.zhihu.com/question/25536695 知乎上很多问题的答案还是很好的,R大就经常在上面回答问题 关于RPC你的题目是RPC框架,首先了解什么叫RP ...

  8. python基础整理----基本概念和知识

    整理一下python的基本概念和知识, 主要用python3为语法标准. python介绍 一种面向对象的解释性计算机设计语言,具有丰富和强大的库. python定位:"优雅".& ...

  9. spring cloud 专题一 (spring cloud 入门搭建 之 Eureka注册中心搭建)

    一.前言 本文为spring cloud 微服务框架专题的第一篇,主要讲解如何快速搭建spring cloud微服务及Eureka 注册中心 以及常用开发方式等. 本文理论不多,主要是傻瓜式的环境搭建 ...

  10. 初始化angularJS之ng-app的自动绑定和手动绑定

    在传统的angularJS应用中,都是通过ng-app把angular应用绑定到某个dom上,这样做会把js代码入侵到html上,angular提供了手动启动的API--angular.bootstr ...