近工作要求解决下web的项目的漏洞问题,扫描漏洞是用的AppScan工具,其中有很多是关于跨站点脚本编制问题的。下面把这块东西分享出来。 -----------------------------------------正题------------------------- 测试类型: 应用程序级别测试 威胁分类: 跨站点脚本编制 原因: 未对用户输入正确执行危险字符清理 安全性风险: 可能会窃取或操纵客户会话和cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务 受影响产品: 该问题可能会影响各种类型的产品。 引用: CERT Advisory CA-2000-02 Microsoft How To: Prevent Cross-Site Scripting Security Issues (Q252985) Microsoft How To: Prevent Cross-Site Scripting in ASP.NET Microsoft How To: Protect From Injection Attacks in ASP.NET Microsoft How To: Use Regular Expressions to Constrain Input in ASP.NET Microsoft .NET Anti-Cross Site Scripting Library 跨站点脚本编制培训模块 技术描述: AppScan 检测到应用程序未对用户可控制的输入正确进行无害化处理,将其放置到充当Web 页面的输出中。这可被跨站点脚本编制攻击利用。 在以下情况下会发生跨站点脚本编制(XSS) 脆弱性: [1] 不可信数据进入Web 应用程序,通常来自Web 请求。 [2] Web 应用程序动态生成了包含此不可信数据的Web 页面。 [3] 页面生成期间,应用程序不会禁止数据包含可由Web 浏览器执行的内容,例如JavaScript、HTML 标记、HTML 属性、鼠标事件、Flash 和 ActiveX。 [4] 受害者通过Web 浏览器访问生成的Web 页面,该页面包含已使用不可信数据注入的恶意脚本。 [5] 由于脚本来自Web 服务器发送的Web 页面,因此受害者的Web 浏览器在Web 服务器的域的上下文中执行恶意脚本。 [6] 这实际违反了Web 浏览器的同源策略的意图,该策略声明一个域中的脚本不应该能够访问其他域中的资源或运行其他域中的代码。 一旦注入恶意脚本后,攻击者能够执行各种恶意活动。攻击者可能将私有信息(例如可能包含会话信息的cookie)从受害者的机器传输给攻击者。攻 击者可能以受害者的身份将恶意请求发送到Web 站点,如果受害者具有管理该站点的管理员特权,这可能对站点尤其危险。 网络钓鱼攻击可用于模仿可信站点,并诱导受害者输入密码,从而使攻击者能够危及受害者在该Web 站点上的帐户。后,脚本可利用Web 浏览器本 身中的脆弱性,可能是接管受害者的机器(有时称为“路过式入侵”)。 主要有三种类型的XSS: 类型1:反射的XSS(也称为“非持久性”) 服务器直接从HTTP 请求中读取数据,并将其反射回HTTP 响应。在发生反射的XSS 利用情况时,攻击者会导致受害者向易受攻击的Web 应用程序提 供危险内容,然后该内容会反射回受害者并由Web 浏览器执行。传递恶意内容的常用机制是将其作为参数包含在公共发布或通过电子邮件直接发送给 受害者的URL 中。以此方式构造的URL 构成了许多网络钓鱼方案的核心,攻击者借此骗取受害者的信任,使其访问指向易受攻击的站点的URL。在站 点将攻击者的内容反射回受害者之后,受害者的浏览器将执行该内容。 类型2:存储的XSS(也称为“持久性”) 应用程序在数据库、消息论坛、访问者日志或其他可信数据存储器中存储危险数据。在以后某个时间,危险数据会读回到应用程序并包含在动态内容 中。从攻击者的角度来看,注入恶意内容的佳位置是向许多用户或特别感兴趣的用户显示的区域。感兴趣的用户通常在应用程序中具有较高的特权, 或者他们会与对攻击者有价值的敏感数据进行交互。如果其中某个用户执行恶意内容,那么攻击者有可能能够以该用户的身份执行特权操作,或者获 取对属于该用户的敏感数据的访问权。例如,攻击者可能在日志消息中注入XSS,而管理员查看日志时可能不会正确处理该消息。 类型0:基于DOM 的XSS 在基于DOM 的XSS 中,客户机执行将XSS 注入页面的操作;在其他类型中,注入操作由服务器执行。基于DOM 的XSS 中通常涉及发送到客户机的 由服务器控制的可信脚本,例如,在用户提交表单之前对表单执行健全性检查的Javascript。如果服务器提供的脚本处理用户提供的数据,然后将数据 注入回Web 页面(例如通过动态HTML),那么基于DOM 的XSS 有可能发生。以下示例显示了在响应中返回参数值的脚本。 参数值通过使用GET 请求发送到脚本,然后在HTML 中嵌入的响应中返回。 [REQUEST] GET /index.aspx?name=JSmith HTTP/1.1 [RESPONSE] HTTP/1.1 200 OK Server: SomeServer Date: Sun, 01 Jan 2002 00:31:19 GMT Content-Type: text/html Accept-Ranges: bytes Content-Length: 27 <HTML> Hello JSmith </HTML> 攻击者可能会利用类似以下情况的攻击: [ATTACK REQUEST] GET /index.aspx?name=>"'><script>alert('PWND')</script> HTTP/1.1 [ATTACK RESPONSE] HTTP/1.1 200 OK Server: SomeServer Date: Sun, 01 Jan 2002 00:31:19 GMT Content-Type: text/html Accept-Ranges: bytes Content-Length: 83 <HTML> Hello >"'><script>alert('PWND')</script> </HTML> 在这种情况下,JavaScript 代码将由浏览器执行(>"'> 部分在此处并不相关)。