XSS-labs

文章目录

    • 1.level1
    • 2.leve2
    • 3.leve3
    • 4.leve4
    • 5.leve5
    • **6.leve6**
    • **7.leve7**
    • **8.leve8**
    • **9.level9**
    • **10.leve10**
    • **11.level11**
    • **12.level12**
    • **13.level13**
    • **14.level14**
    • **15.level15**
    • **16.level16**
    • **17.level17**
    • **18.level18**
    • **19.level19**

大佬总结的xss的原理

1.level1

输入 < script>alert<\script>就通过了,这道题应该是反射型的xss,数据到了后端再回到浏览器

XSS-labs_第1张图片
为什么能够运行?
GET输入了name的参数,然后 PHP 会读取该参数,如果不为空,则直接打印出来,这里不存在任何过滤。也就是说,如果参数中存在 HTML 结构性的内容,打印之后会直接解释为 HTML 元素。
常见的xss攻击方法
html< script>标签
该标签常常用于引入js脚本
用法:
1.< script type="脚本的MIME类型>内容
2.< script type="脚本的MIME类型 src=“外部脚本语言地址”>
3.< script>内容

2.leve2

XSS-labs_第2张图片
htmlspecialchars()函数可以将特殊字符转义后输出于是我们的脚本就不能再用第一种了,不能执行了

htmlspecialchars默认配置是不过滤单引号的

所以可以使用单引号来绕过:
预定义的字符是:

& (和号)成为 & 默认
" (双引号)成为 "
’ (单引号)成为 ’
< (小于)成为 < 默认
> (大于)成为 > 默认

它的语法如下:
htmlspecialchars(string,flags,character-set,double_encode)
其中第二个参数flags需要重要注意,很多开发者就是因为没有注意到这个参数导致使用htmlspecialchars()函数过滤XSS时被绕过。因为flags参数对于引号的编码如下:

可用的引号类型:
ENT_COMPAT - 默认。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。

这里使用了这个函数,但是在input标签哪里没有对str参数进行转义,因此我们可以用"闭合input标签绕过

">

3.leve3

XSS-labs_第3张图片

看到input那里是’ “” ’ 这种我们可以闭合单引号来绕过:
在这里插入图片描述
而两次的htmlspecialchars函数就把<>给转义掉了,因此换一种方法:
1.'οnclick='alert(/xss/) 点击输入框就会触发
2.'οnmοuseοver='alert(/xss/) 鼠标移动到输入框触发
在这里插入图片描述

4.leve4

XSS-labs_第4张图片
可以看到过滤了<>,以及使用了htmlspecialchars
使用双引号绕过:
"οnclick="alert(/xss/)

5.leve5

XSS-labs_第5张图片
可以看到过滤了 payload:
">< a href=‘javascript:alert(/xss/)’>
XSS-labs_第6张图片
href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段

6.leve6

可以看到过滤了很多
XSS-labs_第7张图片
但是替换之前没有转换大小写,因此可以用大小写绕过
payload:
">< Script>alert(/xss/)
"> 在这里插入图片描述
XSS-labs_第8张图片
插入一个不存在的图片,然后调用onerror

7.leve7

XSS-labs_第9张图片
这一关不能进行大小写的绕过了,发现只是匹配了一次字符,因此可以使用双写绕过

payload:

”oonnclick=“alert(/xss/)

8.leve8

这道题考察了javascript伪协议
尝试输入JavaScript:alert(/xss/)发现不行
对这段代码进行Unicode编码:

javascript:alert(/xss/)

成功通过
XSS-labs_第10张图片
分析源代码,发现参数输入后将其替换成了,小写(strtolower函数),过滤了script,on,scr,data,href,”
编码绕过的方法

9.level9

XSS-labs_第11张图片
可以看到过滤策略还是跟8是一样的
XSS-labs_第12张图片
strpos() 函数查找字符串在另一字符串中第一次出现的位置。
可以看到我们输入的代码必须包含这个,payload:

javascript:alert(/xss/)//http://123.com

这里只编码了t使得代码更加简洁易懂

10.leve10

XSS-labs_第13张图片
可以看到要我们传入两个参数,其中第二个才有操作空间,过滤了<>,以及转义了特殊字符

t_sort="type="text" onclick="alert(/xss/)"

那么传入后的整体代码就应该是:

value="'" type = "text" onclick="alert(/xss/)" "type="hidden"

11.level11

这道题的注入点在refer:
XSS-labs_第14张图片
就可以注入了,type=’text‘的作用是让其出现一个文本框,方便点击

12.level12

XSS-labs_第15张图片
这道题的注入点在user-agent与10和11没有区别

13.level13

注入点在cookie:
XSS-labs_第16张图片

14.level14

15.level15

ng-include
XSS-labs_第17张图片
可以看到ng-include中有src,而这道题的注入点就是在这个地方
XSS-labs_第18张图片
payload:

?src='level1.php?name='

因为str被转义了所以直接输入注入代码是没用的,而这道题采用了本地包含的模式包含了level1的内容然后再由img标签传递src,还不是很懂,看网上说这个相当于include函数

16.level16

XSS-labs_第19张图片
查看元素发现有个img标签可以修改,然后就过了。。。

正常应该的做法:
可以看到,过滤了很多
XSS-labs_第20张图片
payload:

?keyword=

17.level17

XSS-labs_第21张图片
可以看到使用了embed标签,同时那两个参数都没有用什么特殊符号包裹起来

embed的语法格式:

这样我们就可以尝试在任意一个属性后面拼接 οnmοuseοver=alert(/xss/)
payload:

?arg01=a" onmouseover=alert(1)&arg02=b

18.level18

同17一样

19.level19

后面再来。。。。搞不懂了

你可能感兴趣的:(XSS-labs)