jmeter file upload 变量_通达OA上传漏洞之变量覆盖分析

026076f6a6295b2849c0e14b9082108a.png1e376b3108d677c66a8dcc981f35e3ae.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"

流程图:

77fae688f9cf73e1d3ce12a277edb155.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将这段代码运行下.

c331f41e5b6f2f267f69cc337bde727a.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"
c2bb5a8eaa792a00f632e2c49d0b2558.png

关于我们   

b0ce82f82682ae69f93b7441b85100cf.gif

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

地点:吉林·长春

108fb8b6c667da540a87f2a7e5377e86.gif

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

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

相关文章

如果卷积神经网络存在根本性的缺陷,你会怎么看?

来源&#xff1a;人工智能头条作者 | Ben Dickson译者 | 香槟超新星经过一段漫长时期的沉寂之后&#xff0c;人工智能正在进入一个蓬勃发展的新时期&#xff0c;这主要得益于深度学习和人工神经网络近年来取得的长足发展。更准确地说&#xff0c;人们对深度学习产生的新的兴趣在…

产业|嵌入式传感器将是未来机器人等技术增长的核心

来源&#xff1a;EEWORLD移动即服务(MaaS)被认为是智能移动的一个关键要素&#xff0c;而机器人汽车技术将是智能移动的一个重要因素&#xff0c;它又高度依赖于嵌入式传感器。根据市场研究和战略咨询公司Yole development pement (Yole)的预测&#xff0c;在这种情况下&#x…

可观测宇宙中,我们可能是唯一的生命

图片来源&#xff1a;Pixabay长期以来&#xff0c;人类一直渴望在宇宙中找到地外生命的痕迹&#xff0c;但一项于今年早些时候发表的研究&#xff0c;给持有此类想法的人泼了一盆冷水。基于“自然发生”学说以及其中的“RNA世界”假说&#xff0c;研究人员认为在可观测宇宙中&a…

中国工程院发布“中国电子信息工程科技发展十六大挑战”

来源&#xff1a;通信世界全媒体通信世界网消息&#xff08;CWW&#xff09;为响应中央决策部署,推进我国新型数字基础设施建设,推动我国电子信息工程科技领域高质量发展&#xff0c;助力数字基建科学发展驱动壮大经济新动能。4月26日&#xff0c;中国工程院信息与电子学部、中…

Unix下5种I/O模型

Unix下I/O模型主要分为5种&#xff1a; &#xff08;1&#xff09;阻塞式I/O &#xff08;2&#xff09;非阻塞式I/O &#xff08;3&#xff09;I/O复用(select和poll) &#xff08;4&#xff09;信号驱动式I/O &#xff08;5&#xff09;异步I/O 1、阻塞式I/O模型 unix基本的套…

2019年智能科学与产业综述论文盘点

来源&#xff1a;计算机研究与发展2019年综述论文盘点1.智能芯片的评述和展望&#xff08;韩栋,周聖元,支天,陈云霁,陈天石&#xff09;2.闪存存储的重构与系统构建技术&#xff08;陆游游,杨者,舒继武&#xff09;3.基于动态权衡的新型非易失存储器件体系结构研究综述&#xf…

h命令可以获取mysql客户端的帮助信息_如何获取MySQL帮助信息

在开发或测试环境在碰到MySQL相关故障时&#xff0c;大多数朋友可能会通过论坛发帖&#xff0c;QQ群讨论方式来获取帮助。该方式是获取帮助的有效途径之一。然而如果在生产环境&#xff0c;在没有网络的环境下&#xff0c;这些方式就无助于问题的解决。无论何种数据库&#xff…

AI与人类围棋士的差距到底有多大?

来源&#xff1a;计算广告四年前&#xff0c;谷歌旗下DeepMind公司开发的围棋人工智能AlphaGo以4-1战胜韩国大国手李世乭九段。今天&#xff0c;AlphaGo在大众视野中掀起的惊涛骇浪已渐平息&#xff0c;AlphaGo和李世乭都已从江湖退隐。然而&#xff0c;围棋界因AlphaGo而起的沧…

mariadb使用mysql驱动_MariaDB安装与使用

下载相对应的电脑版本程序等待下载完成......安装教程&#xff1a;双击运行设置数据库的密码等待安装完成..这样就完成安装了。安装完成&#xff0c;会在桌面生成这个图标双击可以直接使用下面我通过两种方式来使用MariaDB数据库(可视化&#xff0c;命令行)通过可视化方式使用。…

