Loading

DVWA 之 XSS(Stored) - 存储型XSS

XSS(Stored) - 存储型XSS

原理

存储型 XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方。

如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发执行代码,这种 XSS 比较危险,容易造成蠕虫,盗窃 cookie 等。

1. Low

Low 级别源码中相关函数介绍

trim(string, charlist)
函数移除字符串两侧的空白字符或其他预定义字符,可选参数 charlist 支持添加额外需要删除的字符,如果被省略,则移除以下所有字符
"\0"-NULL "\t"-制表符 "\n"-换行	"\x0B"-垂直制表符 "\r"-回车 " "-空格

mysql_real_escape_string(string, connection)
函数会对字符串中的特殊符号(\x00,\n,\r,\,',",\x1a)进行转义

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

漏洞利用

Low 级别的代码对输入的 message 和name 没有做 XSS 方面的过滤与检查,且存储在数据库中,因此存在明显的存储型 XSS 漏洞

输入 1 和 <script>alert('xss')</script>,代码成功执行

2. Medium

strip_tags():剥去字符串中的 HTML、XML、以及 PHP 的标签
addslashes():在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串
htmlspecialchars():把预定义的字符转换为 HTML 实体

Medium 级别的代码对 message 参数使用了 htmlspecialchars() 函数进行编码,因此无法通过 message 参数注入 XSS 代码,但是对于 name 参数,只是简单过滤了 <script>,可以使用大写或者双写绕过

漏洞利用

  • 大写绕过:抓包,将 name 参数值改为 <SCRIPT>alert('xss')</SCRIPT>
  • 双写绕过:抓包,将 name 参数值改为 <sc<script>ript>alert('xss')</script>

3. High

High 级别的代码使用正则表达式过滤了 <script> 标签,但是却忽略了 img、iframe 等其他危险的标签,因此 name 参数依旧存在存储型 XSS

漏洞利用

抓包,将 name 参数值改为 <img src=1 onerror=alert('xss')>,成功执行

防护方法

  1. HttpOnly 属性
  2. 输入检查,检查特殊字符,XSS 特征等
  3. 输出检查,对输出进行编码
posted @ 2023-03-05 16:20  紫曜花  阅读(147)  评论(0编辑  收藏  举报