我们检查已关闭的漏洞,并获得四个新的CVE

我被要求继续撰写有关关闭漏洞以及如何关闭漏洞的系列文章(我们的第一篇文章可以在此处阅读)。 上次我们发现,即使制造商报告了关闭漏洞的消息,但实际上一切可能并非如此。



选择标准:


这次考虑的漏洞的选择标准是相同的(除了这次我想查看其他类型的漏洞):

  • 应该有一个利用-我们希望看到在更新之前,一切都被不好地利用了 ,之后变得很好了;
  • 脆弱性应该是至关重要的(理想情况下是RCE)并且得分高;
  • 产品必须是开源的;
  • 该产品不得丢弃并积极使用;
  • 脆弱性应该是相对较新的;
  • 与往常一样,最主要的是我们自己会感兴趣。

我选择了什么以及如何选择:


我去了vulners.com,并要求显示最近两周利用exploit-db.com进行的所有利用。 这次在网络类别中,几乎所有漏洞利用都是由Ihsan Sencan编写的,但是由于它们最常与旧的不受支持的应用程序和插件中的sql注入有关,因此我将其删除。 在其余产品中,只有漏洞CVE-2018-18924的ProjeQtOr项目管理工具7.2.5属于“未放弃且正在积极开发”的类别。
此漏洞满足所有选择标准:

  • 有一个漏洞 ;
  • RCE漏洞(尽管它要求授权用户);
  • 该产品是相当开源的;
  • 该产品并未被放弃,2018年有28个版本,仅sourceforge.net有702个下载(并且大多数更新下载解决了CVE问题,这很可能表明人们看到了CVE并开始更新);
  • 11月4日的CVE,10月25日的漏洞利用,满足了新颖性的要求;
  • 我研究了这个问题及其解决方案后,对它产生了兴趣(稍后再进行介绍)。

了解项目项目管理工具


我们在nist.gov上阅读了漏洞利用描述和CVE描述 ,我们了解到7.2.5版仅对授权用户易受攻击。 另外,您可以将.shtml文件作为图像上传,尽管将显示错误消息“此文件不是有效的图像” ,但是该文件仍将保存到服务器上的图像,并可以通过主机/文件/中的直接链接进行访问images / image_name



通过直接链接访问是好的,但是在这里您仍然必须猜测下载文件的名称。 我们很幸运,它不是随机的,而是从当前时间生成的,格式为:年,月,日,小时,分钟,秒。 结果是该数字20181114140320。接下来,用户ID和原始文件名都通过下划线进行。 有很多未知数:

  • 服务器上的时区
  • 服务器上的时钟是否关闭;
  • 用户名

同样,我们很幸运:如果您上传有效的图片,那么所有这些参数都将报告给我们。 遍历几个链接并不难(几个,因为有几秒钟,但很难立即进入它们)。



通常,获取文件名不是问题。 我们继续前进。 我们认为,为什么不上传PHP脚本呢? 我们正在尝试下载它,弹出相同的窗口,但是该文件未出现在目录中。 现在该研究代码了!

脚本uploadImage.php负责将图像上传到版本7.2.5的服务器中,我们对第100到117行感兴趣。

if (substr($ext,0,3)=='php' or substr($ext,0,4)=='phtm') { if(@!getimagesize($uploadedFile['tmp_name'])) { $error=i18n('errorNotAnImage'); } else { traceHack("Try to upload php file as image in CKEditor"); } } else { if ( ! move_uploaded_file($uploadedFile['tmp_name'], $uploadfile)) { $error = htmlGetErrorMessage(i18n('errorUploadFile','hacking ?')); errorLog(i18n('errorUploadFile','hacking ?')); } } } if (!$error) { if(@!getimagesize($uploadfile)) { $error=i18n('errorNotAnImage'); } } 

第100行负责检查文件扩展名:如果文件扩展名为php或phtm,则该文件将被丢弃而不保存。 因此,php文件不会出现在“ files / images /”目录中。 第115行产生了我们看到的错误,但对文件没有任何作用。

好吧,我们不要离开漏洞利用并上传扩展名为.shtml的文件。 在这里值得做一个小小的题外话,并告诉.shtml是什么以及它被吃了什么。

SHTML和SSI


维基百科定义:

SSI(服务器端包含-服务器端包含)-一种简单的语言,用于从各个组件动态“组装”服务器上的网页并将接收到的HTML文档传递到客户端。 使用mod_include模块在Apache Web服务器中实现。 Web服务器默认设置中包含的功能允许您包括HTML文件,因此,按照说明使用,文件必须以扩展名.shtml,.stm或.shtm结尾。

用您自己的话说:

SHTML是可以执行服务器端指令集的HTML。 其中有用的是exec函数,它可以在服务器上执行任意命令(是的,我们可以使用HTML代码下载文件并运行它)。

这是运行任意代码的示例代码:

 <!--#exec cmd=”ls” --> 