脑机接口技术重大突破!首次帮助瘫痪男子恢复运动和触觉

来源&#xff1a;网易智能触觉是我们感受外部世界不可或缺的感官&#xff0c;但许多人却因脊髓损伤或因患病瘫痪而失去这种能力。不过&#xff0c;最近非营利组织巴特尔研究所的研究人员宣称&#xff0c;他们首次利用脑机接口&#xff08;BCI&#xff09;技术帮助一名美国瘫痪男…

python海龟图画龙珠_火影,海贼王,七龙珠,还在为漫画书发愁!我用Python一键生成电子漫画书...

小时候看漫画都是要买书的&#xff0c;一本好几块钱&#xff0c;成本那个高啊后来可以在线看漫画&#xff0c;感觉真是爽不过近几年新的问题又出现了&#xff1a;漫画网站广告太多&#xff0c;更重要的是越来越多的作品、章节出于各种原因被下架、限制观看。为了提升观看体验&a…

谷歌自揭“家丑”:医疗AI实验室表现超神,临床结果却不佳

来源&#xff1a;澎湃新闻在医疗领域&#xff0c;尤其是在医学影像筛查过程中&#xff0c;人工智能常被描述为完美的工作者。它们能准确识别疾病&#xff0c;拥有人类专家级的发现能力&#xff0c;还不知疲倦。但与许多技术一样&#xff0c;在实验室取得成功是一回事&#xff0…

mysql 移植ucos_基于STM32F767的UCOSIII移植学习

(一)移植前的准备1.HAL库基本工程模板新建一个工程模块&#xff0c;其中包含LED驱动和串口驱动程序即可&#xff0c;用于验证UCOS-III系统能够正常工作。2.UCOS-III源码准备去Micrium官网下载最新的UCOSIII源码&#xff0c;下载地址&#xff1a;Micrium官网下载地址&#xff0c…

美国5G到底怎么了?

来源&#xff1a;网优雇佣军美国司法部长威廉巴尔&#xff08;William Barr&#xff09;在2月6日应华盛顿智库“战略与国际研究中心”&#xff08;CSIS, Center for Strategic & International Studies&#xff09;邀请&#xff0c;参加了“中国倡议”会议&#xff08;Chin…

SQL实践篇(一):使用WebSQL在H5中存储一个本地数据库

文章目录 简介本地存储都有哪些&#xff1f;如何使用WebSQL打开数据库事务操作SQL执行 在浏览器端做一个英雄的查询页面如何删除本地存储参考文献 简介 WebSQL是一种操作本地数据库的网页API接口&#xff0c;通过它&#xff0c;我们可以操作客户端的本地存储。 WebSQL曾经是H…

预计2024年之前载人登月!NASA授予马斯克贝索斯公司大单

来源&#xff1a;小小据外媒报道&#xff0c;当地时间周四&#xff0c;美国宇航局(NASA)宣布选中埃隆马斯克(Elon Musk)旗下美国太空探索技术公司SpaceX、杰夫贝索斯(Jeff Bezos)的蓝色起源公司&#xff08;Blue Origin&#xff09;和Dynetics为其设计和建造月球着陆系统&#…

java 遗传算法_[原]遗传算法Java实现源代码

【Title】[原]遗传算法Java实现源代码【Date】2013-04-07【Abstract】以前学习遗传算法时&#xff0c;用Java实现的遗传算法程序&#xff0c;现整理分享出来。【Keywords】wintys、遗传、算法、algorithm、种群、基因、个体、进化、染色体、适应度、Rosenbrock【Environment】W…

理解进化的五座“桥”

来源&#xff1a;原理古往今来&#xff0c;达尔文是不是最具革命性的科学家之一&#xff1f;如果革命指的是把一个已经公认的学说颠倒过来&#xff0c;那挑战者还有很多&#xff0c;至少包括牛顿、爱因斯坦和量子力学的奠基者。这些物理学家超群绝伦的智慧能量&#xff0c;可能…

【AI】【机器人】AI与机器人的42个终极问题与解答

来源&#xff1a;产业智能官 未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云脑研究计划&#xff0c;构建互联网&#xff08;城市&#xff09;云脑技术和企业图…

With you With me

With you With me 回来了&#xff0c;一起从零开始... 据说每一个敢说从零开始的都特么是个大牛&#xff08;for example hiphop-Man欧阳靖&#xff09;... 这些年的时间多有自己问自己&#xff0c;你特么到底在迷茫什么&#xff0c;想不通就去撞墙啊&#xff01;&#xff01;…