html 怎么让tr的css覆盖td的_通达OA上传漏洞之变量覆盖分析

46a4e619172e3b9c0daffa302956df9e.png542b00ab0942b22bd51eba817a5ea29e.png

作者:kw0ng

开始

通达OA上传到包含漏洞分析的文章已经有很多,本文重点分析,文件上传处决定路径信息是否回显的UPLOAD_MODE参数是怎么传递的。

代码分析

触发文件上传点位于/ispirit/im/upload.php中,服务端在接收文件信息的同时还需要几个参数,如不了解 multipart/form-data类型如何传递参数的可以先去学习下,通达OA的PHP代码采用了Zend54加密,但是我使用两个不同的工具解密却得到了不一致的代码,这也导致了这篇文章差点难产。首先是第一段代码:

$P = $_POST['P'];if (isset($P) || $P != '') {    ob_start();    include_once 'inc/session.php'; //如果P不为空    session_id($P);    session_start();    session_write_close();} else {    include_once './auth.php';}

这段代码需要一个POST传参获取P值,且为空时将会包含auth.php进行重认证,因为我们的POST包需要一个P值且不为空。

$DEST_UID = $_POST['DEST_UID']; $dataBack = array();if ($DEST_UID != '' && !td_verify_ids($ids)) {     $dataBack = array('status' => 0, 'content' => '-ERR ' . _('接收方ID无效'));    echo json_encode(data2utf8($dataBack));    exit;}if (strpos($DEST_UID, ',') !== false) { } else {    $DEST_UID = intval($DEST_UID); }if ($DEST_UID == 0) {    if ($UPLOAD_MODE != 2) {         $dataBack = array('status' => 0, 'content' => '-ERR ' . _('接收方ID无效'));        echo json_encode(data2utf8($dataBack));        exit;    }}

这段代码中我们需要提供DEST_UID参数,且如果DEST_UID为0,则触发判断UPLOAD_MODE是否等于2,不等于2则报error并退出,因此将DEST_UID不等于0可绕过。

if (1 <= count($_FILES)) { //返回数组中元素的数目:    if ($UPLOAD_MODE == '1') { //如果UPLOAD_MODE = 1        if (strlen(urldecode($_FILES['ATTACHMENT']['name'])) != strlen($_FILES['ATTACHMENT']['name'])) {            $_FILES['ATTACHMENT']['name'] = urldecode($_FILES['ATTACHMENT']['name']);        }    }    $ATTACHMENTS = upload('ATTACHMENT', $MODULE, false);    if (!is_array($ATTACHMENTS)) {        $dataBack = array('status' => 0, 'content' => '-ERR ' . $ATTACHMENTS);        echo json_encode(data2utf8($dataBack));        exit;    }    ob_end_clean();    $ATTACHMENT_ID = substr($ATTACHMENTS['ID'], 0, -1);    $ATTACHMENT_NAME = substr($ATTACHMENTS['NAME'], 0, -1);    if ($TYPE == 'mobile') {        $ATTACHMENT_NAME = td_iconv(urldecode($ATTACHMENT_NAME), 'utf-8', MYOA_CHARSET);    }} else {    $dataBack = array('status' => 0, 'content' => '-ERR ' . _('无文件上传'));    echo json_encode(data2utf8($dataBack));    exit;}
  1. 判断1 <= count($FILES) 就是$FILES是否取到上传数据。

  2. 判断UPLOAD_MODE是否等于1,如果等于1且文件名url解码后的长度不等于原长度则将文件名url解码。

  3. 调用upload函数$ATTACHMENTS = upload('ATTACHMENT', $MODULE, false);传入3个参数,$MODULE = 'im';。

  4. 使用PHP的$FILES函数来获取我们上传的文件信息$FILES['ATTACHMENT']['name'] $_FILES的第一个下标必须是我们的input name值,因此我们的POST包的Content-Disposition: form-data; name="ATTACHMENT"; filename="jpg"中的name必须是'ATTACHMENT'。

else if ($UPLOAD_MODE == "2") {  $DURATION = intval($_POST["DURATION"]);  $CONTENT = "[vm]" . $ATTACHMENT_ID . "|" . $ATTACHMENT_NAME . "|" . $DURATION . "[/vm]";  $query = "INSERT INTO WEIXUN_SHARE (UID, CONTENT, ADDTIME) VALUES ('" . $_SESSION["LOGIN_UID"] . "', '" . $CONTENT . "', '" . time() . "')";  $cursor = exequery(TD::conn(), $query);  echo "+OK " . $CONTENT;}else if ($UPLOAD_MODE == "3") {  if (is_thumbable($ATTACHMENT_NAME)) {    $FILE_PATH = attach_real_path($ATTACHMENT_ID, $ATTACHMENT_NAME, $MODULE);    $THUMB_FILE_PATH = substr($FILE_PATH, 0, strlen($FILE_PATH) - strlen($ATTACHMENT_NAME)) . "thumb_" . $ATTACHMENT_NAME;    CreateThumb($FILE_PATH, 320, 240, $THUMB_FILE_PATH);  }  echo "+OK " . $ATTACHMENT_ID;}

本段代码说明了UPLOAD_MODE等于2或3的时候会返回$CONTENT或$ATTACHMENT_ID变量的值(1也可以),且返回值与最终文件上传所在的路径、文件名是相关的。

综上所述我们得到了3个信息

  • 存在P值且不为空 ($_POST["P"]获取)

  • DEST_UID不为0 ($POST["DEST_UID"]获取)

  • UPLOAD_MODE = 1或2或3 (非$POST["UPLOAD_MODE"]获取)

  • Content-Disposition中name值为"ATTACHMENT"

流程图:

03202c326ace5ecd8514101e58eef3f7.png

变量覆盖

由于在upload.php中未找到取UPLOAD_MODE值的方法,但在实际测试中POST的UPLOAD_MODE值可以被正常带入且影响文件上传走向,因此判断接收UPLOAD_MODE值的方法存在于被包含的文件中,在解密后使用搜索工具也仅发现UPLOAD_MODE这个参数名仅存在于upload.php中,开始追溯之旅最后在common.inc.php文件中发现了UPLOAD_MODE的源头.

具体调用为upload.php -> session.php -> coon.php -> td_config.php -> common.inc.php

漏洞代码为:

if (0 < count($_POST)) {    $arr_html_fields = array();    foreach ($_POST as $s_key => $s_value) {        if (substr($s_key, 0, 7) == '_SERVER') {            continue;        }        if (substr($s_key, 0, 15) != 'TD_HTML_EDITOR_') {            if (!is_array($s_value)) {                $_POST[$s_key] = addslashes(strip_tags($s_value));            }            ${$s_key} = $_POST[$s_key];        } else {            if ($s_key == 'TD_HTML_EDITOR_FORM_HTML_DATA' || $s_key == 'TD_HTML_EDITOR_PRCS_IN' || $s_key == 'TD_HTML_EDITOR_PRCS_OUT' || $s_key == 'TD_HTML_EDITOR_QTPL_PRCS_SET' || isset($_POST['ACTION_TYPE']) && ($_POST['ACTION_TYPE'] == 'approve_center' || $_POST['ACTION_TYPE'] == 'workflow' || $_POST['ACTION_TYPE'] == 'sms' || $_POST['ACTION_TYPE'] == 'wiki') && ($s_key == 'CONTENT' || $s_key == 'TD_HTML_EDITOR_CONTENT' || $s_key == 'TD_HTML_EDITOR_TPT_CONTENT')) {                unset($_POST[$s_key]);                $s_key = $s_key == 'CONTENT' ? $s_key : substr($s_key, 15);                ${$s_key} = addslashes($s_value);                $arr_html_fields[$s_key] = ${$s_key};            } else {                $encoding = mb_detect_encoding($s_value, 'GBK,UTF-8');                unset($_POST[$s_key]);                $s_key = substr($s_key, 15);                ${$s_key} = addslashes(rich_text_clean($s_value, $encoding));                $arr_html_fields[$s_key] = ${$s_key};            }        }    }    reset($_POST);    $_POST = array_merge($_POST, $arr_html_fields);}

首先一开始对$_POST长度进行了判断,这里$_POST实际是一个数组,存储了客户端传递的参数与值,接着使用foreach函数对数组进行遍历,foreach函数也是CTF变量覆盖漏洞经常考察的知识点,在这里我们假设$_POST数组中key为"UPLOAD_MODE",value为"2",那么我们将会最终进入这段代码中:

if (substr($s_key, 0, 15) != 'TD_HTML_EDITOR_') {            if (!is_array($s_value)) {                $_POST[$s_key] = addslashes(strip_tags($s_value));            }            ${$s_key} = $_POST[$s_key];

关键代码:

${$s_key}=$_POST[$s_key];

方便大家理解我使用IDE将这段代码运行下.

4afd302dc04bd746e307f39246e9947a.png

可以看到最终数组键名UPLOAD_MODE成了了变量名,而他的对应键值成为了变量值.

这也就是upload.php未直接接收UPLOAD_MODE值,而我们仍可以传递此参数影响函数走向的原因.

RCE

在明白了上传流程后,我们还需要配合本次的包含漏洞来包含我们上传的代码实现RCE,文件包含利用点在/ispirit/interface/gateway.php文件中. 首先

if ($P != "") {  if (preg_match("/[^a-z0-9;]+/i", $P)) {    echo _("非法参数");    exit();  }

参数P要为空值.接着

if ($json) {  $json = stripcslashes($json);  $json = (array) json_decode($json);  foreach ($json as $key => $val ) {    if ($key == "data") {      $val = (array) $val;      foreach ($val as $keys => $value ) {        $keys = $value;      }    }    if ($key == "url") {      $url = $val;    }  }  if ($url != "") {    if (substr($url, 0, 1) == "/") {      $url = substr($url, 1);    }    if ((strpos($url, "general/") !== false) || (strpos($url, "ispirit/") !== false) || (strpos($url, "module/") !== false)) {      include_once $url;    }  }  exit();}

由于存在json_decode($json);因此我们需要构造一个json,以及一个key为url且含有general/或ispirit/或module/的值,让函数走到include_once $url;处就完成了文件包含,至于$json从哪来,我想看到这你就明白了.

include_once "inc/session.php";include_once "inc/conn.php"
c7b63282fda45532e0abdbff9af7af99.png

关于我们   

c1dd97718e67dde9ad776fd146d65d9a.gif

蛇獴攻防实验室成立于2019年11月,专注网络攻防技术。

地点:吉林·长春

efcf9afc8f9ae01e3b60f06b3e0ae190.gif

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

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

相关文章

怎么看电脑的hdmi是输出还是输入_高清hdmi矩阵切换器4进4出音视频方案介绍景阳华泰科技...

高清hdmi矩阵切换器4进4出多少钱&#xff1f;这就需要了解您需要哪种4进4出矩阵&#xff01;景阳华泰科技生产的矩阵分为两种形式&#xff0c;一种是我们近几十年来一直使用的一体机&#xff0c;高清HDMI矩阵切换器4进4出采用一体机结构&#xff0c;经济实惠&#xff0c;功能较…

专业音频如何把电平转换成dbu_谭俊峰|录课、买麦,你应该了解的音频常识

近来&#xff0c;有打算录录课、吹吹牛&#xff0c;于是想升级一下硬件。既然要录音&#xff0c;那搞个好一点儿的麦克风总是必要的。于是&#xff0c;上网去查。不查不知道&#xff0c;一查吓一跳。为啥呢&#xff1f;既不为产品的琳琅满目&#xff0c;也不为价格的云泥之别&a…

android 自定义进度条_第一百八十九回:Android中自定义ProgressBar三

各位看官们大家好&#xff0c;上一回中咱们说的是Android中自定义ProgressBar的例子&#xff0c;这一回咱们继续说该例子。闲话休提&#xff0c;言归正转。让我们一起Talk Android吧&#xff01;看官们&#xff0c;我们在上一回是通过自定义PrgressBar的方式给它添加了文字&…

沉降观测曲线图 沉降观测汇总_这些沉降观测要求,工程人必须掌握!

1沉降观测的基本要求 1)仪器设备、人员素质的要求根据沉降观测精度要求高的特点&#xff0c;为能精确地反映出建(构)筑物在不断加荷下的沉降情况&#xff0c;一般规定测量的误差应小于变形值的1/10—1/20&#xff0c;为此要求沉降观测应使用精密水准仪(S1或S05级)&#xff0c;水…

rgb红色范围_【论文阅读18】RGB-D Object-Oriented Semantic Mapping

主要内容基于RGB-D数据的语义建图&#xff08;SLAM帮助语义&#xff09;。具体过程如下首先利用SSD执行单帧RGB图片&#xff08;2D&#xff09;物体检测。接着基于检测结果和深度信息&#xff0c;利用3D分割算法进一步分割3D点云。最终利用ORB-SLAM2的相机位姿信息将每帧的3D点…

7价 半导体掺杂_掺杂工艺(一)

概述半导体材料的独特性质之一是它们的导电性和导电类型(N型或P型)能被产生和控制。在本章中&#xff0c;描述在晶圆内和表面上特别的小块导电区和PN结的形成。介绍扩散和离子注入两种掺杂技术的原理和工艺。简介使晶体管和二极管工作的结构就是PN结。结(junction)就是富含电子…

数据增强_imgaug图像数据增强必备工具

导读我们经常会遇到训练模型时数据不够的情况&#xff0c;而且很多时候无法再收集到更多的数据&#xff0c;只能通过做一些数据增强或者其它的方法来合成一些数据。常用的数据增强方式有裁剪、旋转、缩放、亮度对比度色度饱和度变换、仿射变换、透视变换等&#xff0c;这篇文章…

深度学习多模态融合_3D目标检测多模态融合综述

0前言本篇文章主要想对目前处于探索阶段的3D目标检测中多模态融合的方法做一个简单的综述&#xff0c;主要内容为对目前几篇几篇研究工作的总结和对这个研究方面的一些思考。在前面的一些文章中&#xff0c;笔者已经介绍到了多模态融合的含义是将多种传感器数据融合。在3D目标检…

自适应宽_移动端实现自适应缩放界面的方法汇总

作者 | 唐宋元明清2188来源 | http://www.cnblogs.com/kybs0/在开发App端的网页时&#xff0c;要适配iphone、ipad、ipod、安卓等各种机型&#xff0c;一般是直接使用em、px转em、界面缩放。本章是通过将界面缩放&#xff0c;等比例显示在各机型上。过程中遇到了些问题和大坑~然…

Java继承简介

继承是面向对象的三大特征之一。继承和现实生活中的“继承”的相似之处是保留一些父辈的特性&#xff0c;从而减少代码冗余&#xff0c;提高程序运行效率。 Java 中的继承就是在已经存在类的基础上进行扩展&#xff0c;从而产生新的类。已经存在的类称为父类、基类或超类&…

各种说明方法的答题格式_初中语文阅读答题公式 语文阅读理解万能公式大全...

很多人想知道初中语文阅读理解有哪些答题公式&#xff0c;语文阅读理解的万能公式有哪些呢?下面小编为大家介绍一下!初中语文阅读理解答题公式大全(一)某句话在文中的作用&#xff1a;1、文首&#xff1a;开篇点题;渲染气氛(散文)&#xff0c;埋下伏笔(记叙类文章)&#xff0c…

esp8266手机端网络调试助手_esp8266定时控制

要实现定时控制&#xff0c;需要先实现手动控制&#xff0c;或者app控制。实测定时精度&#xff0c;北京时间&#xff0c;误差不超过1秒。第一、远程App控制或手动控制下载esp8266示例程序下载地址: 点击下载本demo 是利用arduino IDE开发&#xff0c;关于arduino IDE 的ESP826…

集成学习之Adaboost(提升方法)

Adaboost 提升方法就是从弱学习器出发&#xff0c;反复学习&#xff0c;得到一系列弱分类器&#xff08;基本分类器&#xff09;&#xff0c;然后组合这些弱分类器&#xff0c;构成一个强分类器。 基本思路 待解决问题 1、每一轮如何改变训练数据的权值或概率分布 2、如何将…

93没有了_杭州1米93程序员征婚贴火了!年薪50万,孩子随妈姓,没有皇位要继承...

文丨三秋桂子自从二胎政策开放以来&#xff0c;很多宝妈都希望二宝能随自己姓&#xff0c;但有些男方家庭却不同意&#xff0c;双方就孩子的“冠名权”一事争论不休。可最近有位小伙却因为征婚贴火了&#xff0c;原因有两个&#xff0c;一是小伙瞩目的身高&#xff0c;二是小伙…

李航《统计学习方法》之HMM隐马尔可夫模型

李航《统计学习方法》之HMM隐马尔可夫模型 文章目录前言一、基本概念1、语言描述&#xff1a;2、符号表示3、基本假设4、例子5、隐马尔可夫模型解决的三个基本问题二、概率计算算法1、向前算法算法&#xff1a;例题2、向后算法三、学习算法1、监督学习算法背景方法2、无监督学习…

6000毫安以上智能手机_展望2021年智能手机市场:这5大技术要爆发

2020年是极不平凡的一年&#xff0c;在黑天鹅、政治动荡等事件的冲击下&#xff0c;许多行业都按下了暂停键&#xff0c;智能手机行业自然也不例外。销售渠道受阻、供应链生产紧张&#xff0c;导致智能手机市场整体出货量呈现持续下跌的状况&#xff0c;严峻的市场行情让智能手…

无监督学习之聚类方法(K-Means、层次聚类)

一、导入 无监督学习中需要对无标记样本进行训练学习进而找到数据的内在性质和逻辑结构&#xff0c;聚类方法是为了为无监督学习的数据分析提供的基础学习方法。 聚类将数据集划分为若干个子集&#xff08;每个子集称为类或者簇&#xff09;&#xff0c;如果一个样本只属于一个…

js调用python接口_JavaScript如何调用Python后端服务

欢迎关注【无量测试之道】公众号&#xff0c;回复【领取资源】, Python编程学习资源干货、 PythonAppium框架APP的UI自动化、 PythonSelenium框架Web的UI自动化、 PythonUnittest框架API自动化、 资源和代码 免费送啦~ 文章下方有公众号二维码&#xff0c;可直接微信扫一扫关注…

详细地图_一目了然:蒙城学区划分详细地图

从明天(8月5日)起&#xff0c;小学一年级&#xff0c;初中一年级可在网上注册、报名了。根据区域内适龄学生人数、学校分布、学校规模、班额规定、交通状况等因素&#xff0c;以街道、路段、门牌号、居住小区、村组等构成要件&#xff0c;按照确保公平和免试就近入学的原则&…

奇异值分解SVD(证明全部省略)

SVD知识梳理一、引入二、SVD的定义、性质定义例题奇异值分解一定存在紧奇异值分解和截断奇异值分解几何解释三、SVD算法计算过程四、SVD与矩阵近似五、python实现六、应用一、引入 主成分分析PCA、潜在语义分析都会用到SVD 不要求A矩阵是方阵&#xff0c;SVD是线性代数中相似对…