好消息是,默认情况下,Apache2服务器上未启用此功能,要启用该功能,您需要手鼓跳舞。 在选择配置的几个小时后,我能够使环境变量的返回起作用,但命令无效。 这是我的SSI代码:

 <html> <head> <title>thegeekstuff.com</title> </head> <body> <p> Today is <!--#echo var="DATE_LOCAL" --> <!--#exec cmd="ls" --> </p> </body> </html>  : Today is Wednesday, 14-Nov-2018 17:29:14 MSK [an error occurred while processing this directive] 

如果有人告诉您要在配置中写些什么,以使其正常工作,我很想阅读它。

利用漏洞


如果星星会聚,则可以下载shtml文件并执行任意命令(或者像我一样,查看服务器上的时间)。

观看补丁


下一版本是7.2.6,但是对于我们感兴趣的漏洞没有任何更改(再次被nist.gov欺骗)。

我们看一下7.2.7版本,似乎所有内容都是固定的(开发人员自己说,所有内容在此版本中都是固定的)。 有两个主要更改:

1.在禁止的扩展中,添加了“ shtm”(如果前四个字符是这样,shtml也会落在此处):

 if (substr($ext,0,3)=='php' or substr($ext,0,4)=='phtm' or substr($ext,0,4)=='shtm') { 


2.现在将删除不是图片的文件:

  if(@!getimagesize($uploadfile)) { $error=i18n('errorNotAnImage'); kill($uploadfile); } 

似乎您可能会有所分歧,因为删除了非图片,并且shtml甚至没有尝试保留。 但是,如果他们试图解决黑名单问题,我总是不喜欢它。 例如,在某些国家/地区,公司禁止社交网络。 这导致了一个事实,用户开始使用社交网络的“镜像”,用户名和密码被盗。 他们的密码与公司密码一致,但是可能比员工在instagram上喝杯咖啡翻阅更大的问题。

在Web编程及其安全性中,黑名单也是邪恶的。

绕过ProjeQtOr的黑名单


好吧,一切都很简单。 首先,让我们看看默认设置下Apache2 + PHP可以解释哪些文件(所有文件都已安装在ubuntu 16.04上,并具有更新的存储库)。 “ FilesMatch”指令负责解释文件的能力。 我们使用命令“ grep -r” <FilesMatch“ / etc / apache2”对其进行搜索,结果如下:

 /etc/apache2/mods-available/php7.0.conf:<FilesMatch ".+\.ph(p[3457]?|t|tml)$"> /etc/apache2/mods-available/php7.0.conf:<FilesMatch ".+\.phps$"> /etc/apache2/mods-available/php7.0.conf:<FilesMatch "^\.ph(p[3457]?|t|tml|ps)$"> /etc/apache2/sites-available/default-ssl.conf: <FilesMatch "\.(cgi|shtml|phtml|php)$"> /etc/apache2/apache2.conf:<FilesMatch "^\.ht"> 

在default-ssl.conf配置中,所有扩展名都简单地完整列出;它们是:cgi,shtml,phtml,php。 c,除cgi之外的所有内容都在ProjeQtOr中被过滤掉了。

php7.0.conf配置更加有趣,其中扩展名由正则表达式设置。 我们得到:
扩展名过滤了什么
的PHPsubstr($ ext,0.3)=='php'
php3substr($ ext,0.3)=='php'
php4substr($ ext,0.3)=='php'
php5substr($ ext,0.3)=='php'
php7substr($ ext,0.3)=='php'
pht没什么
phtml3substr($ ext,0.4)=='phtm'

很好,找到未过滤的文件扩展名。 我们验证它是否确实得到了解释。

创建一个具有以下内容的test.pht文件:

 <?php phpinfo(); 

我们在浏览器中转到此文件,并查看有关已安装php的信息。 值得注意的是,黑名单被绕过了,而对于非默认设置,由于某种原因,可以允许其他解释扩展名。

我们将测试文件加载到ProjeQtOr项目管理工具中。 当然,我们会得到一个错误,因为这不是图片(在7.2.7之前的版本中,我们已经在服务器上执行了代码,因为将phpinfo更改为执行命令并不困难)。 在版本7.2.7中,将删除该文件,并且不执行代码。

但是,我们并不会因此而烦恼并绕过图片检查。

PHP图片


通过getimagesize函数检查在ProjeQtOr项目管理工具中下载的文件是否是图片,该函数仅查看传输文件的标题。

利用php文件中可能存在垃圾的事实,并且对php代码的解释仅以字符“ <?Php”开始,我们编写了一个小代码,该代码首先编写图片,然后编写所需的php代码。 作为图片,我们将发送错误窗口的屏幕截图。 3行python代码,您已完成:

 data = open ('test.png','rb').read() data += open ('test.pht','rb').read() open ('new_pht_png.pht','wb').write(data) 

可能您只需要在文件的开头写一个有效的图像标题即可,但是它更简单,甚至可以在任何查看器中显示该图像。

我们将创建的内容上传到服务器,然后瞧瞧,它已被加载(并在查看器中以图片形式显示),并且很好的是,我们还可以看到文件上传的全名。



我们转到下载的文件localhost / files / images / 20181114171730_1_new_pht_png.pht ,将下载的图像视为文本,并在其下方显示phpinfo输出。 显然,用简单的Web Shell替换phpinfo并不困难。 例如,这:<?Php系统($ _ GET ['cmd']);



开始选择文件下载后,您需要完成工作并查看还有黑名单或没有黑名单的文件的其他下载位置。

另一个文件上传


我们将观看最新的可用版本。 假设您使用与以前相同的功能上传文件,即 move_uploaded_file,我们在项目目录“ grep -r” move_uploaded_file“ ./”中搜索它。 我们得到以下5个文件:

./tool/uploadImage.php
./tool/saveDocumentVersion.php
./tool/uploadPlugin.php
./tool/import.php
./tool/saveAttachment.php

文件uploadImage.php-已经查找。
文件saveDocumentVersion.php-下载文档版本(顾名思义)。 我们尝试下载文档并进行查看(首先,我们将始终加载图片)。 下载后,我们看到扩展名.1已添加到文件中。 我们在代码中查看如何获取名称(在第229行完成):

 $uploadfile = $dv->getUploadFileName(); 

在DocumentVersionMain.php文件中声明了getUploadFileName函数。 在那里,在第227行,我们看到“。”被添加到返回的名称中。 和文件ID。 即使增加了一点,我们也无法解决:

 return $uploaddir . $paramPathSeparator . $fileName . '.' . $this->id; 

只有管​​理员才能访问uploadPlugin.php文件,并且该插件可能包含错误的代码这一事实非常合乎逻辑,并且无需输入插件验证就很难摆脱(就像流行的CMS一样)。 当然,当您尝试在那里下载内容时,它会成功加载,然后执行。

import.php文件也仅对管理员可用。 下载文件时,系统会告诉您该文件应该是csv文件或xlsx文件。 当然,我们尝试加载php文件并看到错误:

错误-提供的文件类型和所选文件格式不匹配


导入中止

问题在于,与CVE中的原始错误一样,该文件未删除,但仍可在localhost / files / attach / import / test.php中使用

加载任何附件时(例如,加载自己的图像时),将使用saveAttachment文件。 PHP脚本不会在此处爬网,因为存在以下形式的保护:

 if (substr($ext,0,3)=='php' or substr($ext,0,4)=='phtm' or substr($ext,0,4)=='shtm') { $attachment→fileName.=".projeqtor"; 

事实证明,扩展名文件php *,phtm *,shtm *都添加了扩展名“ .projeqtor”,也就是说,显然我们的pht文件将在此处进行爬网(即使不对图片进行爬网)。 我们尝试一下,然后将所有内容获取到地址localhost / files / attach / attachment_1 / test.pht

五个快速找到的文件下载位置的总底线:

  • 设法加载php或pht脚本4次;
  • 黑名单验证分为两部分;
  • 白名单验证不在任何地方;
  • 由于文件下载失败(下载失败,但是执行失败) 扩张正在改变

关于ProjeQtOr项目管理工具和CVE-2018-18924的结论



  • 报告的漏洞实际上已被消除;
  • 代码中还有其他漏洞(已报告给开发人员,他们甚至答应将扩展列入白名单);
  • 正确配置Apache2服务器可以使我们免于一切(将可执行文件格式限制为仅必要,禁止执行用户文件夹中的脚本);
  • nist.gov包含最新的易受攻击的版本。

情妇笔记


  • 尽可能拒绝黑名单(我不知道这是不可能的);
  • 处理下载的文件时要小心谨慎(最好将其放在一个位置,并且不要分散到5处);
  • 正确配置的Web服务器可避免项目代码中的许多问题(编写代码并正确配置服务器很重要)。

开发人员的详细答案


开发人员的第一个答案是“我们已经修复了所有内容,因此请查看更正后的代码”。 我必须详细描述一些问题在哪里以及如何加以利用。

然后他收到了详细的答案:“是的,有问题,这些问题将在版本7.3.0中修复。 同时还将为xlslx和csv的图像添加白名单。” 他们还写道,他们建议在安装说明中的Web访问之外添加“附件”和“文档”目录。

开发人员允许我注册CVE,并在更新后写一篇文章(该文章已经发布并可以下载 )。

结论


正如我在开始时所写的那样,有很多人下载了决定CVE的更新(下载次数超过500),人们更新其易受攻击的软件很酷,但令人遗憾的是该软件仍然易受攻击。

结果,我和我们的公司分配了四个CVE:CVE-2018-19307,CVE-2018-19308,CVE-2018-19309,CVE-2018-19310。

Source: https://habr.com/ru/post/zh-CN430408/


All Articles