跨站攻击:温柔杀手-跨站Script攻击和防御

来源:安全中国

每当我们想到黑客时候黑客往往是这样幅画像:个孤独悄悄进入别人服务器中进行破坏或者窃取别人秘密资料也许他会更改我们主页甚者会窃取客户信用卡号和密码另外黑客还会攻击访问我们网站WebSite客户和此同时我们服务器也成了他帮凶微软称这种攻击为"跨站script"攻击而这种攻击大多数都发生在网站WebSite动态产生网页时侯但黑客目标并不是你网站WebSite而是浏览网站WebSite客户
跨站script攻击介绍说明
本名为<<ADVISORY CA--2000-02>>杂志中CERT警告大家:如果服务器对客户输入不进行有效验证黑客就会输入些恶意HTML代码当这些HTML代码输入是用于SCRIPT他们就能利用它来进行破坏如插入些令人厌恶图片或声音等同时也能干扰了客户正确浏览网页
我们知道有些朋友曾经被诱导到些可疑免费网站WebSite他们得到仅仅是10到20个小窗口这些窗口常常伴随着由JAVA 或 JAVASCRIPT生成失效安钮这被称为鼠标陷阱关闭这些窗口是徒劳每当我们关闭个窗口又会有10几个窗口弹出这种情况常常发生在管理员没在时侯发生鼠标事件是黑客利用跨站SCRIPT思路方法攻客户典型范例
恶意标签和SCRIPT不单纯恶作剧他们甚至可以窃取资料和捣毁系统个聪明甚至是不够聪明黑客都能够使用SCRIPT干扰或者改变服务器数据输入利用SCRIPT代码也能攻击客户系统让你硬盘尽损而且你要知道在你边使用服务器时候黑客SCRIPT也正在你服务器里安全地方运行着呀!如果客户对你服务器非常信认同样他们也会信任那些恶意SCRIPT代码甚至这个代码是以〈SCRIPT〉或者〈OBJECT〉形式来自黑客服务器
即使使用了防火墙(SSL)也不能防止跨站SCRIPT攻击那是如果生成恶意SCRIPT代码设备也使用了SSL我们服务器SSL是不能辨别出这些代码来我们难道就这样把客户曾经那么信任网站WebSite拱手让给黑客吗?而且有这种破坏存在会让你网站WebSite名誉尽损
、跨站SCRIPT攻击举例:
根据CERT资料动态输入大致有这几种形式:URL参数表格元素COOKISE以及数据请求让我们来分析这个只有两个页面网站WebSite网站WebSite名为:MYNICESITE.COM页使用张表格或COOKIE来获取用户名:

<%@ Language=VBScript %> 
<% If Request.Cookies("userName") <> "" Then
Dim strRedirectUrl
strRedirectUrl = "page2.asp?userName=" 
strRedirectUrl = strRedirectUrl & Response.Cookies("userName")
Response.Redirect(strRedirectUrl)
Else %>
<HTML>
<HEAD>
<TITLE>MyNiceSite.com Home Page</TITLE>
</HEAD>
<BODY>
<H2>MyNiceSite.com</H2>
<FORM method="post" action="page2.asp">
Enter your MyNiceSite.com username: 
<INPUT type="text" name="userName">
<INPUT type="submit" name="submit" value="submit">
</FORM> 
</BODY>
</HTML> 
<% End If %>

第 2页返回用户名以示欢迎:
<%@ Language=VBScript %>
<% Dim strUserName
If Request.QueryString("userName")<> "" Then
strUserName = Request.QueryString("userName")
Else
Response.Cookies("userName") = Request.Form("userName")
strUserName = Request.Form("userName")
End If %>
<HTML>
<HEAD></HEAD>
<BODY>
<H3 align="center">Hello: <%= strUserName %> </H3>
</BODY>
</HTML>


