概述
上篇介绍了DVWA通关指南-XSS(Reflect)-反射性xss,本篇开始介绍储存型跨站脚本攻击。
就是被后台进行了持久化处理。再次访问的时候会被调用执行
三种xss区别
存储型XSS:你发送一次带XSS代码的请求,以后这个页面的返回包里都会有XSS代码;
反射型XSS:你发送一次带XSS代码的请求,只能在当前返回的数据包中发现XSS代码;
DOM型XSS:你发送一次带XSS代码的请求,在返回包里压根儿就找不到XSS代码的影子
安全等级为Low
源码分析
trim(string,charlist)
:移除字符串两侧的空白字符或其他预定义字符,预定义字符包括、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符;mysql_real_escape_string(string,connection)
:对字符串中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义;stripslashes(string)
:删除字符串中的反斜杠。
从源码中可以看到,对输入的name参数和message参数并没有做XSS方面的过滤与检查,并且数据存储在数据库中,所以存在明显的存储型XSS漏洞;
开始攻击
- message输入:
<script>alert('XSS')</script>
,点击sign按钮,出现弹框
安全等级为Meduim
清空数据后,然后把low的攻击代码提交后,不成功
源码分析
由于对message参数使用了htmlspecialchars函数进行编码,因此无法再通过message参数注入XSS代码;
但是对于name参数,这里是基于黑名单的思想,使用str_replace函数将输入中的script删除,把script脚本当做字符串来处理;仍然存在存储型的XSS。
开始攻击
- 修改name的长度为100
name输入<img src=x onerror=alert(1)>
,message攻击失败
每次打开这个页面,都会出现弹框
当然还可以尝试,大写绕过:
<ScRipt>alert(1)<ScRipt>
和双写绕过:<scr<script>ipt>alert(1)</script>
等
安全等级为High
源码分析
都用到了preg_replace()函数,它彻底的过滤了<script></script>
,不能绕过,同时针对于message模块,也有相当强大的过滤策略,message不存在存储型XSS漏洞
开始攻击
采用安全等级为meduim一样的方式,name输入: <img src=x onerror=alert(1)>
,img调用图片,src所描述路径不存在,会导致onerror执行,从而时alert(1)函数触发,回显1
安全等级为impossible
源码分析
- 在impossible等级下,针对于message与name模块都使用
stripslashes()
、mysql_real_escape_string()
、以及htmlspecialchars()
函数 - 并且对于已经存在的xss数据,当前页面也会过滤,如果是低,中,高的安全等级对于已经存在的xss,再次打开页面时,会弹出提示框
本文操作步骤主要来自这里