0%

DVWA通关指南-XSS(Stored)

概述

三种xss区别

  • 存储型XSS:你发送一次带XSS代码的请求,以后这个页面的返回包里都会有XSS代码;

  • 反射型XSS:你发送一次带XSS代码的请求,只能在当前返回的数据包中发现XSS代码;

  • DOM型XSS:你发送一次带XSS代码的请求,在返回包里压根儿就找不到XSS代码的影子

安全等级为Low

image-20220214162317853

源码分析

  • trim(string,charlist):移除字符串两侧的空白字符或其他预定义字符,预定义字符包括、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符;

  • mysql_real_escape_string(string,connection):对字符串中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义;

  • stripslashes(string):删除字符串中的反斜杠。

从源码中可以看到,对输入的name参数和message参数并没有做XSS方面的过滤与检查,并且数据存储在数据库中,所以存在明显的存储型XSS漏洞;

image-20220214162356195

开始攻击

  • message输入: <script>alert('XSS')</script>,点击sign按钮,出现弹框

image-20220214162716214

image-20220214162838286

安全等级为Meduim

清空数据后,然后把low的攻击代码提交后,不成功

image-20220214164219024

源码分析

  • 由于对message参数使用了htmlspecialchars函数进行编码,因此无法再通过message参数注入XSS代码;

  • 但是对于name参数,这里是基于黑名单的思想,使用str_replace函数将输入中的script删除,把script脚本当做字符串来处理;仍然存在存储型的XSS。

image-20220214164518016

开始攻击

  • 修改name的长度为100

image-20220214171718344

name输入<img src=x onerror=alert(1)>message攻击失败

image-20220214171810074

image-20220214171845355

  • 每次打开这个页面,都会出现弹框

  • 当然还可以尝试,大写绕过:<ScRipt>alert(1)<ScRipt>和双写绕过:<scr<script>ipt>alert(1)</script>

安全等级为High

源码分析

都用到了preg_replace()函数,它彻底的过滤了<script></script>,不能绕过,同时针对于message模块,也有相当强大的过滤策略,message不存在存储型XSS漏洞

image-20220214172543801

开始攻击

采用安全等级为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,再次打开页面时,会弹出提示框

image-20220214172949782

本文操作步骤主要来自这里