目录
DVWA-XSS 级别通关详解
low级别
1.反射性xss
源码
没有任何过滤、只是将表单的输入打印出来,那就意味着我们也可以输入JavaScript脚本,来执行
payload:<script>alert(/xss/)</script>
2.存储型xss
源码
用到了这三个函数
trim(string,charlist) 函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符。 mysql_real_escape_string(string,connection) 函数会对字符串中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义。 stripslashes(string) 函数删除字符串中的反斜杠。 没有对<script>脚本进行过滤
payload:<script>alert(1)</script>
若要选择在第一个框进行插入,插入内容有长度限制,需要选择开发者工具,检查源代码,找到对应的语句,修改长度限制。
也可以通过burpsuite抓包进行修改,再输入即可。
3.DOM型xss
源码同样没有过滤
直接在网页上修改下拉框上传参数的值
Medium级别
1.反射型xss
源码:
可以看到使用了str_replace()函数将<script>替换成空
但是可以轻松绕过
payload:
<sc<script>ript>alert(/xss/)</script> 双写绕过
<ScRipt>alert(/xss/)</script> 大写小绕过
2.存储型xss
3.DOM型xss
我们发现在这个里面再一次对<script>标签进行了替换,我们接下来检查前端html语句。
value的值是从这个个当中选出来的,那么我们可以通过构造闭合来执行我们的语句。
把english替换成></option></select><img src=1 οnerrοr=alert(/xss)>
那么这个语句是怎么闭合的呢
></select><img src=1 οnerrοr=alert(/xss/)>
学过html语言的我们都知道<option></select>都是双标签,也就是说会识别两个标签之间的语句,那么我们就人为把它闭合起来,在执行过程中,一旦存在一对标签,那么就会执行这里面的语句,无法构成成对标签的不会执行里面的语句,而<img>是单标签,也就是说他要执行的语句涵盖在它里面。>闭合前面<option
修改url中的值即可
hight级别
1.反射型xss
源码:
查看源代码,使用正则函数preg_replace进行了更严格的过滤,此时script标签已经没法再用了,那么我们使用别的标签也可以达到我们的目的。
以通过img、body等标签的事件或者iframe等标签的src注入恶意的js代码。
这里我们可以用到<img src="" οnerrοr=alert(1)>
2.存储型xss
这里使用正则表达式过滤了<script>标签,但是却忽略了img、body、iframe等其它危险的标签,因此name参数依旧存在存储型XSS。Burpsuite抓包改name参数为<img src=1 οnerrοr=alert(1)>
判断defalut值是否为空,如果不为空的话,再用switch语句进行匹配,如果匹配成功,则插入case字段的相应值,如果不匹配,则插入的是默认的值。这样的话,我们的语句就没有可能插入到页面中了,这样即便我们构造了语句在访问后也没有用。
这里我们可以利用url中 # 号的特殊性,URL中 # 号之后的内容,不会被提交到服务器,可以直接与浏览器进行交互。因此我们在 # 后构造语句
#></option></select><img src=1 οnerrοr=alert(1)>(#号前加一个空格)
3.DOM型xss
源码:
一个白名单,只允许default的值为:French/Enginsh/German/Spanish
利用:
由于 form表单提交的数据 想经过JS 过滤 所以注释部分的javascript 代码 不会被传到服务器端(也就符合了白名单的要求)
payload:
#<script>alert(/xss/)</script> 或者存储型hight的payload
Impossible级别
1.反射型xss
源码:
htmlspecialchars函数,将预定义字符转换成HTML实体,防止浏览器将其作为HTML的元素、检查了用户token
2.存储型xss
源码:
通过使用htmlspecialchars函数,解决了XSS
3.DOM型xss
源码:
不需要做任何的事情,在客户端处理。