当你正常常输入文字时切都很正常如果你输入Script代码:<SCRIPT>alert(’Hello.’;</script>,JavaScript警告标签就会弹出来:
在你下次访问时这个警示标签同样会出现;这是这个Script代码在你第次访问时后就已经留在cookie中了这是个简单跨站攻击范例
如果你认为这是个特殊情况你也不妨到网上别地方看看亲自试我曾经对些大型政府网站WebSite、教育网站WebSite以及商业网站WebSite进行过测试他们当中确有部分出现了以上所说情况我甚至发现了我经常使用信用卡网站WebSite也居然对输入不进行任何过滤想想真是可怕
2、 用E-Mail进行跨站Script攻击
跨站script攻击用在列表服务器usenet服务器和邮件服务器来得特别容易下面还是以MyNiceSite.com网站WebSite为例进行介绍说明由于你经常浏览这个网站WebSite内容也确让你爱不爱不释手因此在不知不觉中你就把浏览器改成了总是信任这个动态网站WebSite内容设置
MyNiceSite.com网站WebSite总是通过出售征订它们Email信件邮箱地址来获得收入确是种不太好办法于是我买了它份邮箱地址并发了大量邮件给你们在信中我告诉你们尽快访问这个网 站并检查你们帐户使用最新情况为了让你们感到方便我在这信中也作了链接我在这链接URL中username参数中舔加了script代码有些客户在不知不觉中就点击了这个链接也就是说上了我当(如图)同时我也从中得到了好处:
它是这样工作当你点击这个链接时后在链接里script代码就会引导你所用浏览器去下载我JavaScript并执行它Script检查到你使用是IE浏览器后就着手下载ActiceXControl控件 particularlyNasty.dll的前你已经把这个网站WebSite内容认为总是安全这样script代码和Active Control控件就能在你机器上自由自在运行了
3、 Activex攻击介绍说明
在讨论ActiveX时CERT和微软都没提到跨站script思路方法所带来危险W3C在<<安全常见问题解答>>中对ActiveX安全问题作了比较详尽介绍说明Java applet对系统控制受到严格限制SUN开发它时就规定只有那些对系统安全不构成威胁操作才被允许运行
在另方面ActiveX对系统操作就没有严格地被限制如果但被下载就可以象安装可执行样做他们想干事情针对这特点IE浏览器也作了某些限制如对于那些不安全站点在它默认设置中就会不允许你进行下载或者会给你警告提示正在基于ActiveX进行开发公司如VeriSign公司它们对ActiveXControl控件都给编了号当你在下载Control控件时后IE浏览器会给你警告并显示它可信籁程度由用户决定是否相信这个Control控件这样来系统安全性就增加了
但是对于那些没有多少经验用户来说他们往往不自觉地对原来设置进行了修改让这些Control控件在没有任何提示情况下就下载了另外个新手来说即使在有提示情况下也会不加思索地下载那些没作任何标记Control控件在我们所举例子中由于你对该站点信任改了浏览器设置这样ActiveXControl控件在不经过任何提示情况下就下载并在你机器上不知不觉地开始运行
4、16进制编码ActiveX Script 攻击
要把用心不良标签和script区分出来是件非常困难Script还可以16进制形式把自己藏起来让我们看看下面这个E-mail范例好吗?它是以16进制形式被发送出去:
这几乎是封完整邮件里面包含了以16进制伪造URL参数:sender=mynicesite.com当用户点击链接时用户浏览器就会直接开始第例所说处理过程而弹出警告窗口
第 2部分:跨站Script攻击防犯
、如何避免服务器受到跨站Script攻击
值得庆幸防止跨站Script攻击技术正趋于完善目前可采取这几种方式来防止跨站Script攻击:
1.对动态生成页面进行编码
2.对输入进行过滤和限制
3.使用HTML和URL编码
1.对动态生成页面进行编码
你们首先要采用就是对动态生成页面进行编码你必须这样做不然黑客很有可能更改你设置而轻易地通过你防线如果我们网站WebSite是个英语网站WebSite这样只要我们把编码设成拉丁ISO-8859-1就行了具体情况如下:
<META http-equiv="Content-Type" content="text/html;char=ISO-8859-1">
2.过滤和限制所有输入数据
这是防止跨站Script攻击第 2种思路方法在进行登录时侯不要让那些特殊也输入进去因此我们可在ONSUBMIT思路方法中加入JAVASCRIPT来完成这个功能在本例中我们限制最多只能输入15个这样可以阻止那些较长script输入
在<<Knowledge Base Article QA252985>>这本书中微软提供了个简短Javascript来完成对输入数据过滤我们也根据具体情况引进了这段代码用于我们例子中如:
function checkForm {
document.forms[0].userName.value = _
RemoveBad(document.forms[0].userName.value);
 true; 
}
// MICROSOFT’S CODE
function RemoveBad(strTemp) {
strTemp = strTemp.replace(/\</\>/\"/\’/\%/\;/\(/\)/\&/\+/\-/g,"");
 strTemp; 
}


用这个办法可以过滤在输入中含有这些:
% < > [ ] { } ; & + - " ’( )
3.使用HTML和URL编码
尽管使用上面所说过滤和限制输入办法是种非常重要用防御手段但它对我这种采用邮件方式攻击还是无能为力我把URL参数直接放在邮件中针对这种情况我们不得不采取种更有力安全措施如果我们用ASP解决起来相对说来要容易得多只要对动态生成网页总进行HTML和URL编码就行了针对我们例子中情况在第输入页中我们对redirect URL作了如下改动:
strRedirectUrl = strRedirectUrl & _
server.URLEncode(Response.Cookies("userName")) 
在执行页中我们加入:
strUserName =server.HTMLEncode(Request.QueryString("userName"))

strUserName =server.HTMLEncode(Request.Form("userName"))
微软推荐对所有动态页面输入和输出都应进行编码甚至在对数据库数据存入和取出也应如此这样你就能在很大程度上避免跨站script攻击
要做到这些还要在Page1.asp中加入:
<%@ Language=VBScript %>
<% If Request.Cookies("userName") <> "" Then
’redirect  detect the cookie
Dim strRedirectUrl 
strRedirectUrl = "page2.asp?userName=" 
strRedirectUrl = strRedirectUrl & _ 
server.URLEncode(Request.Cookies("userName")) 
Response.Redirect(strRedirectUrl)
Else %>
<HTML>
<HEAD>
<META http-equiv="Content-Type"content="text/html; char=ISO-8859-1">
<TITLE>MyNiceSite.com Home Page</TITLE>
</HEAD>
<SCRIPT LANGUAGE="javascript">
<!--
function checkForm {
document.forms[0].userName.value = 
RemoveBad(document.forms[0].userName.value);
 true; 
}
//******************************************************
//Programmer: NOT ORIGINAL CODE - COMES FROM MICROSOFT
//Code Source: Microsoft Knowledge Base Article Q25z985
//Description: Removes bad characters.
//******************************************************
function RemoveBad(strTemp) {
strTemp =strTemp.replace(/\</\>/\"/\’/\%/\;/\(/\)/\&/\+/\-/g, "");
 strTemp;
}
//-->
</SCRIPT>
<BODY>
<BR>
<H2>MyNiceSite.com</H2>
<BR>
<FORM method="post"action="page2.asp" onsubmit=" checkForm;">
Enter your MyNiceSite.com username: 
<INPUT type="text"name="userName" width="10" maxwidth="10">
<INPUT type="submit"name="submit" value="submit">
</FORM>
</BODY>
</HTML> 
<% end  %>
Page2.asp中加如:
<%@ Language=VBScript %>
<% Dim strUserName
If Request.QueryString("userName")<>"" Then
strUserName =server.HTMLEncode(Request.QueryString("userName"))
Else
Response.Cookies("userName") =Request.Form("userName")
strUserName = server.HTMLEncode(Request.Form("userName"))
End If %>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html;char=ISO-8859-1">
</HEAD>
<BODY>
<H3 align="center">Hello: <%= strUserName %></H3>
</BODY>
</HTML>

现在由于这种攻击遭到有效防制那于那些恶意标签和Script被编码他们就被以文字形式显现了出来如下图:
我们也可增加个IIS组件用于过滤所有从动态输入中特殊对于那些已经做好网站WebSite采用这种办法来防止跨站script攻击来得非常容易我们这个Control控件能拦截来自ASP页面REQUEST目标可对表格cookie,请求字串和内容进行检测:
我们也可以通过编写log文件思路方法把统计数据加入这个组件中每当个客户输入个非法这个组件会记下它IP地址和时间详情请见Doug Dean<<Roll your Own IIS Application on ASPToday>>
我们只需采取些简单步聚就能有效地阻止跨站script攻击除了以上所说 3种思路方法外微软和CERT还强烈推荐使用种他们称的为"sanity check"思路方法例如假设有个输入窗口只允许输入数字我们就给它做个限定只允许0-9数字输入微软和CERT所采用这种对输入进行限定办法要比单独采用过滤特殊要好得多采用了这些措施后你就能让那些参观你网站WebSite客户在访问你网站WebSite时受到保护
2、免受黑客攻击我们浏览器思路方法:
当你在网上漫游时侯怎样来避免受到攻击呢?微软和CERT建议不要在网上胡碰乱撞针对这种情况PC杂志个栏目名叫John Dvorack作者作了个饶有兴趣回答他认为这是微软公司起有预谋行为:就是用来恐吓网上冲浪人到那些安全站点去浏览如美国在线和MSN.com网站WebSite
在我们所举例子中即使你不在网上胡乱游荡也不能避免在网上遭到黑客袭击具有讽刺意义大多数危险都来自于我们最信任网站WebSite如果要让网站WebSite定不出问题你只好不下载任何动态内容或者任何cookie预知详情请参阅浏览器相关资料
微软也警告你们应把浏览器Active Script设置成严格限制状态并把Email也设成严格限制接收模式在点击邮件中链接时定要小心如需进步了解情况请参阅本名叫<<Microsoft’s Knowledge Base Article Q253117>>为了以防万你最好是多点上网经验并且时刻要小心谨慎
结论
如果你是以前UNIX开发人员你也许不会知道跨站script意谓着什么你知道许多站点管理人员登录用户名和密码分别为root,root.同样许多数据库管理员名称和密码分别为sa,password你也知道Webzine(如Phrack 和 Alt2600)依据他们所提供思路方法能让你步步地知道某台服务器弱点在这种硬件上你也知道许多网站WebSite数据库服务器和web服务器都没有进行自我保护但遭遇黑客机器就得瘫痪
尽管我们很容易采取防止系统受到黑客攻击措施但我们系统是直暴露在黑客面前我们完全有理由相信下年还会出现些新安全漏洞在CERT公司John Howard先生指导下完成篇论文中曾提到:"跟据目前研究显示每个在英特网上具有域名网站WebSite平均年被黑客至少攻击"
对服务器来说那怕只是次这种攻击也是不能承受跨站Script攻击是黑客可采用种思路方法但我们只要进行以上所说些简单处理就能防止这种形式攻击发生



  • 篇文章: 无线网络密码如何被破解

  • 篇文章: 软件Software破解新手进化篇
  • Tags:  防跨站攻击 跨站攻击原理 跨站脚本攻击 跨站攻击

    延伸阅读

    最新评论

    发表评论