一个简单XSS攻击示例及处理

最近项目被第三方工具扫描出来有一个Http head xss cross scripting漏洞,为了修复这个,顺便研究了一下跨站脚本攻击的原理, 跨站脚本攻击基本上就是sql注入的html版, 核心内容就是把一段精心设计的脚本通过网页中的html漏洞由HTTP GET/POST传给服务器并执行. XSS主要有两种,一种是注入的链接需要骗人来点击,目的是劫持用户的cookie; 一种是该脚本已经通过此方法注入了DB,每次有人浏览正常的该网站链接都会执行该脚本,理论上java script能做的都可以做。

我这里有个简单示例,我的网页中由于需求需要判断客户端浏览器来启动对应版本的程序,所以JSP代码中有这一段:

 

<%
String sz = request.getHeader("user-agent");
...
%>
...
<script type="text/javascript">
var sz = "<%=sz%>";
...(sz.indexOf('Firefox/') != -1 ...) //此处省略,主要是判断HTTP HEAD的信息,取客户浏览器。
</script>

 这么一段简单的代码,就有漏洞。 我这里通过chrome正常获取的http head的头是这样的:

 

 

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36

 

所以var sz ="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36" 

 

 但客户端可以通过修改HTTP HEAD中由浏览器响应的正常属性达到注入目的。通过分析页面源码,可以构造一个字符串 ";alert(document.cookie);"


 最终页面代码就变成了:

<script type="text/javascript">
sz = "";alert(document.cookie);""
...
</script>

注入目的达成,如果有人点击了这个链接,可以进一步用脚本将用户的cookie发送给外网的其他服务器,劫持cookie。

 

解决的方法也比较简单,就是对用户传来的任何信息进行输入检查,如编码。 可以采用JDK的URLEncoder或apache commons的StringEscapeUtils 使script代码不能逃离我们限定的范围。我这里就是这样处理,将

request.getHeader("user-agent")

 

改成

URLEncoder.encode(request.getHeader("user-agent"))

 

最终就算html注入进来,结果也变成了:

sz = "%22%3Balert%28document.cookie%29%3B%22";

该脚本无法成为可执行脚本。

 

 

本文出自 “祝坤荣” 博客,请务必保留此出处

时间: 2024-09-18 13:37:06

一个简单XSS攻击示例及处理的相关文章

PHP写的一个简单的cache示例

一个简单的cache示例(不过太简单了一些!) ?// 首先创建"cache"目录 ,用来写文件 function BZ_cache ($url,$cacheName)?? { global $cache ;?? global $QUERY_STRING ; // 这里你可以按自己的习惯命名?? $filename = "cache/".$cacheName.",".$QUERY_STRING.".HTML" ; // 这里你

[MySQL5.6] 一个简单的optimizer_trace示例

前面已经介绍了如何使用和配置MySQL5.6中optimizer_trace(点击博客),本篇我们以一个相对简单的例子来跟踪optimizer_trace的产生过程. 本文的目的不是深究查询优化器的实现,只是跟踪optimizer trace在优化器的那一部分输出,因此很多部分只是一带而过,对于需要深究的部分,暂时标注为红色,后续再扩展阅读;之前一直没看过这部分代码,理解起来还是比较困难的- 我们以一个简单的表为例过一下optimizer trace的产生过程: mysql> show crea

一个简单的cache示例(不过太简单了一些!)

cache|示例  // 首先创建"cache"目录 ,用来写文件 function BZ_cache ($url,$cacheName)  { global $cache ;  global $QUERY_STRING ; // 这里你可以按自己的习惯命名   $filename = "cache/".$cacheName.",".$QUERY_STRING.".html" ; // 这里你还应该测试一下文件的时间,看是否过

一个简单MVC5 + EF6示例分享_实用技巧

本文所使用的软件及环境: Visual Studio Ultimate 2013; MVC5 + EF6 + .NET Framework 4.5 + LocalDB;Windows 7 x64 Professional 说明: 1.在EF (Entity Framework,以下简称EF6)框架下,操作数据的方式有三种:Database First, Model First, 以及 Code First,本文基于Code First创建. 2.本文是基于MVC5创建: 3.LocalDB Lo

一个简单的storyboard示例,其中关于添加navigation的部分可以学习,此前没用过

到storyboard选中我们唯一一个的viewcontroller,找到xcode的菜单栏,Edit->Embed In->NavigationController.这时候storyboard会自动为你生成一个navigationController,并且讲viewcontroller当做rootViewcontroller. http://www.cocoachina.com/ios/20150330/11440.html

SharePoint 2010 ECMAScript客户端模型的一个简单示例

ECMAScript客户端模型,是SharePoint2010推出的三种客户端模型".NET托管"."ECMAScript"."Sliverlight"的一种,今天正好看到这,尝试了下,也拿出了和大家分享下.我自己感觉,客户端模型,和sp的对象模型没有太多区别,就是用起来,更加不得心应手了.今天写了下Script的,各种不好使,各种没调试,各种郁闷,哎.怎的一个愁字了得.好了,不费话了. 客户端对象模型的优点,就是可以在没有服务器的条件下,进行客

php预防XSS攻击,ajax跨域攻击的方法

对网站发动XSS攻击的方式有很多种,仅仅使用php的一些内置过滤函数是对付不了的,即使你将filter_var,mysql_real_escape_string,htmlentities,htmlspecialchars,strip_tags这些函数都使用上了也不一定能保证绝对的安全. 现在有很多php开发框架都提供关于防XSS攻击的过滤方法,下面和大家分享一个预防XSS攻击和ajax跨域攻击的函数,摘自某开发框架,相比于仅仅使用内置函数应该还是够强了的吧. function xss_clean

ZenTaoPHP部署框架自带的简单的blog示例

ZenTaoPHP框架中自带了一个简单的blog示例,下面让我们来部署这个示例应用. 一.创建数据库 在app/demo/db目录下面,有一个blog.sql.这是一个非常简单的表结构,使用phpmyadmin,或者是命令行的mysql工具,创建一个数据库,叫做blog,然后把这个sql文件里面的建表工具导入. $> mysql -u root -p $> create database blog;   二.创建应用的配置文件 在我们的代码中,已经内置了一个config.php文件,可以直接修

Windows 8 Store Apps学习(64) 后台任务: 开发一个简单的后台任务

介绍 重新想象 Windows 8 Store Apps 之 后台任务 开发一个简单的后台任务 示例 1.通过"Windows 运行时组件"新建一个后台任务 BackgroundTaskLib/Demo.cs /* * 后台任务 * * 注: * 后台任务项目的输出类型需要设置为"Windows 运行时组件",其会生成 .winmd 文件,winmd - Windows Metadata */ using System; using System.Threading